Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate和jOOQ共享事务_Java_Spring_Hibernate_Jooq - Fatal编程技术网

Java Hibernate和jOOQ共享事务

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自动配置复制的: @配置

我试图将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的会话