下面的代码看似简单,但它花了我很长时间,但结果是繁琐而冗长的代码,即使我不喜欢。有人可以用一些有效的代码帮助我吗?非常感谢。 顺便说一句,我正在使用hibernate 3.6 JPA实现
@Entity
class X
{
@OneToMany( fetch = FetchType.EAGER, mappedBy = "x", cascade = { CascadeType.PERSIST, CascadeType.MERGE } )
private Set<Y> ys = new HashSet<Y>();
public void persist()
{
//here, this(x) is newly create but its ys are already in the DB, so how to write the code?
}
public void merge()
{
//like persist(), the ys of this(x) is changed, how to merge effiently?
}
}
我使用下面但它会抛出异常:无法获取未经存在的实体
public void merge()
{
EntityManager em = entityManager();
EntityTransaction tx = em.getTransaction();
try
{
tx.begin();
for(Y y: ys)
em.merge(y);
em.merge(this);
tx.end();
}
finally
{
...
}
}
答案 0 :(得分:2)
merge()
来保留新实体。merge()
返回的合并实体可能与传入的实体不同。另见:
答案 1 :(得分:1)
每个规范合并可用于更新的持久目的。决定是否存在@Id值。 因此JPA本身提供了存储实体的最有效方式
答案 2 :(得分:0)
您不会在实体中调用EntityManagers函数。您将创建一个新的X并将Y添加到它。最后调用EntitiManager.persist()。
X x = new new X();
for(Y y : findSomeYsilons() ) {
x.add(y);
}
em.persist(x);
您的实体不应该了解JPA / Hibernate / Transactions。