我有这种情况:
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自动加载它们。我怎么能这样做?
答案 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。