我正在使用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")
我该怎么做?
答案 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表做同样的事。