遇到异常后坚持实体

时间:2013-07-19 19:42:01

标签: spring hibernate jpa transactions

如果在持久化实体X时抛出异常,则在catch块中可以调用另一个方法来持久保存某个实体Y吗?

@Transactional(propagation = Propagation.REQUIRED)
private X addNewX(X transientX) {
    X x = null;
    try {
        x = xDao.makePersistent(transientX); // A DB constraint will be violated and Hibernate throws PersistenceException
    } catch (RuntimeException e) {
        createErrorRecord(transientX, e.getMessage());
    }
    return x;
}

保存有关错误的额外信息:

@Transactional(propagation = Propagation.REQUIRED)
private void createErrorRecord(X x, String errMsg) {
    try {
        ImportError error = new ImportError(x.getBlah(), x.moreBlah(),
                errMsg);
        impErrDao.makePersistent(error);
    } catch (RuntimeException re) {
        logger.error(re.toString());
    }
}

但是,ImportError永远不会被持久化。我为noRollbackFor尝试PersistenceException,但无济于事。

这里有什么可以做的吗? 感谢

1 个答案:

答案 0 :(得分:0)

使用AOP记录此类异常似乎是正确的选择。