深入了解Hibernate自動狀態檢測
Hibernate自動狀態檢測為用戶帶來了很大的方便,它是通過一個方法來具體實現這個功能的,下面我們主要就該方法深入學習。
Hibernate的用戶曾要求一個既可自動分配新持久化標識(identifier)保存瞬時(transient)對象,又可更新/重新關聯脫管(detached)實例的通用方法。Hibernate自動狀態檢測是saveOrUpdate()方法實現了這個功能。
- // 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的實例,你就應該不需要使用update(), saveOrUpdate(),或merge()。有些程序從來不用這些方法。
◆通常下面的場景會使用update()或saveOrUpdate():
◆程序在第一個session中加載對象
◆該對象被傳遞到表現層
◆對象發生了一些改動
◆該對象被返回到業務邏輯層
◆程序調用第二個session的update()方法持久這些改動
◆saveOrUpdate()做下面的事:
◆如果對象已經在本session中持久化了,不做任何事
◆如果另一個與本session關聯的對象擁有相同的持久化標識(identifier),拋出一個異常
◆如果對象沒有持久化標識(identifier)屬性,對其調用save()
◆如果對象的持久標識(identifier)表明其是一個新實例化的對象,對其調用save()
◆如果對象是附帶版本信息的(通過
◆否則update() 這個對象
◆merge()可非常不同:
◆如果session中存在相同持久化標識(identifier)的實例,用用戶給出的對象的狀態覆蓋舊有的持久實例
◆如果session沒有相應的持久實例,則嘗試從數據庫中加載,或創建新的持久化實例
◆最后返回該持久實例
◆用戶給出的這個對象沒有被關聯到session上,它依舊是脫管的 。
這就是實現Hibernate自動狀態檢測的說明。
【編輯推薦】