2013-06-30 100 views
1

我正在使用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的约定(因为我必须在模型类中查询数据)?
谢谢你的帮助。

+0

使用cascade = CascadeType.REMOVE – Masudul

+0

@MasudCSECUET那不只是删除它没有给出一个错误消息的任何信息? –

+0

使这些关联成为双向的,并且您将在Person实体中直接链接到汽车和房屋的集合。也就是说,我认为在任何情况下这都是不合理的。如果您删除了拨打3000个电话的人员和500个朋友,您不希望列出所有这些实体。 –

回答

1

一种(并非如此简单)的方法是扫描您的实体类为@OneToMany@ManyToMany带注释的字段并执行检查,以便向用户提供整洁的错误消息。下面的示例代码假设你只注释字段,不是的getter方法,如:

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);