gpt4 book ai didi

jpa - EclipseLink 合并意外级联

转载 作者:行者123 更新时间:2023-12-03 18:04:12 24 4
gpt4 key购买 nike

我有两个实体类用户和设备。

用户实体:

public class User {
private Long userId;

@OneToMany( mappedBy = "userId", fetch = FetchType.LAZY)
private Collection<Device> deviceCollection;

和设备实体:
public class Device implements Serializable {
@JoinColumn(name = "user_id", referencedColumnName = "user_id")
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private User userId;

当我在删除父用户后将先前分离的设备实体合并到实体管理器中时,(先前删除的)用户和设备都会重新插入到数据库中。用户或设备实体上没有级联注释;因此,我不希望重新插入用户实体,但确实如此;

如何防止合并操作级联到用户实体?

提前致谢。

最佳答案

您在分离状态下所做的任何更改都没有可能让 session 管理器知道它,因此更改始终是需要合并的新对象(如果您正在调用合并)

因此,当您调用合并时,它将从数据库加载它,因此您的对象将具有 Prev+ 新更改。所以这就是为什么提到的行为正在发生。

您可以做的是首先在 session 中加载实体应用更改,然后调用合并。

您可以做的是如下所示我在我的一个项目中使用了类似的关系与 Eclipse Link

Query query = entityManager
.createNamedQuery("User.FindByUserId");
User fromDatabase = null;
try {
query.setParameter("userId", device.getUser().getUserId());
fromDatabase = (User) query.getSingleResult();

} catch (NoResultException noResultException) {
// There is no need to do anything here.
}
if (fromDatabase == null) {
User user= entityManager.merge(device.getUser());
device.setUser(user);
} else {
device.setUser(user);
}
entityManager.persist(device);

关于jpa - EclipseLink 合并意外级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11957461/

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