gpt4 book ai didi

java - JBoss 在托管事务时提交事务

转载 作者:行者123 更新时间:2023-12-01 13:16:49 25 4
gpt4 key购买 nike

首先,我使用 Eclipse、JBoss 应用程序服务器和 SQL Server 数据库。我正在从事的项目是处理 Java bean。我正在使用 hibernate 创建和更新数据库。

我想要实现的目标:每次用户创建(保留)“EntityClass”(见下文)时,我想在数据库中的不同表中插入有关创建的信息。

我的(当前未工作)解决方案:

我正在使用拦截器类来拦截 java Session bean 中的方法,如下所示;

@Interceptors(MyInterceptorClass.class)
public EntityClass createEntityClass(EntityClass e) {
em.persist(e);
return e;
}

我的 InterceptorClass 看起来像这样:

public class MyInterceptorClass{    

@AroundInvoke
public Object logMethod(InvocationContext iCtx) throws Exception {
Logger logger = new Logger();
logger.setAction("create");
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.save(logger);
session.getTransaction().commit()
return iCtx.proceed();
}

我的 Logger 类是一个实体 java bean,当我的拦截器拦截目标方法时,我想将其持久化到数据库,如您所见。记录器代码:

@Entity
@Table(name = "auditlog")
public class Logger implements Serializable {
private int auditLogId; //auto-increment in DB
private String action;
...
//setters and getters with proper mapping to the related database table
}

正如您现在可能已经发现的那样,cointainer 向我抛出一个异常,表示我无法在托管事务期间提交。有没有办法让我在不开始新交易的情况下做到这一点?

我已经尝试过:

*将记录器类上的事务属性更改为 REQUIRES_NEW

*使用 session bean @PreDestroy 回调方法保留记录器对象

我愿意就如何解决这个问题提出建议。

最佳答案

我通过使用 Hibernate Envers 进行实体审计解决了这个问题。

http://docs.jboss.org/envers/docs/index.html#quickstart

感谢 user3360944 提示我正确的方向。

关于java - JBoss 在托管事务时提交事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22406862/

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