2016-10-31 47 views
0

有两个数据库表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

问题来自事实,即仅在事务提交之前将会话刷新到数据库时引发异常。由于您使用的是@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 !"); 
    } 
} 

注意,这可能是最好避免使用冲洗那里捕获异常在另一个层面,但是这取决于使用情况。

+0

因为事务已经被标记为回滚,所以你不能在另一个级别捕获它。无论如何,这一切都是一个非常糟糕的主意,并打破了几个原则。 http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html“如果会话引发异常,则必须回滚事务并丢弃会话。会话的内部状态发生异常后可能与数据库不一致。“ – Gab

+0

在另一个级别捕获异常意味着事务也在其他级别创建,然后传播到此函数中。 –

相关问题