2014-04-01 48 views
1

在我的Hibernate + Spring項目中,我有幾個非常相似的實體;這就是爲什麼我使用繼承類型:Table Per Class。事情是由於我使用的XML映射與此類似繼承實體的最佳存儲庫/ DAO

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 { 

} 

,爲第1類繼承的映射同時包含CommonEntity和InheritedClass1字段/列。

目前一切都很好。

這裏的問題是,什麼是最好的方式來實現存儲庫/ DAO的繼承實體?由於它們將包含通用字段(例如,它可能最終會實現一個findByName DAO方法)。

我主要是爲了避免實現相同findByName所有繼承類作爲唯一的區別將是Named Query(即InheritedClass1_FindByNameInheritedClass2FindByName)的名稱。

回答

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(); 
} 

顯然,如果名稱不唯一,你會需要調用crit.list()而不是uniqueResult()

+0

是的,我正在考慮這種可能性,但我不是很確信...我面臨的問題可能非常普遍,所以我想這有一個更好的解決方案... 我也不得不說我的項目的主要目的是學習。這是學習Spring&Hibernate的個人「大」項目。那意味着什麼?我學得越多越好:) – kazbeel

+1

如果您正在尋找一種獲取大量通用​​dao功能的方法,而無需編寫大量代碼,那麼您應該查看[spring-data](http://spring.io/guides/gs/access-data-jpa /)項目,該項目允許您爲自動爲您執行的daos創建界面。有很多方法可以用來處理通用dao方法,所以很大程度上取決於數據模型以及訪問數據所需的方式,以確定哪種方式最好。 – jcmwright80

+0

這是一個非常有趣的項目(春季數據)。我沒聽說過!謝謝! 它看起來是基於JPA(它主要暗示Annotations的用法,但我使用Hibernate的XML映射,這會是一個問題嗎? – kazbeel