簡體   English   中英

分離對象如何在休眠中工作

[英]How does the detached object work in 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. 您甚至不需要使用更新或合並,因為現在,因為existingPerson附加到會話,所以您在更新時會自動使更改(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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM