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

标签 java hibernate logging jboss

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

相关文章:

asp.net - Orchard CMS 如何进行日志记录?

java - 如何提高 Flink 中数据流实现的不同计数?

java - 我可以在运行时更改 create SQL Query 的 Lazy 属性值吗?

java - 使用 GenerationType.TABLE 在重新启动时 hibernate 重复主键

java - hibernate一对多将子对象与父关系分离

logging - log4net 常见附加程序设置

java - 如何一次设置所有 Java Swing GUI 组件背景和前景(字体)颜色?

java - JPanel 图像和组件

java - getClassLoader().getResourceAsStream() 如何在 Java 中工作

java - Tomcat 没有为其内部日志记录选择 Log4j 配置