[英]Hibernate - how to use cascade in relations correctly
我在我的 spring mvc 應用程序中使用 hibernate 並且對級聯有疑問。 我看到很多類似的問題,但沒有一個能回答我的問題。 假設我有User
和UserPosition
對象。 User
有一組UserPosition
,也有一個UserPosition
,默認為 position。結構如下所示:
用戶:
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private Collection<UserPosition> userPositionCollection;
public Collection<UserPosition> getUserPositionCollection() {
return userPositionCollection;
}
public void setUserPositionCollection(Collection<UserPosition> collection) {
this.userPositionCollection = collection;
}
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "default_User_Position_ID", referencedColumnName = "id")
private UserPosition defaultUserPosition;
public UserPosition getDefaultUserPosition() {
return defaultUserPosition;
}
public void setDefaultUserPosition(UserPosition defaultUserPosition) {
this.defaultUserPosition = defaultUserPosition;
}
用戶職位:
@JoinColumn(name = "user_id", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@OneToOne(fetch = FetchType.LAZY, mappedBy = "defaultUserPosition", cascade = CascadeType.PERSIST)
private User defaultUserPosition;
public User getDefaultUserPosition() {
return defaultUserPosition;
}
public void setDefaultUserPosition(User defaultUserPosition) {
this.defaultUserPosition = defaultUserPosition;
}
現在,我的問題是使用級聯保存相關對象的最佳做法是什么? . 事實上,我對這三種解決方案感到困惑:
解決方案 1:
User user = new User();
//some setters and getters
UserPosition userPosition = new UserPosition();
//some setters and getters
List<UserPosition> positionList = new ArrayList<>();
positionList.add(userPosition);
user.setDefaultUserPosition(userPosition);
user.setUserPositionCollection((Collection<UserPosition>) positionList );
session.persist(user)
解決方案 2:
User user = new User();
//some setters and getters
UserPosition userPosition = new UserPosition();
//some setters and getters
userPosition.setUser(user);
userPosition.setDefaultUserPosition(user);
session.persist(userPosition)
解決方案 3(前面兩個解決方案的組合):
User user = new User();
//some setters and getters
UserPosition userPosition = new UserPosition();
//some setters and getters
List<UserPosition> positionList = new ArrayList<>();
positionList.add(userPosition);
user.setDefaultUserPosition(userPosition);
user.setUserPositionCollection((Collection<UserPosition>) positionList );
userPosition.setUser(user);
userPosition.setDefaultUserPosition(user);
session.persist(user);
這對我來說很重要,所以請幫助我。 哪個解決方案是正確的, cascade
屬性應該在哪里? 感謝您的時間。
User
是父實體,級聯總是從父實體傳播到子實體。
因此,用戶協會變成:
@OneToMany(mappedBy = "user",
fetch = FetchType.LAZY,
cascade = CascadeType.ALL,
orphanRemoval = true)
private Collection<UserPosition> userPositionCollection;
但對於默認的 position,用戶成為關聯的Child
級:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "default_User_Position_ID", referencedColumnName = "id")
private UserPosition defaultUserPosition;
在UserPosition
class 中是相反的:
@JoinColumn(name = "user_id", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY)
private User user;
和
@OneToOne(fetch = FetchType.LAZY,
mappedBy = "defaultUserPosition",
cascade = CascadeType.PERSIST)
private User defaultUserPosition;
然后,您還必須添加以下始終同步雙方的實用方法。 這些 go 變成User
class:
public void addUserPosition(UserPosition userPosition) {
userPositionCollection.add(userPosition);
userPosition.setUser(this);
}
public void addDefaultUserPosition(UserPosition userPosition) {
defaultUserPosition = userPosition;
userPosition.setDefaultUserPosition(this);
}
持久化邏輯變為:
User user = new User();
//some setters and getters
UserPosition userPosition = new UserPosition();
//some setters and getters
user.addUserPosition(userPosition);
user.setDefaultUserPosition(userPosition);
session.persist(user);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.