私は、エンティティCustomer
とエンティティTicket
持っています。二つの「一対一」の関係は、
Customer
は、二つの異なるチケットを持つことができます。 ownTicket
とrefererTicket
:私はチケットのCustomer
エンティティに2つの異なるフィールドを持っている必要がありますので、チケットとOneToMany
関係のList
が、そこには適していません。この関係を実現するのを手伝ってください。どのようにそれを行うことができますか?
私は、エンティティCustomer
とエンティティTicket
持っています。二つの「一対一」の関係は、
Customer
は、二つの異なるチケットを持つことができます。 ownTicket
とrefererTicket
:私はチケットのCustomer
エンティティに2つの異なるフィールドを持っている必要がありますので、チケットとOneToMany
関係のList
が、そこには適していません。この関係を実現するのを手伝ってください。どのようにそれを行うことができますか?
あなたは@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
問題は何ですか?
class Costumer {
@OneToOne
Ticket ownTicket;
@OneToOne
Ticket refererTicket;
}
ちょうど別の名前を付ける:あなたがそうのように、2一対一の関係を持つことができ
public class Customer{
....
@OneToOne
Ticket ownTicket;
@OneToOne
Ticket refererTicket;
....
}
チケットクラスには1つのフィールドCustomerしかありませんか? 2つではない? – Yuriy
あなたが必要とするのは、OneToManyの2つの制限があります。 – granmirupa
:
あなたは簡単に、顧客を作成することができます。そして、あなたは両方の方法をマップしたいならばチケットクラスでは、私はあなたがmappedByプロパティを使用する必要が信じている:チケットは唯一の貸衣装を持っていることができれば
class Ticket {
@OneToOne(mappedBy="ownTicket")
Costumer owner;
@OneToOne(mappedBy="refererTicket")
Costumer referer;
}
、これは私がどうなるのかです:
リレーションシップクラスを作成し、TicketCostumer
か何かと呼ばれる:
class TicketCostumer {
@OneToOne
Ticket ticket;
@ManyToOne
Costumer costumer;
Type type;
}
。
今、各チケットは、これの一つだけ持つことができます。
をそして最後に、貸衣装の上に、あなたは物事をどのように処理するかを決めることができます。あなたはリストを持っていて、各種類のものが2つ以上あることを手で保証することができます(または@UniqueByなどを使用しようとする)か、それを制御するために2つの分離したフィールドを持つことができます。
しかし、チケットには1つの顧客フィールドしかないので、1つのチケットは1つの顧客にしかマッピングできませんが、顧客は2つの異なるチケットを持つことができます – Yuriy
@Yuriyこの場合を考慮して1つのチケットにオーナーとリファラーの両方がいると思った。しかし、それは両方のどちらかを持つことはできないようですので、私は更新しました。 –
まさにあなたの問題は何ですか?独自のJoinColumn/FKで2つの異なるフィールドを使用するだけで、このトリックを実行する必要があります。 –