Java Hibernate和jOOQ共享事务
我试图将jOOQ与hibernate放在现有的大型服务中。代码的工作方式与其他代码一样,只存在一个问题:jOOQ查询似乎不受Spring事务的影响(基于注释的方法) 问题是在同一个调用堆栈中有一些hibernate操作(存储库),jOOQ看不到这些实体,而hibernate看到这些实体。 我怀疑问题出在bean定义、单独的事务管理器或其他方面。 请注意,我使用的不是Spring机器人应用程序,而是“普通”Spring(版本5.0.8-RELEASE) 配置是从Spring自动配置复制的:Java Hibernate和jOOQ共享事务,java,spring,hibernate,jooq,Java,Spring,Hibernate,Jooq,我试图将jOOQ与hibernate放在现有的大型服务中。代码的工作方式与其他代码一样,只存在一个问题:jOOQ查询似乎不受Spring事务的影响(基于注释的方法) 问题是在同一个调用堆栈中有一些hibernate操作(存储库),jOOQ看不到这些实体,而hibernate看到这些实体。 我怀疑问题出在bean定义、单独的事务管理器或其他方面。 请注意,我使用的不是Spring机器人应用程序,而是“普通”Spring(版本5.0.8-RELEASE) 配置是从Spring自动配置复制的: @配置
@配置
公共类自动配置{
@豆子
公共数据源连接提供程序数据源连接提供程序(数据源数据源){
返回新的数据源连接提供程序(新TransactionWaredataSourceProxy(数据源));
}
@豆子
公共SpringTransactionProvider transactionProvider(PlatformTransactionManager txManager){
返回新的SpringTransactionProvider(txManager);
}
@豆子
@订单(0)
public DefaultExecuteListenerProvider jooqExceptionTranslatorExecuteListenerProvider(){
返回新的DefaultExecuteListenerProvider(新的JooqExceptionTranslator());
}
@配置
公共静态类DslContextConfiguration{
私有最终连接提供者连接;
私有最终数据源数据源;
私人最终交易提供人交易提供人;
私人最终记录MapperProvider RecordMapperProvider;
私有最终记录取消映射提供程序记录取消映射提供程序;
私人最终设置;
私人最终记录提供者[]记录提供者;
私人最终执行董事提供人[]执行董事提供人;
私人最终访问ListenerProvider[]访问ListenerProviders;
私有最终TransactionListenerProvider[]transactionListenerProviders;
私人最终执行人;
公共DslContextConfiguration(ConnectionProvider ConnectionProvider,
数据源数据源,对象提供程序transactionProvider,
ObjectProvider recordMapperProvider,
ObjectProvider记录取消映射提供程序,ObjectProvider设置,
ObjectProvider recordListenerProviders,
ExecuteListenerProvider[]executeListenerProviders,
ObjectProvider visitListenerProviders,
ObjectProvider transactionListenerProviders,
对象提供程序(执行程序提供程序){
this.connection=connectionProvider;
this.dataSource=数据源;
this.transactionProvider=transactionProvider.getIfAvailable();
this.recordMapperProvider=recordMapperProvider.getIfAvailable();
this.recordUnmapperProvider=recordUnmapperProvider.getIfAvailable();
this.settings=settings.getIfAvailable();
this.recordListenerProviders=recordListenerProviders.getIfAvailable();
this.executeListenerProviders=executeListenerProviders;
this.visitListenerProviders=visitListenerProviders.getIfAvailable();
this.transactionListenerProviders=transactionListenerProviders.getIfAvailable();
this.executoprovider=executoprovider.getIfAvailable();
}
@豆子
公共默认dslContext dslContext(org.jooq.Configuration){
返回新的DefaultDSLContext(配置);
}
@豆子
public DefaultConfiguration jooqConfiguration(){
DefaultConfiguration=新的DefaultConfiguration();
set(sqldial.MYSQL);
configuration.set(这个连接);
if(this.transactionProvider!=null){
configuration.set(this.transactionProvider);
}
if(this.recordMapperProvider!=null){
configuration.set(this.recordMapperProvider);
}
if(this.recordUnmapperProvider!=null){
configuration.set(this.recordUnmapperProvider);
}
如果(this.settings!=null){
配置.set(此.settings);
}
if(this.executorProvider!=null){
configuration.set(此.executorProvider);
}
configuration.set(this.recordListenerProviders);
set(this.executeListenerProviders);
set(this.visitListenerProviders);
configuration.setTransactionListenerProvider(this.transactionListenerProviders);
返回配置;
}
}
}
如果您让Spring Boot配置jOOQ的DSLContext
,并且在幕后配置配置和连接提供程序,那么您不应该有事务性问题。但是,请注意,Hibernate可能没有将应用于其缓存的更改刷新到数据库中,jOOQ只直接查询数据库,而不是任何Hibernate缓存
因此,在运行任何jOOQ(或JDBC,或其他本机SQL查询)之前,必须确保始终刷新Hibernate的会话。如果让Spring Boot配置jOOQ的DSLContext
,并且在幕后配置配置和连接提供程序
,那么就不会有事务问题。但是,请注意,Hibernate可能没有将应用于其缓存的更改刷新到数据库中,jOOQ只直接查询数据库,而不是任何Hibernate缓存
因此,您必须确保在运行之前总是刷新Hibernate的会话