10

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を使用して更新を実装するにはどうすればよいですか?

4

3 に答える 3

10

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

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

この場合、次のメソッドを使用します: find、modify、flush、commit。

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.
于 2012-10-27T22:13:57.613 に答える
1

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アノテーションを使用するなど、他の方法でトランザクション境界をマークする必要があります。

于 2012-10-27T18:28:24.250 に答える
0

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

return entityManager.find(Person.class, id);
于 2012-10-27T18:16:24.980 に答える