と の 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@OneToManyListまたは、特に重複がある場合、を使用するために双方向の関係を追加してドメイン モデルを微調整する必要がありますか?