试着抓住持续异常

时间:2015-05-05 08:50:40

标签: java mysql jpa

简单的问题。这是代码:

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和/或{{1} })。这似乎很正常。所以我想抓住这些例外并威胁他们。但在记录这些异常后,我的程序突然结束(没有完成方法)。

为什么?

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

3 个答案:

答案 0 :(得分:0)

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

function flatten() {
    // variable number of arguments, each argument could be:
    // - array
    //   array items are passed to flatten function as arguments and result is appended to flat array
    // - anything else
    //   pushed to the flat array as-is
    var flat = [],
        i;
    for (i = 0; i < arguments.length; i++) {
        if (arguments[i] instanceof Array) {
            flat = flat.concat(flatten.apply(null, arguments[i]));
        } else {
            flat.push(arguments[i]);
        }
    }
    return flat;
}

// flatten([[[[0, 1, 2], [0, 1, 2]], [[0, 1, 2], [0, 1, 2]]], [[[0, 1, 2], [0, 1, 2]], [[0, 1, 2], [0, 1, 2]]]]);
//            [0, 1, 2,   0, 1, 2,     0, 1, 2,   0, 1, 2,       0, 1, 2,   0, 1, 2,     0, 1, 2,   0, 1, 2]

答案 1 :(得分:0)

我找到了另一种选择。只需看看代码:

 @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 :(得分:0)

确保PersistenceExcetion属于hibernate包。