2017-04-21 11 views
-1

私は、エンティティCustomerとエンティティTicket持っています。二つの「一対一」の関係は、

Customerは、二つの異なるチケットを持つことができます。 ownTicketrefererTicket:私はチケットのCustomerエンティティに2つの異なるフィールドを持っている必要がありますので、チケットとOneToMany関係のListが、そこには適していません。この関係を実現するのを手伝ってください。どのようにそれを行うことができますか?

+1

まさにあなたの問題は何ですか?独自のJoinColumn/FKで2つの異なるフィールドを使用するだけで、このトリックを実行する必要があります。 –

答えて

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

問題は何ですか?

class Costumer { 
    @OneToOne 
    Ticket ownTicket; 

    @OneToOne 
    Ticket refererTicket; 
} 

ちょうど別の名前を付ける:あなたがそうのように、2一対一の関係を持つことができ

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

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

チケットクラスには1つのフィールドCustomerしかありませんか? 2つではない? – Yuriy

+0

あなたが必要とするのは、OneToManyの2つの制限があります。 – granmirupa

2

あなたは簡単に、顧客を作成することができます。そして、あなたは両方の方法をマップしたいならばチケットクラスでは、私はあなたがmappedByプロパティを使用する必要が信じている:チケットは唯一の貸衣装を持っていることができれば

class Ticket { 
    @OneToOne(mappedBy="ownTicket") 
    Costumer owner; 

    @OneToOne(mappedBy="refererTicket") 
    Costumer referer; 
} 

、これは私がどうなるのかです:

リレーションシップクラスを作成し、TicketCostumerか何かと呼ばれる:

タイプは、あなたがそれがOWNERとREFERERを持って作成列挙です
class TicketCostumer { 
    @OneToOne 
    Ticket ticket; 

    @ManyToOne 
    Costumer costumer; 

    Type type; 
} 

今、各チケットは、これの一つだけ持つことができます。

をそして最後に、貸衣装の上に、あなたは物事をどのように処理するかを決めることができます。あなたはリストを持っていて、各種類のものが2つ以上あることを手で保証することができます(または@UniqueByなどを使用しようとする)か、それを制御するために2つの分離したフィールドを持つことができます。

+0

しかし、チケットには1つの顧客フィールドしかないので、1つのチケットは1つの顧客にしかマッピングできませんが、顧客は2つの異なるチケットを持つことができます – Yuriy

+0

@Yuriyこの場合を考慮して1つのチケットにオーナーとリファラーの両方がいると思った。しかし、それは両方のどちらかを持つことはできないようですので、私は更新しました。 –

関連する問題