使用EntityManager进行Hibernate更新

时间:2012-10-27 18:09:51

标签: java hibernate named-query hibernate-entitymanager

我正在使用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实现更新?

3 个答案:

答案 0 :(得分:5)

可能会为您弹出两种情况。

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

如果是这种情况,你想使用方法: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.

答案 1 :(得分: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注释。

答案 2 :(得分:0)

我不知道您的确切要求,但在您的方法Person.getPersonById(int id)中,您可以使用以下内容简化代码:

return entityManager.find(Person.class, id);