hibernate检查删除约束


问题内容

我正在使用Spring-
Hibernate来控制应用程序中的模型。这些模型相互链接(一对多,多对多,几乎各种关系),现在删除一个由其他实体使用的实体时出现问题。问题是我想显示详细消息,以准确告知其他哪些对象(类型,名称)正在使用我要删除的实体。Hibernate抛出的不是关于约束违规的常见消息。
例如:Car --> Person, House --> Person;
然后,当我删除一个有汽车和房屋的人时,消息将显示“有与该人链接的汽车(名为福特野马)和房屋(名为MyHouse)”。
1.那么Hibernate是否有任何方法支持此要求?我想没有针对此特定要求的实现。
2.如果没有任何可用于此问题的实用程序,我正在考虑以下解决方案:
-在每个实体类(即Person)中,我将定义所有检测方法来检测从该实体到其他实体的链接,例如:

class Person {
     // Properties
     // Checking methods, return type and name of linked objects
     public Map<String, String> getLinkedCars() {
         // Query to DB to get linked cars
         // return a Map contain Class name along with object name <Car, Ford Mustang>
     }

     public Map<String, String> getLinkedHouses() {
         // Query to DB to get linked houses
         // return a Map contain Class name along with object name <House, MyHouse>
     }
}

-然后,在删除Person实体之前的服务中,我将使用反射机制从检查方法(其名称以“ getLinkedXXX”开始的名称)中收集结果,并生成详细错误消息。
那么这个解决方案好吗?关于性能和MVC的约定(因为我必须在模型类内部查询数据)?
感谢您的帮助。


问题答案:

一种(不是那么简单)的方法是扫描您的实体类的字段@OneToMany或带@ManyToMany注释的字段并执行检查,以便可以向用户提供简洁的错误消息。以下示例代码假定您仅注释字段,而不注释getters方法,例如:

public class Person {
  @OneToMany(..)
  private List<House> houses;
  //...
}

首先使用反射获取所有字段的列表:

Fields[] fields = Person.class.getDeclaredFields();

然后迭代并检查@OneToMany@ManyToMany注释

for(Field f : fields) {
   if( f.getAnnotation(OneToMany.class) != null || 
       f.getAnnotation(ManyToMany.class) != null) {
     // Here you know f has to be checked before the person is deleted ...
   }
}

特定人员对象的字段值可以使用以下方法获得:

Person p = // fetch a person ..
Field f = // assume f is the "List<House> houses" field
List<House> houses = (List<House>) f.get(p);