簡體   English   中英

使用Spring在Hibernate中進行會話處理

[英]Session handling in Hibernate with Spring

我不是hibernate的初學者,但是我是Spring中與Hibernate合作的初學者。 我讀了《 Spring in Action》一書。 因此,我編寫了一個小應用程序來理解本書中的示例。 這里是我的應用程序的摘錄。 如果您願意,我可以給您更多。

@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public void runQuery()
{
    final BuildingDAO buildingDAO = ( BuildingDAO ) applContext.getBean( "buildingDAO" );
    final Building building = buildingDAO.getBuildingById( "HQ" );
    logger.debug( "Loaded building: " + building.getId() );
    logger.debug( "Loaded building: " + building.getName() );
}

該對象已加載,沒有任何問題。 主鍵的日志也沒有問題。 但是字符串屬性的日志會導致LazyInitializationException。 我知道為什么會這樣。 Hibernate返回了帶有代理屬性的代理。 當我想訪問延遲加載的屬性時,Hibernate嘗試加載該值,但會話已關閉。 延遲加載是Hibernate的一項重要功能,我不想錯過它。

Spring為我管理會話處理。 Spring在Hibernate模板的加載方法中打開一個Hibernate會話,並在方法完成后關閉該會話。

但是現在我想建議Spring在整個方法(runQuery())中打開會話,如上所示。 我想顯示對象的一些屬性。 我提到我可以使用Spring的事務管理器來做到這一點。 因此,我使用Spring的事務注釋。 但這是行不通的。 也許我的假設使用事務管理器是錯誤的。

有沒有人建議Spring為整個方法舉行一次會議?

您確定您確實需要Propagation.SUPPORTS嗎? 那不會強制事務的存在,它只是在有事務的情況下使用它。 系統的其他部分需要啟動和提交事務。 如果不存在,則會話可能無法維護到您的日志語句為止,從而導致延遲加載錯誤。

嘗試使用其他一些隔離級別(例如“必需”,或者更好,不要全部指定它,而是依靠默認值),看看是否可以解決您的問題。

更改為“必需”或僅將其留為空白將解決您的問題。 Propagation.SUPPORTS實際上並未啟動交易...請參閱http://www.ibm.com/developerworks/java/library/j-ts2.html

您可能沒有禁用非事務性讀取(默認啟用),因此讀取成功,但是該讀取的事務僅針對讀取本身(不適用於返回的對象的后續讀取)。

登錄事務活動的類別是org.springframework.transaction IIRC-如果將其轉到DEBUG,則將看到有關啟動和提交事務的詳細信息。

如果希望RunQuery在Spring事務中運行,則必須從容器中獲取將其定義為Spring Bean的類的對象。 這樣,Spring可以將事務邏輯包裝在bean周圍(以及它定義的任何方法)。
將該類定義為spring bean還將使您(BuildingDAO)applContext.getBean("buildingDAO")調用(BuildingDAO)applContext.getBean("buildingDAO")因為spring會將dao連接到您的類中(如果您在上下文xml或屬性中正確定義了該類)。

暫無
暫無

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

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