[英]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個問題:
因此應改為:
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.