Hibernate JPA:如何编写高效的persist()?

时间:2011-01-02 09:54:10

标签: java hibernate jpa

下面的代码看似简单,但它花了我很长时间,但结果是繁琐而冗长的代码,即使我不喜欢。有人可以用一些有效的代码帮助我吗?非常感谢。 顺便说一句,我正在使用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
             {
                ...
             }
      }

3 个答案:

答案 0 :(得分:2)

  1. 您可以使用merge()来保留新实体。
  2. 请注意merge()返回的合并实体可能与传入的实体不同。
  3. 另见:

答案 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。