我有一个Spring Data JPA应用程序,每当我尝试进行交易时,我都会得到javax.persistence.TransactionRequiredException: no transaction is in progress
.
我相信它与事务管理器或实体管理器工厂有关,但不能指望它。
<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" />
这里有一个示例存储库,然后在此处创建了一个存储库工厂,我不确定是否需要...然后在此处使用它(第 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
。但是,在这个测试用例中,它是自动装配的并且可以工作。
有没有人遇到过类似的问题并且知道发生了什么?非常感谢您花时间阅读本文。希望这个问题的答案能帮助其他人。