Cha*_*ith 3 spring hibernate spring-transactions spring-data-jpa spring-java-config
我正在尝试将spring xml配置转换为java配置.这通过XML配置完美地工作.但是,如果我使用java config initializer,它会抛出以下异常.当它尝试运行JQL时会发生这种情况.应用程序正常启动(初始化所有JPA映射).
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:410) [spring-orm-4.1.5.RELEASE.jar:4.1.5.RELEASE]
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:216) [spring-orm-4.1.5.RELEASE.jar:4.1.5.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417) [spring-orm-4.1.5.RELEASE.jar:4.1.5.RELEASE]
at org.springframework.dao.support.ChainedPersistenceExceptionTranslat
Run Code Online (Sandbox Code Playgroud)
以下是我的持久化初始化类.一点点阅读建议我这与交易没有正确启动有关.我已经将调试点放到这些方法中,但是在服务器启动期间或之后的任何时间都不会执行transactionManager方法.我不确定我做错了什么:(.当通过persistence.xml初始化持久性时,基于相同代码的工作非常完美.
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "au.mypkg")
public class DatabaseConfig {
@Bean(name = "dataSource")
@Primary
public DataSource dataSource() throws Exception {
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:jboss/datasources/mydb");
}
@PersistenceContext(unitName = "persistenceUnit")
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws Exception {
..........
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
final JtaTransactionManager transactionManager = new JtaTransactionManager();
transactionManager.setTransactionManagerName(JBOSS_TRANSACTION_MANANGER);
return transactionManager;
}
Run Code Online (Sandbox Code Playgroud)
在Dao上访问此方法时发生错误
public void updateById(final Long id) {
final String sqlQuery = "UPDATE testtable w SET w.LAST_ACCESSED = :date WHERE w.testtable_ID = :testid";
final Query query = dao.createNativeQuery(sqlQuery);
query.setParameter("date", new Date());
query.setParameter("testid", id);
query.executeUpdate();
}
Run Code Online (Sandbox Code Playgroud)
Sal*_*idi 10
我有一些问题,我通过在执行删除或更新的服务方法上添加@Transactional注释来解决它.在我的情况下,它是一个方法,调用一个存储库方法,执行这样的jpql删除,我认为它也可以解决你的问题:
@Modifying
@Query("delete from OtherPayment otherPayment " +
"where otherPayment.otherPaymentParam.id = :otherPaymentParamId")
void deleteByOtherPaymentParamId(@Param("otherPaymentParamId") Long otherPaymentParamId);
Run Code Online (Sandbox Code Playgroud)
终于明白这是怎么回事了。这没有达到调试点的原因是,EnableTransactionManagement 强制为您自动配置事务。因此,如果您的事务管理器配置了默认名称(在我的例子中),它不会尝试调用我的方法来配置事务。解决这个问题的唯一方法是为事务管理器使用不同的名称,并将该引用作为参数传递到enableJPARepositories 注释上。如果您使用默认名称之一,则不会进行此调用。
@Primary
@Bean(name = "myRealTransactionManager")
public PlatformTransactionManager transactionManager() {
final JtaTransactionManager transactionManager = new JtaTransactionManager();
transactionManager.setTransactionManagerName(JBOSS_TRANSACTION_MANANGER);
return transactionManager;
}
Run Code Online (Sandbox Code Playgroud)
.. 进而
@EnableJpaRepositories(basePackages = "au.mypkg", transactionManagerRef = "myRealTransactionManager"
Run Code Online (Sandbox Code Playgroud)
另一个问题是我在 LocalContainerEntityManagerFatoryBean 上使用了 setdatasource 而不是 setJtaDataSource。
| 归档时间: |
|
| 查看次数: |
8591 次 |
| 最近记录: |