JPA - 自动重新加载@OneToMany依赖项

时间:2016-05-17 19:47:43

标签: java hibernate jpa

我有这种情况:

public abstract class AbstractEntity {
    @Id @GeneratedValue(strategy = GenerationType.TABLE)
    protected Long id;
}

public class User extends AbstractEntity {
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private Set<Dependent> dependents;
}

public class Dependent extends AbstractEntity {
     @ManyToOne
     @JoinColumn
     private User user;
}

当我尝试insert()一个新的User实例,其中包含已存在于数据库中的Dependent个实例时,这意味着他们填充了id字段,获得Detached entity passed to persist例外。

可以通过从数据库手动加载所有Dependent来解决,但看起来不正确。

我想知道如何在填充id字段时让JPA自动加载它们。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

如果您使用的是JPA API:

EntityManager.merge(T t)

而不是

EntityManager.persist(Object object)

由于您使用的是CascadeType.ALL,因此当您使用merge时,JPA Provider将尝试更新Users(如果它们存在于数据库中)或将创建新的。

文档:http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html