两个 类 之间的两个 "One to One" 关系
Two "One to One" relationships between two classes
我有实体 Customer
和实体 Ticket
。
Customer
可以有两张不同的票。 List
of Tickets 和 OneToMany
关系不适合那里,因为我应该在 Customer
实体中有两个不同的字段用于票证:ownTicket
和 refererTicket
。请帮我实现这个关系。怎么做到的?
有什么问题?
您可以轻松地将客户创建为:
public class Customer{
....
@OneToOne
Ticket ownTicket;
@OneToOne
Ticket refererTicket;
....
}
你可以有两个一对一的关系,像这样:
class Costumer {
@OneToOne
Ticket ownTicket;
@OneToOne
Ticket refererTicket;
}
只是给不同的名字。然后,在 Ticket class 中,如果你想双向映射,我相信你必须使用 mappedBy 属性:
class Ticket {
@OneToOne(mappedBy="ownTicket")
Costumer owner;
@OneToOne(mappedBy="refererTicket")
Costumer referer;
}
如果Ticket只能有一个Costumer,那么我会这样做:
创建关系 class,称为 TicketCostumer
或其他名称:
class TicketCostumer {
@OneToOne
Ticket ticket;
@ManyToOne
Costumer costumer;
Type type;
}
其中 Type 是您创建的具有 OWNER 和 REFERER 的枚举;
现在每张票只能有一张:
class Ticket {
@OneToOne
CostumerTicket ct;
}
最后,在 Costumer 上,您可以决定如何处理事情;您可以有一个列表并手动保证每种类型不超过一个(或尝试使用 @UniqueBy 或类似的东西),或者您可以有两个单独的字段来控制它。
您应该将其映射为 @OneToMany
但隐藏此实现细节。这可能如下所示:票证有一个额外的列指示其类型。
@Entity
public class Customer {
@OneToMany
@JoinColumn(name = "customer_id")
@MapKeyColumn(name = "ticket_type")
@MapKeyEnumerated(EnumType.String)
private Map<TicketType, Ticket> tickets;
// we will not expose the tickets collection
// the fact it is a @OneToMany is then transparent to all client code
public Ticket getOwnTicket(){
return tickets.get(TicketType.O);
}
public Ticket getReferrerTicket(){
return tickets.get(TicketType.R);
}
public void setOwnTicket(Ticket ticket){
//ticket.setType(TicketType.O); //may not be required
tickets.put(TicketType.O, ticket);
}
public void setReferrerTicket(Ticket ticket){
//ticket.setType(TicketType.R); //may not be required
tickets.put(TicketType.R, ticket);
}
}
我有实体 Customer
和实体 Ticket
。
Customer
可以有两张不同的票。 List
of Tickets 和 OneToMany
关系不适合那里,因为我应该在 Customer
实体中有两个不同的字段用于票证:ownTicket
和 refererTicket
。请帮我实现这个关系。怎么做到的?
有什么问题?
您可以轻松地将客户创建为:
public class Customer{
....
@OneToOne
Ticket ownTicket;
@OneToOne
Ticket refererTicket;
....
}
你可以有两个一对一的关系,像这样:
class Costumer {
@OneToOne
Ticket ownTicket;
@OneToOne
Ticket refererTicket;
}
只是给不同的名字。然后,在 Ticket class 中,如果你想双向映射,我相信你必须使用 mappedBy 属性:
class Ticket {
@OneToOne(mappedBy="ownTicket")
Costumer owner;
@OneToOne(mappedBy="refererTicket")
Costumer referer;
}
如果Ticket只能有一个Costumer,那么我会这样做:
创建关系 class,称为 TicketCostumer
或其他名称:
class TicketCostumer {
@OneToOne
Ticket ticket;
@ManyToOne
Costumer costumer;
Type type;
}
其中 Type 是您创建的具有 OWNER 和 REFERER 的枚举;
现在每张票只能有一张:
class Ticket {
@OneToOne
CostumerTicket ct;
}
最后,在 Costumer 上,您可以决定如何处理事情;您可以有一个列表并手动保证每种类型不超过一个(或尝试使用 @UniqueBy 或类似的东西),或者您可以有两个单独的字段来控制它。
您应该将其映射为 @OneToMany
但隐藏此实现细节。这可能如下所示:票证有一个额外的列指示其类型。
@Entity
public class Customer {
@OneToMany
@JoinColumn(name = "customer_id")
@MapKeyColumn(name = "ticket_type")
@MapKeyEnumerated(EnumType.String)
private Map<TicketType, Ticket> tickets;
// we will not expose the tickets collection
// the fact it is a @OneToMany is then transparent to all client code
public Ticket getOwnTicket(){
return tickets.get(TicketType.O);
}
public Ticket getReferrerTicket(){
return tickets.get(TicketType.R);
}
public void setOwnTicket(Ticket ticket){
//ticket.setType(TicketType.O); //may not be required
tickets.put(TicketType.O, ticket);
}
public void setReferrerTicket(Ticket ticket){
//ticket.setType(TicketType.R); //may not be required
tickets.put(TicketType.R, ticket);
}
}