在 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::createNativeQuery
、EntityManager::flush
should be called automatically for you.
执行查询
假设我同时使用 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::createNativeQuery
、EntityManager::flush
should be called automatically for you.