Hibernate の使用を Hibernate 4 にアップグレードしようとしています。
たくさんの Hibernate Interceptor があります。これらはインターフェースを利用します
public void beforeTransactionCompletion(Transaction tx)
配線はすべて正しく、Hibernate3 で動作します。ただし、H4 ユーティリティ クラスに適切な変更を加えれば、そうはなりません。
この理由は、インターフェイスが呼び出される前にデータベース接続が閉じられているためと思われるため、「接続が閉じられました」という例外が発生します。
ソースを掘り下げると、これは「triggerBeforeCompletion」のメカニズムで、接続が実際に閉じられているためと思われます。これは、次のコメントを持つ DataSourceUtils.beforeCompletion に要約されるようです。
// Release Connection early if the holder is not open anymore
// (that is, not used by another resource like a Hibernate Session
// that has its own cleanup via transaction synchronization),
// to avoid issues with strict JTA implementations that expect
// the close call before transaction completion.
トランザクションが完了する前に接続が閉じられないようにする正しい方法は何ですか?
@Bean
public Properties hibernatePropertiesLive()
{
Properties properties = new Properties();
properties.put("hibernate.dialect", dialect);
properties.put(Environment.SESSION_FACTORY_NAME, "LiveSession");
properties.put("hibernate.show_sql", "" + showSql);
properties.put("hibernate.format_sql", "" + formatSql);
properties.put("hibernate.jdbc.batch_size", "15");
properties.put("hibernate.generate_statistics", "true");
return properties;
}
@Bean
public LocalSessionFactoryBean SessionFactory() throws Exception {
LocalSessionFactoryBean bean = new LocalSessionFactoryBean();
bean.setMappingLocations(getResources());
bean.setHibernateProperties(hibernatePropertiesLive());
bean.setDataSource(dataSource);
bean.setCachingEnabled(false);
return bean;
}
@Bean
public HibernateTransactionManager TransactionManager()
{
HibernateTransactionManager theBean = new HibernateTransactionManager();
theBean.setSessionFactory(SessionFactory());
theBean.setEntityInterceptorBeanName("HibernateInterceptor");
theBean.setDefaultTimeout(300);
return theBean;
}
@Bean
@Scope("prototype")
public MyInterceptor HibernateInterceptor()
{
return new MyInterceptor();
}