2017-04-21 100 views
-1

我有實體Customer和實體Ticket兩個類別之間的兩個「一對一」關係

Customer可以有兩張不同的門票。 List的門票和OneToMany的關係並不適合,因爲我應該在Customer門票的實體中有兩個不同的字段:ownTicketrefererTicket。請幫我實施這種關係。如何做到這一點?

+1

究竟是什麼問題?只用兩個不同的領域與他們自己的JoinColumn/FK應該做的伎倆。 –

回答

2

您應該將其映射爲@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); 
    } 
} 
+0

這是非常酷的解決方案!非常感謝你!我真的很感激這:) – Yuriy

1

什麼問題?

您可以輕鬆創建以顧客爲:

public class Customer{ 
    .... 
    @OneToOne 
    Ticket ownTicket; 

    @OneToOne 
    Ticket refererTicket; 
    .... 
} 
+0

而Ticket類將只有一個字段Customer?不是兩個? – Yuriy

+0

所以你需要的是一個OneToMany的限制爲兩個...... – granmirupa

2

您可以有兩個一對一的關係,像這樣:

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或類似的東西),或者你可以有兩個分隔的字段來控制它。

+0

但票務應該只有一個客戶字段,一張票可以只映射到一個客戶,但客戶可以有兩個不同的票 – Yuriy

+0

@Yuriy我取消了我的答案考慮這種情況。我以爲一張票可以有一個老闆和一個參考人。但它似乎可以但不是兩個,所以我更新了。 –

相關問題