我目前正在使用Spring和Hibernate建立一个项目。在遇到其他几个问题后,我遇到了下一个问题:P
反正。致电entityManager.flush()
时,我收到例外:javax.persistence.TransactionRequiredException: no transaction is in progress
。
我用@Transactional
注释了我的班级,但它仍然没有用。
我在这里阅读了serval线程,其中人们有类似的问题,但解决方案总是<tx:annotation-driven transaction-manager="transactionManager" />
。但我已经有了这个配置。
我不确定我应该为您提供哪些代码或文件,因此您可以在此处找到整个项目: https://drive.google.com/file/d/0B7Exc4dHICl-UDN3ZEJnbS1FZFk/edit?usp=sharing
提前谢谢你。
答案 0 :(得分:0)
@Transactional
无效时, Here会发布有关配置的信息 - 您是否在<context:component-scan>
设置了标记appContext.xml
?这两个扫描bean的包都要注册并激活注释。如果您没有<context:component-scan>
@Transactional
注释,则不会在事务中包装该方法。
答案 1 :(得分:0)
通过实施ApplicationListener<ContextRefreshedEvent>
并对服务调用进行自引用,我找到了此问题的解决方案。
问题出现是因为调用方法中没有启动事务,并且后续方法调用是内部引用,因此没有创建新事务。因此,我必须将我的调用方法设置为事务性或创建内部引用,并通过该引用调用后续方法。
您必须覆盖以下方法
private MyService myService = myService;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
myService = event.getApplicationContext().getBean(MyService.class);
}
然后使用myService.myMethod()
而不是myMethod()
,您希望事务处于活动状态。