【问题标题】:Exception handling in EJB with Container Managed Transaction using Hibernate使用 Hibernate 在 EJB 中使用容器管理事务处理异常
【发布时间】:2019-09-30 02:19:45
【问题描述】:

我在使用容器管理事务在 EJB 中捕获休眠异常时遇到问题。

package com.somepackage;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyBusiness {
   @EJB
   Archiver archiver;

   public void doSomething(Request request) {
       try {
             Response response = new Response();
             archiver.archive(request, response);
       } catch (Exception e) {
             e.printStackTrace();
       }
   }
}

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class Archiver {
    @EJB
    private RequestManager requestManager;
    @EJB
    private ResponseManager responseManager;

    public void archive(Request request, Response response) {
        try {
            requestManager.create(request);
            responseManager.create(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ResponseManager {
    @PersistenceContext(unitName = "datasource")
    private EntityManager entityManager;

    public void create(Response response) {
        try {
            entityManager.persist(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class RequestManager {
    @PersistenceContext(unitName = "datasource")
    private EntityManager entityManager;

    public void create(Request request) {
        try {
            entityManager.persist(request);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

问题是我无法捕获 ConstraintViolationException 等异常。虽然我可以在 Weblogic 控制台中看到错误日志,但我的捕获仅报告事务回滚,仅此而已。

//控制台日志

2019 年 5 月 13 日上午 10:58:09 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 警告:SQL 错误:1400,SQLState:23000 2019 年 5 月 13 日上午 10:58:09 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 错误:ORA-01400:无法将 NULL 插入 ("SCHEMA"."REQUEST"."REF_EXCEPTION_ID")

////日志到此结束

任何帮助将不胜感激。

【问题讨论】:

    标签: hibernate ejb weblogic12c


    【解决方案1】:

    您应该像这样捕获 ConstraintViolationException:

    try {
        // your logic...
    } catch (EJBTransactionRolledbackException e) {
        Throwable t = e.getCause();
        while ((t != null) && !(t instanceof ConstraintViolationException)) {
            t = t.getCause();
        }
        if (t instanceof ConstraintViolationException) {
            // Handle ConstraintViolationException...
        }
    }
    

    【讨论】:

    • 如您所见,我已经尝试在我的 Archiver、RequestManager 和 ResponseManager 中捕获异常,但控制从未到达那里。我唯一能看到异常的地方是 MyBusiness 类,它的类型是 TransactionRolledbackLocalException,不幸的是它的原因是 weblogic.transaction.internal.AppSetRollbackOnlyException 的一个实例。
    【解决方案2】:

    我找到了解决方案here

    我只需要在我的 Weblogic Env 中设置它。

    set JAVA_OPTIONS=%JAVA_OPTIONS% -Dweblogic.transaction.allowOverrideSetRollbackReason=true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      相关资源
      最近更新 更多