分离对象如何在hibernate状态下工作

我知道当我们已经点击保存并且我们必须重新附加它时,该对象处于分离状态。

假设我有一个带有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); } 

现在我可以点击保存任意数量的时间来保存数据。

现在这意味着,一旦我第一次点击保存,它就会变得分离。 所以我需要为此做一些特别的事情,或者无关紧要。

我想知道在什么条件下我需要编写关于分离状态的任何东西

用于保存,加载,获取或查找实体的会话一旦关闭,实体就会分离。 这意味着它不再连接到会话,并且像任何其他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个问题:

  1. 保存不会做你认为它做的事情。 save用于插入新的person对象。 您现有的人已经存在且已有ID,因此要使用的操作是更新或合并。
  2. 您甚至不需要使用更新或合并,因为现有的Persers附加到会话,所以您在更新时会自动使更改(setFirstName,setLastName等)由Hibernate持久化。 它是透明的。
  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); }