gpt4 book ai didi

jakarta-ee - 如何判断事务在 Java EE 6 拦截器中是否处于事件状态?

转载 作者:行者123 更新时间:2023-12-04 13:33:20 25 4
gpt4 key购买 nike

我打算为 EJB 编写一个拦截器,它基本上会执行以下操作:

@AroundInvoke
public Object setContext(InvocationContext ctx) throws Exception {
em.createQuery("... set something [database specific] ...").getSingleResult();
try {
return ctx.proceed();
} finally {
em.flush();
em.createQuery("... unset something [database specific] ...").getSingleResult();
}
}

问题是 em.flush() 如果应用于使用 @TransactionAttribute(NOT_SUPPORTED) 或 @TransactionAttribute(SUPPORTS) 注释的方法(即只读方法),则会引发异常,而使用默认 @ TransactionAttribute(REQUIRED)(即更改数据库的方法)。

有没有办法判断事务是否处于事件状态为了避免在当前没有事务运行时调用 em.flush(),或者我必须创建两个拦截器,一个带有 em.flush(),一个没有它?

我无法注入(inject) UserTransaction,因为 bean 使用容器管理的事务。 EntityManager 的 (em) 事务方法仅适用于 resource_local 事务,不适用于 JTA 事务。我需要 em.flush() 调用以确保未设置的查询是运行的最后一件事。

作为奖励问题,有谁知道我想要做的是否是某种不好的做法?我知道拦截器在与 bean 相同的上下文中运行,因此通过数据库 session 共享内容是安全的,但我必须非常小心地在退出时取消设置所有内容,因为连接被汇集在容器中。

最佳答案

您可以注入(inject) TransactionSynchronizationRegistry并使用 getTransactionStatus要获取当前上下文中的事务状态,它会返回 int这是 Status 中的一个常量类,在您的情况下,您正在寻找 STATUS_NO_TRANSACTION
注入(inject):

@Resource
TransactionSynchronizationRegistry tsr;

检查交易状态:
if (Status.STATUS_NO_TRANSACTION == tsr.getTransactionStatus()) {
// no transaction
}

关于jakarta-ee - 如何判断事务在 Java EE 6 拦截器中是否处于事件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14004504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com