在我的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_FindByNameInheritedClass2FindByName)。

最佳答案

您可以使用泛型来制作单个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()

10-07 12:01