在我的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的最佳方法是什么?因为它们将包含公共字段(例如,可能最终会实现
findByName
DAO方法)。我的主要观点是避免对所有继承的类实施相同的
findByName
,因为唯一的区别是Named Query
的名称(即InheritedClass1_FindByName
和InheritedClass2FindByName
)。 最佳答案
您可以使用泛型来制作单个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();
}
显然,如果名称不是唯一的,则需要调用crit.list()而不是uniqueResult()