假設我有兩個實體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
}
我重寫了equals和hashcode(使用我的業務鍵/主鍵生成的IDE)。說我有用戶A.當我添加第一個通知時,我得到一個正常的插入語句。但是對於同一用戶的進一步添加,它會刪除並插入。這是日誌:
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
同樣的事情發生在每個用戶。現在,如果我用Set來替換列表,就會發生普通插入。我在閱讀doucmentation和blog後找到原因。從文檔
- 在單向一對多關聯集
觀察是優選的。
它應該清楚的是索引的集合和集合允許在增加,刪除和修改元素中最有效的操作。
- 在雙向一對多關係(多對一管理)列表和包是有效的。
Bag和list是最有效的逆集合
幾個問題
- 這是否意味着我必須喜歡設置了一個列表,單向一對多映射(雖然很明顯)?但有沒有解決辦法?
- 或者我必須調整我的域名,使其成爲雙向關係才能使用列表,尤其是當我有重複項目時。
有人會想你在訂購時使用List,當你不需要時使用Set;根據需要建模的內容選擇您的模型......不考慮任何持久性解決方案。任何持久性解決方案應該能夠處理任何 – DataNucleus
@DataNucleus:人們會認爲這一點。人們也會認爲Hibernate會有效地處理添加到單向映射。人有時會發現那些想法被誤導了! –
@DataNucleas:即使我認爲是這樣,但在得到我上面提到的問題並且通過文檔之後,我發現它不止於此。 – shazinltc