如何检查任何对象是否与具有外键约束的表中的行相关

时间:2010-08-08 10:40:44

标签: java mysql hibernate

我正在使用Hibernate和MySql。

我有2张桌子:

User: id, name, type
City: id, name, type
type: id, name

其中user.type具有user_type.id的外键。以及城市。

我想在删除user_type表中的一行之前,检查来自任何表的任何行是否与它相关。

我的列被映射为例如:

@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "type_id")

我该怎么做?

2 个答案:

答案 0 :(得分:1)

你说

  

我有大约100个表,例如用户和城市映射到此值

确定。 Hibernate与JPA一书说

  

您可能已删除所有其他参考手动

这意味着您应该查询手动任何相关表格。但它表示,如果其他实体引用了Type,数据库约束可以防止任何不一致,并且您会看到外键约束异常。我认为这是你可以查看你想要的最好方法。否则,您应该手动查询任何相关的表。

try {
    userType = (Type) session.load(Type.class, id);

    session.delete(userType);
/**
  * or JDBCException 
  * e.getCause()
  * e.getErrorCode() - vendor-specific
  */
} catch (HibernateException e) {
    // checkout Exception right here e.getCause();
} 

Hibernate 抛出的所有异常都是致命的。这意味着您必须回滚数据库事务并关闭当前会话。所以你可能想要开一个新的会话。

答案 1 :(得分:0)

将本机SQL与Hibernate一起使用:

  boolean canDeleteType(ind type_id){
         Session s = HibernateUtil.getSessionFactory(); 
         s.beginTransaction();
         Query q = s.createQuery("SELECT User.type_id From User");
         List l = q.list();

    if(l.contains(type_id){
   return false;
}
return false;

}

也为你的City表做同样的事。