【发布时间】:2010-12-20 14:02:11
【问题描述】:
当我打电话时:
entityManager.flush()
我得到了标题中提到的异常。
我正在使用 Hibernate JPA。
【问题讨论】:
-
显示你的 web.xml 和你的 servlets 文件
当我打电话时:
entityManager.flush()
我得到了标题中提到的异常。
我正在使用 Hibernate JPA。
【问题讨论】:
在自己遇到这个问题并花了几个小时试图解决它之后,我终于找到了一个原因:Spring有一个错误,如果同一个类有@Service注解,则无法使用@Transactional注解维护事务用于自动装配的方式。
一旦@Service 注释从相关服务类中删除,并且在 XML 配置中声明了适当的 bean:
<bean id="myService" class="com.example.myapp.service.MyServiceImpl" />
问题消失了。
查看JIRA bug了解更多详情。
【讨论】:
确保在执行此语句时您有一个活动事务。如果您使用 JPA,请使用 EntityManager.getTransaction().begin()。这是假设您在 JTA 事务范围之外使用 JPA。
如果您在支持 JTA 的容器内运行应用程序,您还可以使用 JTA UserTransaction 来管理事务。
【讨论】:
我的问题与我在上下文定义中设置 <tx:annotation-driven/> 元素的方式有关 -
最初我启用了读取<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> 的加载时间编织(not knownley),并通过简单地删除第二个属性 - 一切正常(虽然花了 2 个小时的时间)。我相信第二个元素与@Configurable 原型有关,但可以让其他(更聪明的)人解释差异以及为什么一个人可以工作而另一个人不工作。希望这会有所帮助......
工作定义=<tx:annotation-driven transaction-manager="transactionManager"/>
【讨论】:
我遇到了这个问题,只需在方法上添加@Transacctional注解,还要在类中与@Service注解一起添加。
例如:
@Service
@Transactional
public class MyService {
}
【讨论】:
@Transactional不够用?
确保在执行此语句时您有一个活动事务。如果您使用 JPA,请使用 EntityManager.getTransaction().begin()。这是假设您在 JTA 事务范围之外使用 JPA。
【讨论】:
春季 4.3.1 / 休眠 4.2.21
我的配置是 100% Java 代码,没有 hibernate 或 spring xml 文档(例如 context.xml、persistence.xml 等)。问题是我传递给TransactionManager 的EntityManagerFactory,请参阅transactionManager 方法中的以下配置。
@Configuration
@EnableTransactionManagement
public class HibernateConfiguration2 {
@Bean
public DataSource dataSource() {
return ...; // Build a basic datasource
}
@Bean
@Autowired
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSource);
entityManagerFactory.setPackagesToScan("nz.co.mark");
entityManagerFactory.setPersistenceProviderClass(org.hibernate.ejb.HibernatePersistence.class);
return entityManagerFactory;
}
@Bean
@Autowired
public EntityManager entityManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
EntityManager em = localContainerEntityManagerFactoryBean.getNativeEntityManagerFactory().createEntityManager();
em.setFlushMode(FlushModeType.AUTO);
return em;
}
@Bean
@Autowired
public JpaTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean emf) throws Exception {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf.getObject());
// The below line would generate javax.persistence.TransactionRequiredException: no transaction is in progress
// transactionManager.setEntityManagerFactory(emf.getNativeEntityManagerFactory());
return transactionManager;
}
【讨论】:
我遇到了同样的问题...花了几个小时才终于找到原因。 在我的情况下,这只是导致异常的一行代码......
在我的 mvc-core-config.xml 中,原因如下:
<context:component-scan base-package="com.my.package.application" />
如下更改后,一切都恢复正常了:
<context:component-scan base-package="com.my.package.application.controller" />
所以我猜想扫描我所有的应用程序包而不仅仅是我的@Controller 类会导致像his post to another answer 中提到的@harshal-waghmare 这样的问题。
【讨论】:
请确保您的处理程序方法声明为public
@Transactional
@RequestMapping('/test')
public String doTest() {
// do your stuff here
return 'testview';
}
【讨论】:
确保您的 spring 配置包含以下行:
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
mode 可以是 proxy 或 aspectj 并且transaction-manager 必须指向您的事务管理器。
【讨论】:
使用 spring 3.0.0 / 3.0.3 时我也遇到了同样的情况。数据从 JUnit 保存在 MySQL 中,但不是来自 tomcat 服务器。经过这么多工作,我放弃了 JTA 的 RESOURCE_LOCAL。
这对我有用 http://erich.soomsam.net/2007/04/24/spring-jpa-and-jta-with-hibernate-and-jotm/ 它使用 JTA 并依赖于 JOTM。
【讨论】:
我做了以下所有事情。我的问题是“导入”标签,有几个上下文根,如 servlet-context 和 root-context,它们不相互依赖。 STS 中的 Spring Explorer 视图变得清晰。 Tomcat 没有 JTA。
我的建议是通用的:在您的环境中运行 Pet Clinic,How to run Spring 3.0 PetClinic in tomcat with Hibernate backed JPA 或使用应用程序的 Roo 存根生成并尝试将您的配置与引用的配置进行比较。
【讨论】:
对于 JBoss 4.0 和 Hibernate,我通过在我的 EntityManagerFactoryBean 定义中添加一些事务管理器属性来解决这个问题:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="xaDs" />
<property name="jpaProperties">
<props>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory
</prop>
<prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup
</prop>
</props>
</property>
我找到了解决方案on this message board thread。
【讨论】:
我终于通过添加修复了这个错误
<tx:annotation-driven mode="aspectj" transaction-manager="yourTransactionManager" />
进入我的 application-context.xml
【讨论】: