在Seam中的事务提交中捕获异常

时间:2012-12-03 06:22:05

标签: java jpa seam

每次用户点击删除按钮删除内容时,我都会调用

em.remove(entity)

如果仍然存在对此实体的引用约束,我会看到抛出PersistenceException,我可以捕获它以注意用户。

但是,这只适用于我在代码中可以看到的关系。例如:

A has an OneToMany relationship to B

在一些特殊情况下,这种关系不会反映在代码中。例如:

Table A has a foreign key to Table B. But in code, there is no XtoX relationship between them

在这些情况下,我无法捕获上面提到的PersistenceException,这会使异常在屏幕上显得非常难看。

我认为在事务提交时出现异常。

无论如何都能抓住它吗?

2 个答案:

答案 0 :(得分:2)

在JPA中,em.flush()方法可用于捕获异常。完成此操作后,如果遇到问题,您将收到异常。

例如:

public void insert(Group group) {
    try {
        em.persist(group);
        em.flush();
    } catch (PersistenceException pe) {

    }
}

答案 1 :(得分:0)

我会考虑使用Seam的(2.x)异常处理工具来处理未捕获的异常 - 例如打印错误消息和/或重定向到错误页面 - 而不是可能为此目的耦合与持久性相关的逻辑。即使您仍想要刷新持久性上下文,这仍然可以为您提供更多的错误处理实现方法。见exception handling in the Seam documentation。根据应用程序的需要,可以扩展Seam ExceptionHandler类以进行进一步的自定义。见this related answer