在 Hibernate 事务中执行 jOOQ 语句

Executing jOOQ statements inside Hibernate transaction

假设我同时使用 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, which is invoked by jOOQ every time just before jOOQ wants to execute a query. Or, alternatively, use Hibernate's 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::createNativeQueryEntityManager::flush should be called automatically for you.

执行查询