2016-12-23 90 views
3

這是我保存數據的方法。這是工作的罰款spring hibernate異步任務問題沒有找到當前線程的會話

public Future<SocialLogin> loginUserSocial(Social model) { 
     Session session = this.sessionFactory.getCurrentSession(); 
     session.save(model); 
     SocialLogin dto = new SocialLogin(); 
     dto.setUser_id(model.getUser_id()); 
     return new AsyncResult<SocialLogin>(dto); 
    } 

但如果我把@Async annotion的方法 我已經得到了以下異常。

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.util.concurrent.ExecutionException: org.hibernate.HibernateException: No Session found for current thread 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

如果有人對此有例外的知識,我很欣賞。 感謝

+1

請發佈您的Bean包含未來<..>的定義。 –

回答

3

here

這並不意味着實現者是線程安全的。相反,每個線程/事務都應該從SessionFactory中獲取自己的實例。

根據文檔線程應該有自己的會話。如果您通過sessionFactory.getCurrentSession();獲得會話,您將獲得null,因爲它的訪問受ThreadLocals保護。

您可以通過此代碼爲每個線程創建新會話。

@Async 
public Future<SocialLogin> loginUserSocial(Social model) { 
     Session session = this.sessionFactory.openSession(); 
     session.save(model); 
     SocialLogin dto = new SocialLogin(); 
     dto.setUser_id(model.getUser_id()); 
     return new AsyncResult<SocialLogin>(dto); 
    } 
+0

它工作正常。謝謝你的詳細解釋。 –

相關問題