と の 2 つのエンティティがUserAccount
ありNotification
ます。これらには下図のような関係があります。
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
}
equals()
との両方hashcode()
がオーバーライドされます (ビジネス キー/主キーを使用して IDE によって生成されます)。
を指定するとUserAccount
、最初の を追加するNotification
と、INSERT ステートメントになります。しかし、同じ をさらに追加するとUserAccount
、最初に削除してから挿入します。
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
同じことがすべてで起こりますUserAccount
。を に置き換えるList
とSet
、通常の INSERT が発生します。このドキュメントとブログを読んだ後、理由がわかりました。
ドキュメントからの観察
- 一方向の
@OneToMany
関連付けでは、Set
が優先されます。
Collections
要素を追加、削除、および更新するという点で、インデックスが作成され、Sets
最も効率的な操作が可能であることは明らかです。
- 双方向の
@OneToMany
関係(@ManyToOne
管理)で、List
効率Bags
的です。
Bags
とLists
は最も効率的な逆関数Collections
です。
そうは言っても、どちらがより好ましいですか:
単方向マッピングで a
Set
を超えていますか?List
@OneToMany
List
または、特に重複がある場合、を使用するために双方向の関係を追加してドメイン モデルを微調整する必要がありますか?