私は2つのエンティティUSERとNOTIFICATIONがあるとします。そして私は以下のような関係を持っています。JPA OneToMany:List vs Set
public class UserAccount{
@Id
@Column(name = "USER_NAME")
private String emailid;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "USERS_NOTIFICATIONS", joinColumns = { @JoinColumn(name = "USER_NAME") }, inverseJoinColumns = { @JoinColumn(name = "NOTIFICATION_ID") })
private List<Notification> notifications;
//setters, getter, equals and hashcode
}
私は(IDEが私のビジネスキー/主キーと生成される)のequalsとhashCodeをオーバーライドしています。最初の通知を追加すると、通常の挿入ステートメントが取得されます。しかし、同じユーザーに対してさらに追加すると、削除してから挿入します。これはログです:
Hibernate: delete from USERS_NOTIFICATIONS where USER_NAME=?
Hibernate: insert into USERS_NOTIFICATIONS (USER_NAME, NOTIFICATION_ID) values (?, ?)
Hibernate: insert into USERS_NOTIFICATIONS (USER_NAME, NOTIFICATION_ID) values (?, ?)
Hibernate: insert into USERS_NOTIFICATIONS (USER_NAME, NOTIFICATION_ID) values (?, ?)
//as many inserts as the notifications the user has
すべてのユーザーに同じことが起こります。今、ListをSetと置き換えると、通常の挿入が行われます。そして、私はdoucmentationとblogを読んだ後に理由を見つけました。一方向OneToManyアソシエーションセット内のドキュメント
- から
観測が好ましいです。
インデックス付きコレクションとセットは要素の追加、削除、更新するという点で、最も効率的な動作を許可することは明らかです。双方向OneToMany関係(ManyToOne管理)一覧やバッグに
- が効率的です。
バッグやリスト、最も効率的な逆のコレクションです質問
- の
のカップルは、この平均は私が(単方向OneToManyマッピングでリスト上の設定を好む持っていますかなり明らかだけど)?しかし、回避策はありますか?
注文したいときにListを使い、そうでないときはSetを使うと思っていました。任意の永続性ソリューションに関係なく、モデル化する必要があるものに基づいてモデルを選択します。どの永続性ソリューションでもどちらかを処理できなければならない – DataNucleus
@DataNucleus:誰もそれを考えていました。 Hibernateが単方向マップへの効率的な追加を効率的に処理するとも考えていました。ある時には、考えが間違っていることが分かりました! –
@DataNucleas:それもそうだと思っていましたが、上記の問題を抱えてドキュメンテーションを見て、それ以上のことを見つけました。 – shazinltc