我有两个实体类user和device.
用户实体:
public class User {
private Long userId;
@OneToMany( mappedBy = "userId", fetch = FetchType.LAZY)
private Collection<Device> deviceCollection;
Run Code Online (Sandbox Code Playgroud)
和设备实体:
public class Device implements Serializable {
@JoinColumn(name = "user_id", referencedColumnName = "user_id")
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private User userId;
Run Code Online (Sandbox Code Playgroud)
当我删除父用户后将先前分离的设备实体合并到实体管理器中时,(先前删除的)用户和设备都被重新插入到数据库中.用户或设备实体上没有级联注释; 因此,我不希望重新插入用户实体,但确实如此;
如何防止合并操作级联到用户实体?
提前致谢.
您在分离状态下所做的任何更改,会话管理器都无法知道它,因此对于它来说,更改始终是需要合并的新对象(如果您正在调用合并)
因此,当您调用 merge 时,它将从数据库加载它,以便您的对象将具有 Prev+ 新更改。这就是为什么会发生上述行为。
您可以做的是首先在会话中加载实体应用更改,然后调用合并。
你可以做的是像下面这样我在我的一个项目中使用了类似的关系与 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);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1687 次 |
最近记录: |