如何解决在Hibernate事务中执行jOOQ语句
假设我同时使用Hibernate(JPA)和jOOQ来保持数据持久性。
我想通过EntityManager打开事务来做一些工作。
然后,在使用EntityManager打开的同一事务中,我使用jOOQ来选择和更新几个表,然后提交或回滚以上所有操作。
我不使用Spring或任何其他容器事务管理器。
try {
entityManager.getTransaction().begin();
//do JPA stuff here fetch from FB update entity
DLSConext - want to use JOOQ DSL for crud operation
em.getTransaction().commit()
} catch (Exception e) {
em.getTransaction().rollback(); //All Hibernate and jooq operation should rool back
}
修改 那我该怎么办呢? 例如,假设我使用jOOQ进行一些更新,然后我希望Hibernate找到一个实体,但是我也希望Hibernate在获取实体之前先看到jOOQ完成的更新几行。
解决方法
这并非真正针对jOOQ,而是适用于JPA与本机SQL的所有混合。在运行任何jOOQ(或JDBC等)查询之前,必须确保刷新所有Hibernate的缓存。
如果您直接使用jOOQ执行查询,则可以在jOOQ的ConnectionProvider
SPI内执行此操作,每次jOOQ想要执行查询之前,jOOQ都会调用该SPI。或者,也可以像这样使用Hibernate的Session.doWork()
API:
public static Work jOOQWork(Session session,Consumer<DSLContext> consumer) {
session.flush();
session.doWork(connection -> consumer.accept(DSL.using(connection)));
}
然后:
jOOQWork(session,ctx ->
ctx.insertInto(TABLE)
.columns(TABLE.COL)
.values(1)
.execute()
);
请注意,这里Session.flush()
是必需的,尽管可能不是必须的,请参阅https://hibernate.atlassian.net/browse/HHH-14209
如果您通过EntityManager::createNativeQuery
,EntityManager::flush
should be called automatically for you执行查询。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。