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

可能会出现两种情况。

您可能想要更改对象的属性,并且仅更改该属性。

如果是这种情况你要使用的方法: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 实现会自动管理实体的状态并将其保存到数据库中。您不需要显式调用mergeupdate方法。

如果您正在使用资源本地事务(不由 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 回答