这是我的要求:
所以我可能的解决方案如下所示:
不起作用的解决方案:
答案 0 :(得分:0)
我认为唯一的解决方案是让每个安装都提供所有子类的列表,并有一个循环遍历这些类的方法,选择所有具有即将被删除的父类的实例,并删除他们:
public void deleteAllChildren(Parent p) {
List<Class<?>> classes = getListOfChildClassesFromSomewhere();
for (Class<?> clazz : classes) {
String hql = "select c from " + clazz.getName() + " where c.parent = :parent";
Query q = session.createQuery(hql).setParameter("parent", parent);
List<Object> children = (List<Object>) q.list();
for (Object child : children) {
session.delete(child);
}
}
}
您也可以直接使用删除HQL查询,但这会绕过会话。
如果每个sublcass使用不同的字段/属性名称引用父级,则将子类列表转换为Map<Class<?>, String>
,其中String值是子类的父字段/属性名称。
如果您可以选择让所有子节点继承一个@MappedSuperClass带注释的类,其中父字段被声明并映射,您可以执行一个返回所有子节点的查询:
select child from ChildMappedSuperClass child where child.parent = :parent
但由于Java只支持单继承,因此可能不是一种选择。