在我的Hibernate + Spring项目中,我有几个实体非常相似;这就是我使用继承类型的原因:Table Per Class
。事情与此相似
class CommonEntity {
private Integer id;
private String name;
private String description;
// Constructors & Setters & Getters
}
class InheritedClass1 extends CommonEntity {
private boolean active;
// Constructors & Setters & Getters
}
class InheritedClass2 extends CommonEntity {
}
当我使用XML映射时,第一个继承类的映射包含CommonEntity和InheritedClass1字段/列。
到目前为止一切都很好。
这里的问题是,为继承的实体实现存储库/ DAO的最佳方式是什么?因为它们将包含公共字段(例如,可能最终会实现一个{ {1}} DAO方法)。
我的主要观点是避免为所有继承的类实现相同的findByName
,因为唯一的区别是findByName
的名称(即Named Query
和InheritedClass1_FindByName
)
答案 0 :(得分:0)
您可以使用泛型来制作一个DAO方法,该方法适用于扩展您的CommonEntity的任何类,如下所示:
public <T extends CommonEntity > T getByName(Class<T> clazz, String name) {
Criteria crit = sessionFactory.getCurrentSession().createCriteria(clazz, "named");
crit.add(Restrictions.eq("named.name", name));
return (T)crit.uniqueResult();
}
显然,如果name不是唯一的,你需要调用crit.list()而不是uniqueResult()