我有實體Customer
和實體Ticket
。兩個類別之間的兩個「一對一」關係
Customer
可以有兩張不同的門票。 List
的門票和OneToMany
的關係並不適合,因爲我應該在Customer
門票的實體中有兩個不同的字段:ownTicket
和refererTicket
。請幫我實施這種關係。如何做到這一點?
我有實體Customer
和實體Ticket
。兩個類別之間的兩個「一對一」關係
Customer
可以有兩張不同的門票。 List
的門票和OneToMany
的關係並不適合,因爲我應該在Customer
門票的實體中有兩個不同的字段:ownTicket
和refererTicket
。請幫我實施這種關係。如何做到這一點?
您應該將其映射爲@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);
}
}
這是非常酷的解決方案!非常感謝你!我真的很感激這:) – Yuriy
什麼問題?
您可以輕鬆創建以顧客爲:
public class Customer{
....
@OneToOne
Ticket ownTicket;
@OneToOne
Ticket refererTicket;
....
}
而Ticket類將只有一個字段Customer?不是兩個? – Yuriy
所以你需要的是一個OneToMany的限制爲兩個...... – granmirupa
您可以有兩個一對一的關係,像這樣:
class Costumer {
@OneToOne
Ticket ownTicket;
@OneToOne
Ticket refererTicket;
}
只要給不同的名稱。然後,在票務類,如果你想兩者兼得映射,我相信你必須使用mappedBy屬性:
class Ticket {
@OneToOne(mappedBy="ownTicket")
Costumer owner;
@OneToOne(mappedBy="refererTicket")
Costumer referer;
}
如果門票只能有一個負荷消費,那麼這就是我會做什麼:
創建一個關係類,稱爲TicketCostumer
什麼:
class TicketCostumer {
@OneToOne
Ticket ticket;
@ManyToOne
Costumer costumer;
Type type;
}
其中Type是您創建一個枚舉具有所有者和REFERER;
現在每張票只能有這一個:
終於在負荷消費,你可以決定如何處理事情;你可以有一個列表,並保證每個類型不超過一個(或者嘗試使用@UniqueBy或類似的東西),或者你可以有兩個分隔的字段來控制它。
但票務應該只有一個客戶字段,一張票可以只映射到一個客戶,但客戶可以有兩個不同的票 – Yuriy
@Yuriy我取消了我的答案考慮這種情況。我以爲一張票可以有一個老闆和一個參考人。但它似乎可以但不是兩個,所以我更新了。 –
究竟是什麼問題?只用兩個不同的領域與他們自己的JoinColumn/FK應該做的伎倆。 –