4.1.5 對象身份標識範圍之外

如果一個對象引用離開了對象身份的範圍,那麼我們稱這個引用指向了一個detached對象。爲了這個概念如此有用呢?

在web程序中,通常在用戶交互中你不需要維護一個數據庫事務。用戶可能需要花費很長時間去做修改方面的事情,但是由於性能方面的原因,你必須保證數據庫事務不能佔用太長時間並且儘快釋放數據庫資源。在這個環境中,重用一個指向detached實例的應用就變得很有意義。例如,你可能想要發送一個從表現層取得的一個對象,當用戶修改之後,你再繼續重新使用它。

出於性能上的考慮,你可能並不想要取得整個對象圖,因此重用detached對象就變得很重要。Hibernate支持重新選擇detached實例。這就意味着Hibernate可以通過當前的Session取得一個detached實例。一旦一個detached對象重新和Session發生了關聯,它就仍然被認爲是一個持久化實例,在事務的結尾它的狀態將和數據庫保持同步。

這種重新關聯可能會造成在數據庫中添加新的一行的效果。例如,一個new的Bid對象被加入到一個detached的Item對象中。Hibernate能夠檢測到Bid需要被插入到數據庫。爲了做到這些,Hibernate必須能夠區分能夠區分一個新的tranisent對象以及一箇舊的detached對象。Transient對象需要被保存,而detached對象需要被重新關聯。有幾種方法可以來區分transient和detached實例,但是最好的辦法就是查看標識符屬性。Hibernate能夠檢測一個transient或者detached對象的標識符來正確對待不同狀態的對象。我們將在4.3.4中討論這些。

如果你願意利用Hibernate重新關聯detached對象的特性的話,那麼你需要注意到Hibernate對象身份範圍的特點,那就是在Session範圍內保持一致的對象。一旦你離開了Session的範圍,那麼對象就會變成detached狀態,這就會引出另外一個有趣的概念。

我們需要討論Java對象的相等以及數據庫標識的關係。作爲一個類的開發人員,你需要認識到Java中的相等性是由equals()以及hasCode()方法來控制的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章