我正在使用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实现更新?
答案 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实现会自动管理实体的状态并将其保存到数据库。您无需明确调用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
注释。
答案 2 :(得分:0)
我不知道您的确切要求,但在您的方法Person.getPersonById(int id)
中,您可以使用以下内容简化代码:
return entityManager.find(Person.class, id);