【发布时间】:2012-02-10 01:04:58
【问题描述】:
我lookedaround 遇到类似问题,但找不到解决方案:
我有一个Spring Data JPA 应用程序,每当我尝试进行交易时,我都会收到javax.persistence.TransactionRequiredException: no transaction is in progress。
我认为它与事务管理器或实体管理器工厂有关,但无法确定。
上下文文件为here(最新签入为here),但重要的部分如下:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSourceMySQL" />
<property name="persistenceUnitName" value="spring-jpa" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="showSql" value="true" />
<property name="database" value="MYSQL" />
</bean>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<property name="dataSource" ref="dataSourceMySQL"/>
</bean>
<bean id="dataSourceMySQL" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/dbname"/>
<property name="username" value="user"/>
<property name="password" value="pass"/>
</bean>
<jpa:repositories base-package="com.simplecash.dal.repository" />
一个示例存储库是here,然后创建了一个存储库工厂here,我不确定是否需要... 然后使用它here(第 34 行)。
public void populateWithTestData() {
Bank bank = new Bank();
bank.setName("ContentName");
bank.setCode("ContentCode");
RepositoryFactory.getEntityManager().getTransaction().begin();
BankRepository bankRepository = RepositoryFactory.getRepository(BankRepository.class);
bankRepository.save(bank);
bankRepository.flush();
RepositoryFactory.getEntityManager().getTransaction().commit();
}
上面有几处是错误的,但我已经尝试修复它并且不能:
- 开始和提交事务是显式的。
-
bankRepository应该是@Autowired,但是当我这样做时,我会得到null。但是,在 this testcase 中,它是 Autowired 并且可以正常工作。
有没有人遇到过类似的问题并且知道发生了什么? 非常感谢您花时间阅读本文。希望这个问题的答案对其他人有所帮助。
【问题讨论】:
标签: java hibernate spring spring-data-jpa