我知道当我们已经点击保存并且我们必须重新附加它时,该对象处于分离状态.
假设我有一个带有html文本字段的表单,并且有一个保存按钮,用于将文本保存在数据库中.
我有这个代码
public void edit(Person person) {
logger.debug("Editing existing person");
// Retrieve session from Hibernate
Session session = sessionFactory.getCurrentSession();
// Retrieve existing person via id
Person existingPerson = (Person) session.get(Person.class, person.getId());
// Assign updated values to this person
existingPerson.setFirstName(person.getFirstName());
existingPerson.setLastName(existingPerson.getLastName());
existingPerson.setMoney(existingPerson.getMoney());
// Save updates
session.save(existingPerson);
}
Run Code Online (Sandbox Code Playgroud)
现在我可以节省任何时间来保存数据.
现在这是否意味着一旦我第一次点击保存,它就会变得分离.所以我需要做一些特别的事情,或者无关紧要.
我想知道在什么条件下我需要编写关于分离状态的任何东西
JB *_*zet 22
一旦用于保存,加载,获取或查找实体的会话已关闭,该实体就会分离.这意味着它不再连接到会话,并且像任何其他POJO一样工作.
当附加实体并更改其中一个属性时,Hibernate会自动将您所做的更改保存到数据库中的相应行(在刷新/提交时).
分离时,对对象所做的更改不会自动保存到数据库中.为了保存更改,您需要通过调用session.update()或session.merge()来自行完成.两种方法或多或少都做同样的事情,但做的却不同.我个人更喜欢使用merge,这样不那么危险并且导致更少的bug.
阅读http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-detached了解更多详情
在您的代码中,作为参数传递给edit方法的人可能已经分离.你正在做的是获得与会话中传递的ID相同的人.existingPerson
因此附上.然后将所有属性从分离的人复制到附加的existingPerson.最后,您保存现有的Peron.
这段代码有3个问题:
因此应改为:
public void edit(Person person) {
logger.debug("Editing existing person, which is a detached object");
// Retrieve session from Hibernate
Session session = sessionFactory.getCurrentSession();
// Retrieve existing person via id, then copy everything from detached person
// to attached one, and return attached one
Person existingPerson = (Person) session.merge(person);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18012 次 |
最近记录: |