【问题标题】:try to catch persist exception尝试捕获持久异常
【发布时间】:2015-05-05 08:50:39
【问题描述】:

简单的问题。这是代码:

public void insertDefacer(Defacer defacer) {
    try {
        em.persist(defacer);
    } catch (PersistenceException | DatabaseException e) {
        defacer = em.find(Defacer.class, defacer.getIdentity());
        defacer.setStats(defacer.getStats() + 1);
        em.merge(defacer);
    }
}

defacer 已存在于数据库 (mysql) 中时,persist 操作会引发异常(PersistenceException 和/或 DatabaseException)。看起来很正常。所以我想捕捉这些异常并威胁它们。但是在记录这些异常之后,我的程序突然结束(没有完成该方法)。

为什么?

详细信息(可能重要或不重要):emEntityManager 通过 @PersistenceContext

【问题讨论】:

  • 你从哪里调用完成方法?
  • 我希望我的捕获运行。但事实并非如此。
  • 我怀疑另一个Exception 正在您的catch 块内发生。通常,您的程序应该继续运行,因此您的EntityManager 可能会发生一些事情来防止这种情况发生。
  • 哦,好的,捕获它没有被执行,同意@TimBiegeleisen。
  • 等待 2 分钟,伙计们,我测试@TimBiegeleisen 的解决方案。看起来不错。

标签: java mysql jpa


【解决方案1】:

我找到了替代方案。看代码就行了:

 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void insertDefacer(Defacer defacer) {

   Defacer df = em.find(Defacer.class, defacer.getIdentity());
   if(df == null) {
      em.persist(defacer);
      System.out.println("Save");
   } else {
      em.merge(defacer);
      System.out.println("Update");
   }

}

正如我所说,这是一个姑息性解决方案。感谢您的帮助。

【讨论】:

    【解决方案2】:

    您是否正在尝试通过这种方式获取 EntityManager?

    @PersistenceContext
    private EntityManager em;
    
    public EntityManager getEntityManager() {
    return em;
    }
    
    public void setEntityManager(EntityManager em) {
    this.em = em;
    }
    

    【讨论】:

    • 我不明白,为什么你认为在获得EntityManager时,情况会有所不同?我需要解释。
    【解决方案3】:

    您不应该在catch 子句中使用您的EntityManager,因为它可能处于损坏状态。 JPA 中的异常是不可可恢复的,因此您应该假设如果发生异常,您的事务不能也不会完成。

    public void insertDefacer(Defacer defacer) {
        EntityTransaction tx = null;
        try {
            tx = em.getTransaction();
            tx.begin();
            em.persist(defacer);
            tx.commit();
        } catch (Exception ex) {
            if(tx != null && tx.isActive()) tx.rollback();
        } finally {
            em.close();
        }
    }
    

    【讨论】:

    • 如果 persist 有效,您的代码将执行 merge。我不想那样。
    【解决方案4】:

    确保 PersistenceExcetion 属于 hibernate 包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 2011-12-05
      • 2014-05-11
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多