我正在修改一个较旧的 Spring 项目,以更多地反映 Spring 3.0.x 中应该如何完成的事情。
我所做的更改之一是对存储库/dao 层。按照最佳实践的建议,我不再从HibernateDaoSupport
使用扩展HibernateTemplate
,而是SessionFactory
直接通过 using使用 Hibernate sessionFactory.getCurrentSession()
,它应该与 Spring 3.0.x 及更高版本一起使用。
这对整个项目来说是一个非常大的好处,因为它摆脱了由HibernateTemplate
. 但是,我刚刚注意到我不能再调用使用 @PostConstruct 的 Service 方法(或者onStartUp
在 XML 应用程序上下文中使用 bean 的属性)
例如,这个方法过去使用 运行得很好HibernateTemplate
,但现在 Hibernate 抛出一个异常,抱怨没有会话绑定到线程:
@Override
@PostConstruct
public void onStartUp() {
logger.debug("Starting Bootstrap Service...");
createSysAdminUser();
createDefaultRoles();
createDefaultThemes();
createStopListIfDoesNotExist();
stopListService.load();
partialMappingService.load();
dictionaryService.load();
}
我可以删除这个@PostConstruct
方法调用......它是系统中唯一的一个。当应用程序启动以引导新应用程序的数据时调用它。大多数时候,它在生产系统上什么都不做,但是将它用于新创建的测试和开发数据库很方便。
关于为什么以及如何解决它的任何想法?
谢谢!
编辑:这是我的事务管理建议配置:
<aop:config>
<aop:advisor advice-ref="transactionAdvice"
pointcut="execution(* *..service.*.*(..))" order="1"/>
<!-- gets sub packages like service.user -->
<aop:advisor advice-ref="transactionAdvice"
pointcut="execution(* *..service.*.*.*(..))" order="2"/>
</aop:config>
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true" propagation="REQUIRED"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>