gpt4 book ai didi

java - Hibernate - 如何在关系中正确使用级联

转载 作者:行者123 更新时间:2023-11-30 08:52:26 25 4
gpt4 key购买 nike

我在我的 spring mvc 应用程序中使用 hibernate,并且有一个关于级联的问题。我看到很多类似的问题,但没有一个能回答我的问题。假设我有 UserUserPosition 对象。 User 有一组 UserPosition 并且还有一个 UserPosition 作为默认位置。结构是这样的:

用户:

@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;
}

现在,我的问题是使用级联保存相关对象的最佳做法是什么?。事实上,我对这三种解决方案感到困惑:

解决方案一:

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 是父实体和级联 always propagates from Parent to Child entities .

因此,用户关联变为:

@OneToMany(mappedBy = "user", 
fetch = FetchType.LAZY,
cascade = CascadeType.ALL,
orphanRemoval = true)
private Collection<UserPosition> userPositionCollection;

但对于默认位置,用户成为关联的子级:

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "default_User_Position_ID", referencedColumnName = "id")
private UserPosition defaultUserPosition;

UserPosition 类中是相反的:

@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;

然后您还必须添加以下始终同步双方的实用方法。这些进入 User 类:

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);

关于java - Hibernate - 如何在关系中正确使用级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30184529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com