2011-04-12 55 views
3

我必須做一些數據庫的東西在我的倉庫」 @PostConstruct@PostConstruct和「沒有Hibernate的Session綁定到線程」異常

@Repository 
public class SomeRepositoryHibernate implements SomeRepository { 
    private SessionFactory sessionFactory; 

    @Autowired 
    public SomeRepositoryHibernate(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    ... 

    @PostConstruct 
    public void doSomestuffWithDb() { 
     ... 
    } 

} 

,但它失敗:

org.hibernate.HibernateException: No Hibernate Session bound to thread, and 
    configuration does not allow creation of non-transactional one here 

有什麼簡單的解決方案呢?

謝謝!

+0

1)什麼是你的容器 - 這很重要,因爲不同的容器在不同的時間處理PostConstruct(春天我假設給定的@Autowired符號的存在)。 2)你在「doSomestuffWithDB」中實際做了什麼?你如何初始化你的sessionFactory,這也會影響你在生命週期中該做的事情。 – lscoughlin 2011-04-12 12:27:28

+1

1)我目前在Jetty上運行它 - 沒有測試過別人。 2)我只是無法獲得Hibernate會話 - sessionFactory.getCurrentSession(),因此無能爲力。謝謝 – 2011-04-12 12:30:03

+0

我的會話只是 2011-04-12 12:31:25

回答

2
  • 您不必在@PostConstruct
  • 一個運行的事務不能使用@Transactional有(除mode="aspectj"),所以彈簧無法啓動
  • 交易需要休眠的交易變異數據(插入/更新/刪除)

那麼,你就必須有創建會話工廠(通過.openSession())會話,然後手動啓動事務。

+0

bozho釘了它。 – lscoughlin 2011-04-12 14:23:18

2

假設您正在使用hibernate與spring結合,並且您已在spring配置文件中正確配置了sessionFactory和事務管理器。 然後根本原因是,當您調用doSomestuffWithDb()方法時,事務準備工作尚未在春季完成。 @postconstruct只能確保在創建bean之後調用方法,它不能確保容器爲所有事情做好準備 - 這裏我指的是事務相關的東西 - 此刻。 春季論壇有詳細的討論。 http://forum.springsource.org/showthread.php?58337-No-transaction-in-transactional-service-called-from-PostConstruct 另外,筆者提出自己的解決方案,在JIRA https://jira.springsource.org/browse/SPR-5966?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel#issue-tabs

相關問題