深入了解Hibernate自動狀態(tài)檢測
Hibernate自動狀態(tài)檢測為用戶帶來了很大的方便,它是通過一個方法來具體實現(xiàn)這個功能的,下面我們主要就該方法深入學(xué)習(xí)。
Hibernate的用戶曾要求一個既可自動分配新持久化標(biāo)識(identifier)保存瞬時(transient)對象,又可更新/重新關(guān)聯(lián)脫管(detached)實例的通用方法。Hibernate自動狀態(tài)檢測是saveOrUpdate()方法實現(xiàn)了這個功能。
- // in the first session
- Cat cat = (Cat) firstSession.load(Cat.class, catID);
- // in a higher tier of the application
- Cat mate = new Cat();
- cat.setMate(mate);
- // later, in a new session
- secondSession.saveOrUpdate(cat); // update existing state (cat has a non-null id)
- secondSession.saveOrUpdate(mate); // save the new instance (mate has a null id)
saveOrUpdate()用途和語義可能會使新用戶感到迷惑。 首先,只要你沒有嘗試在某個session中使用來自另一session的實例,你就應(yīng)該不需要使用update(), saveOrUpdate(),或merge()。有些程序從來不用這些方法。
◆通常下面的場景會使用update()或saveOrUpdate():
◆程序在第一個session中加載對象
◆該對象被傳遞到表現(xiàn)層
◆對象發(fā)生了一些改動
◆該對象被返回到業(yè)務(wù)邏輯層
◆程序調(diào)用第二個session的update()方法持久這些改動
◆saveOrUpdate()做下面的事:
◆如果對象已經(jīng)在本session中持久化了,不做任何事
◆如果另一個與本session關(guān)聯(lián)的對象擁有相同的持久化標(biāo)識(identifier),拋出一個異常
◆如果對象沒有持久化標(biāo)識(identifier)屬性,對其調(diào)用save()
◆如果對象的持久標(biāo)識(identifier)表明其是一個新實例化的對象,對其調(diào)用save()
◆如果對象是附帶版本信息的(通過
◆否則update() 這個對象
◆merge()可非常不同:
◆如果session中存在相同持久化標(biāo)識(identifier)的實例,用用戶給出的對象的狀態(tài)覆蓋舊有的持久實例
◆如果session沒有相應(yīng)的持久實例,則嘗試從數(shù)據(jù)庫中加載,或創(chuàng)建新的持久化實例
◆最后返回該持久實例
◆用戶給出的這個對象沒有被關(guān)聯(lián)到session上,它依舊是脫管的 。
這就是實現(xiàn)Hibernate自動狀態(tài)檢測的說明。
【編輯推薦】

























