如何捕获完整性约束删除错误?

时间:2016-10-31 12:47:10

标签: spring hibernate

有两个数据库表role和role_menu。 role_menu中有外键引用角色的主键。

现在我正在删除主表角色的一行,哪一行有一个在role_menu中关联的外键。我试图将删除代码包含在try catch中,但执行不会进入catch块:

@Override
@Transactional
public void delete(String role_code) {
    try {
    sessionFactory.getCurrentSession().delete((Role) sessionFactory.getCurrentSession().get(Role.class, role_code));
    } catch (Exception e) {
        System.out.println("error : there is fk !");
    }

}

在控制台中我得到了这些文字:

WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 2292, SQLState: 23000
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ORA-02292: integrity constraint (PTA.FK_ROLE_MEN_R_ROLE_ME_ROLE) violated - child record found

那么如何处理完整性约束删除错误?

1 个答案:

答案 0 :(得分:1)

问题来自这样一个事实:只有在事务提交之前会话对数据库进行刷新时才会引发异常。由于您使用的是@Transactional注释,因此它会在catch块之后的方法结束时发生。在try块结束时刷新会话应该可以解决问题:

@Override
@Transactional
public void delete(String role_code) {
    try {
        Session session = sessionFactory.getCurrentSession();
        session.delete((Role) session.get(Role.class, role_code));
        session.flush();
    } catch (Exception e) {
        System.out.println("error : there is fk !");
    }
}

请注意,最好避免在那里使用flush并在另一个级别捕获异常,但这取决于用例。