web-dev-qa-db-ja.com

EntityManagerによるHibernateアップデート

Hibernate 4.1.7を使用してオブジェクトを更新しようとしていますが、その方法に関するドキュメントがありません。現在、私はこれを行っています:

    Person person = personDao.getPersonById(1);
    person.setAge(23);
    person.setLastname("McName");
    person = personDao.update(person);

PersonDaoの更新は次のようになります。

    public Person update(Person person) {
      return entityManager.merge(person);
    }

PersonDaoのgetPersonByIdは次のとおりです。

    public Person getPersonById(int id) {
      personQuery = entityManager.createNamedQuery("Person.findPerson", Person.class);
      personQuery.setParameter("id", id);
      return personQuery.getSingleResult();
    }

また、Personクラス内に名前付きクエリを定義しました。

    @NamedQuery(name="Person.findPerson", query="SELECT p FROM Person p WHERE p.id = :id")

Personが更新されないことを使用する場合、Hibernateを使用して更新を実装するにはどうすればよいですか?

8
Timo

2つのシナリオが表示される場合があります。

オブジェクトのプロパティを変更し、そのプロパティのみを変更したい場合があります。

この場合、次の方法を使用します:検索、変更、フラッシュ、コミット。

em.find(Person.class, person.getId())
person.setStatus("ACTIVE");
em.commit();//implicitly flushes if flush mode is COMMIT or AUTO.

オブジェクトのプロパティを使用してアイテムを更新することをお勧めします。

この場合、次の方法を使用します:マージ、オプションで変更、フラッシュ、コミット。

em.merge(person);
//modify person if you wish.
em.commit();//implicitly flushes if flush mode is COMMIT or AUTO.
5
dseibert

Hibernateおよびその他のJPA実装は、エンティティの状態を自動的に管理し、変更がトランザクションに含まれている場合はデータベースに保存します。 mergeまたはupdateメソッドを明示的に呼び出す必要はありません。

リソースローカルトランザクション(JTAトランザクションマネージャーによって管理されていない)を使用している場合は、次のようにしてみてください。

EntityTransaction tx = entityManager.getTransaction();
tx.begin();
Person person = personDao.getPersonById(1);
person.setAge(23);
person.setLastname("McName");
tx.commit();

そして、すべての変更は自動的にデータベースに保存されます。

JTAを使用している場合は、Spring AOP @Transactionalアノテーションを使用するなど、他の方法でトランザクション境界をマークする必要があります。

1
Jarek

正確に何を求めているのかわかりませんが、メソッドPerson.getPersonById(int id)では、次のようにしてコードを簡略化できます。

return entityManager.find(Person.class, id);
0
Buhake Sindi