簡體   English   中英

Hibernate - 如何在關系中正確使用級聯

[英]Hibernate - how to use cascade in relations correctly

我在我的 spring mvc 應用程序中使用 hibernate 並且對級聯有疑問。 我看到很多類似的問題,但沒有一個能回答我的問題。 假設我有UserUserPosition對象。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM