2012-10-21 22 views
0

我在一個小型的個人項目上使用Hibernate和Spring。那麼,在這方面還是一個新手,所以想提出一些交易的基本問題。如何在事務中使用Spring,Hibernate,MySQL ISAM?

  • 看來,我要聲明的事務管理器和註釋DAO類作爲 @Transactional(傳播= Propagation.REQUIRED,只讀= FALSE)。否則,我會遇到一些奇怪的異常,或者實體不保存在數據庫中。實際上有必要使用交易嗎?我不能將數據保存在數據庫中而不使用它們(我認爲MySQL ISAM表不支持事務處理),那麼如何使用它們呢?

  • 將@Transactional屬性放在哪裏的最佳地點是什麼?目前它在我的泛型HibernateDAO超類上聲明,可能是最深的級別。我想這不是最好的地方。但是如果把它提升起來,我會在Spring MVC控制器中結束它,這可能也是不恰當的地方。到目前爲止,沒有其他服務層,因爲除了保存和提供數據庫中的單詞和定義外,我什麼都不做。

非常感謝

回答

1

實際上是否有必須使用事務?

是的。關係數據庫的基本特徵之一是事務。但使用默認參數的簡單@Transactional就足夠了。但是,您可以使用AOP在周圍的整套類中聲明XML中的事務,例如,全部有*DAO名稱。

將@Transactional屬性放在哪裏最好的地方是什麼?

服務層,請參閱:What is the right way to use spring MVC with Hibernate in DAO, sevice layer architecture

1

是的,你總是需要使用事務來訪問使用Hibernate數據庫(甚至沒有實際)。我只是不會使用MyISAM,因爲如你所說,它不是一個事務性的數據庫引擎。

@Transactional註釋放在服務層的功能服務上的最佳位置。要麼引入一個真正的服務層,要麼你認爲DAO層實際上是你的服務層。但是要小心,如果你的控制器必須使用FooDAO和一個使用BarDAO的bar來保存foo,並且如果這兩個插入應該以事務方式完成,那麼你有一個很大的問題。這就是服務層如此重要的原因:它可以在一次交易中訪問多個DAO

0

春季hibernate事務管理器還負責爲您管理休眠會話。如果您在spring中使用sessionFactory.getCurrentSession()api以及spring hiberanteTranasactionManager,spring將在事務開始時關注會話並在事務結束後關閉會話。

這使得你的代碼更加清晰。你不必亂拋垃圾你的代碼與openSession和closeSession。對每個休眠操作使用session per request方法而不是打開和關閉會話也是一個好主意。

正如你所說的把它放在服務層的正確位置 - 通過調用多個DAO方法實現用例邏輯的類。如果您沒有一個要麼從控制器執行多個DAO調用,要麼在需要時您的DAO正在執行多個數據庫操作。

如果您從控制器方法調用多個DAO方法,則應將@Transactional放在控制器方法上。

如果您的DAO正在進行多個數據庫操作,則應將其置於DAO級別。

如果應用程序涉及非平凡的邏輯(超越了基本的CRUD),最好在此級別創建服務層和管理器事務。

相關問題