继承实体的最佳存储库/ DAO

时间:2014-04-01 18:39:09

标签: java spring hibernate inheritance

在我的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 QueryInheritedClass1_FindByName

1 个答案:

答案 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()