2012-01-03 55 views
0

使用Hibernate 3.6.8.Final和Spring 3.0.5.RELEASE,我想添加一些公共DAO功能的類有多個實現覆蓋較高的實現特定的類,但它doesn不適用於DetachedCriteria。休眠使用DetachedCriteria與接口

實施例:

在基類:

public interface ICat { 
    public void setMeowSound(String meow); 
    public String getMeowSound(); 
} 

然後,每個繼承項目將定義休眠註釋。

例如

@Entity 
@Table(name="SQUAWKY_CATS") 
public class SquawkyMeowingCat implements ICat, Serializable { 
    @Id 
    @Column(name="SQUAWK_NAME") 
    private String meow; 

    public String getMeowSound() { 
     return meow; 
    } 

    public void setMeowString(String meow) { 
     this.meow = meow; 
    } 
} 

這意味着我可以使用:

Criteria criteria = Session.createCriteria(ICat.class); 

和Spring/Hibernate知道它拉了爲ICat註釋從具體項目的具體繼承。

但是,如果我嘗試做:

DetachedCriteria subQuery = DetachedCriteria.forClass(ICat.class,"inner"); // etcetera 

然後我在運行時爲ICat得到一個未知的實體。

現在這個有意義的,因爲在第一個實例創建其關閉會話,因此已經嘗試做

criteria.list() 

當所有的,它需要而的DetachedCriteria的配置是一個靜態方法但它的錯誤到那個時候它已經拿起Session並且應該知道ICat實際上是一個SquawkyMeowingCat,它具有所有的註釋。

所以我的問題有兩個部分:

1)這是已知的行爲,並會永遠這樣嗎?

2)任何人都可以想到一個簡單的方法,而不使用一個接口和具體的ClassHolder,它返回它需要創建的類的實例嗎?

回答

0

我不知道有關的DetachedCriteria的情況下,但要避免在混凝土類明確依賴一種方法是在使用界面來查詢Hibernate的元數據:

public <T> Class<? extends T> findEntityClassForEntityInterface(
    SessionFactory sessionFactory, 
    Class<T> entityInterface 
) { 
    for (ClassMetadata metadata : sessionFactory.getAllClassMetadata().values()) { 
     Class entityClass = metadata.getMappedClass(EntityMode.POJO); 
     if (entityInterface.isAssignableFrom(entityClass)) { 
      return entityClass; 
     } 
    } 
    return null; 
} 

隨着對平時的注意事項說明性代碼片段的健壯性。