EclipseLink合并了意外的级联

eym*_*mlo 5 jpa eclipselink

我有两个实体类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)

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

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

提前致谢.

Ami*_*nde 0

您在分离状态下所做的任何更改,会话管理器都无法知道它,因此对于它来说,更改始终是需要合并的新对象(如果您正在调用合并)

因此,当您调用 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)