首先,我使用 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/