我有实体Customer
和实体Ticket
。
Customer
可以有两张不同的门票。 List
门票与OneToMany
关系不合适,因为Customer
实体中我应该有两个不同的字段用于门票:ownTicket
和refererTicket
。请帮我实现这种关系。怎么做?
答案 0 :(得分:2)
你可以有两个一对一的关系,如下:
class Costumer {
@OneToOne
Ticket ownTicket;
@OneToOne
Ticket refererTicket;
}
只是给出不同的名字。然后,在Ticket类中,如果你想要两种方式映射,我相信你必须使用mappedBy属性:
class Ticket {
@OneToOne(mappedBy="ownTicket")
Costumer owner;
@OneToOne(mappedBy="refererTicket")
Costumer referer;
}
如果Ticket只有一个Costumer,那么这就是我要做的事情:
创建一个名为TicketCostumer
的关系类:
class TicketCostumer {
@OneToOne
Ticket ticket;
@ManyToOne
Costumer costumer;
Type type;
}
如果Type是您创建的具有OWNER和REFERER的枚举;
现在每张票只能有一张:
class Ticket {
@OneToOne
CostumerTicket ct;
}
最后,在Costumer上,您可以决定如何处理事情;您可以手动列出并保证每种类型不超过一种(或尝试使用@UniqueBy或类似的东西),或者您可以有两个独立的字段来控制它。
答案 1 :(得分:2)
您应该将其映射为@OneToMany
,但隐藏此实现细节。这可能如下所示:ticket有一个额外的列指示其类型。
@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);
}
}
答案 2 :(得分:1)
有什么问题?
您可以轻松地将客户创建为:
public class Customer{
....
@OneToOne
Ticket ownTicket;
@OneToOne
Ticket refererTicket;
....
}