Hibernate JPA: как написать эффективный персистент ()? - PullRequest
0 голосов
/ 02 января 2011

Приведенный ниже код кажется простым, но это занимает у меня много времени, но оказалось громоздким и длинным кодом, даже если я не люблю. Может ли кто-нибудь помочь мне с некоторым эффективным кодом? большое спасибо. кстати, я использую 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 ]

2 голосов
/ 02 января 2011
  1. Вы можете использовать merge() для сохранения новых сущностей.
  2. Обратите внимание, что merge() возвращает объединенную сущность, которая может отличаться от переданной сущности.

См. Также:

1 голос
/ 02 января 2011

По спецификации слияние может использоваться как для постоянных целей, так и для обновления. Принимается решение о наличии значения @Id. Таким образом, JPA сама по себе обеспечивает наиболее эффективный способ хранения вашей сущности

0 голосов
/ 02 января 2011

Вы не вызываете функции EntityManager в объектах.Вы должны создать новый X и добавить к нему Y.В конце вызывается EntitiManager.persist ().

X x = new new X();
for(Y y : findSomeYsilons() ) {
   x.add(y);
}
em.persist(x);

Ваши лица не должны знать о JPA / Hibernate / Transactions.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...