[英]Spring MVC + Hibernate: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
[英]Seeking a Spring (3.0.5) Solution for: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
我在Spring 3.0.5上有一個交易問題。 就我而言,我得到了所謂的異常“沒有Hibernate Session綁定到線程,並且配置不允許在此處創建非事務性會話”……到目前為止,我已經嘗試了所有方法。 我可以在日志中看到已檢測到事務服務並將其注冊為Spring Bean,還可以在日志中看到它們已被代理並與基礎Spring事務攔截器相關聯。 (建議)當我運行Spring MVC應用程序時,我的控制器將調用該服務...... :-(但是不會觸發事務攔截器。(??)我希望我的Spring服務代理打開一個會話並啟動一個在調用我的目標服務方法之前進行事務處理。由於這種情況沒有發生,所以我得到了上面的異常。我已經花了將近兩天的時間了,嘗試了我在互聯網上發現的所有內容,但是徒勞無功。
我有分層的體系結構:表示(springmvc),服務(帶事務注釋),數據訪問(Spring / Hibernate經典sessionfactory)。 我的模型對象使用jpa(javax.persistence。*)進行了注釋。 我的spring上下文配置文件位於appContext.xml,appContext-service.xml和appContext-dao.xml中。 我已經在appContext-dao.xml中定義了Spring LocalSessionFactoryBean,Datasource和TransactionManager(HibernateTransactionManager)。 我已將appContext-service.xml放入我的服務實現所在的位置。 在我所有的配置文件中,都包含並通過Controller,Service和Repository批注檢測我的bean。
我感謝任何幫助。
聽起來您做的一切正確,並且知道自己在做什么。 除非您顯示一些配置,否則我們在這里無能為力。
我建議進行一些調試。
第一:在服務層中是否有單元測試可以測試您正在使用的查詢? 也許您可以在服務層中找到錯誤。
然后:調試MVC應用程序,檢查注入的服務的類型。 驗證它們是代理,而不是原始類型。
這聽起來像是在事務結束后訪問延遲加載的列表或一組您的請求。 如果您代替控制器訪問視圖中的該列表,通常會發生這種情況,因為您的控制器可能會調用事務范圍內的方法,然后離開該事務並將加載的Bean轉發到視圖。
簡單的解決方案:
想像:
// your dao
public class Foo {
// lots of other properties
List<Something> stuff;
// getters and setter for stuff
}
// repository
@Transactional
public class FooRepo {
public Foo loadFoo(int id) {
...
}
}
// Controller
public class Controller {
public void Control() {
sessionContext.set("foo", repo.loadFoo(1)); // transaction managed by spring
}
public void setFooRepo(FooRepo repo) {this.repo = repo};
}
// View
for (Something something : foo.getStuff()) {
// Ooops transaction is closed! stuff is lazily loaded so NOT AVAILABLE
// practical solutions:
// - do not load lazily (Foo.hbm.xml)
// - or force loading by getting all Somethings in the controller
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.