簡體   English   中英

使用帶有接口的DetachedCriteria進行休眠

[英]Hibernate using DetachedCriteria with interfaces

我正在使用Hibernate 3.6.8.Final和Spring 3.0.5.RELEASE,為具有多個實現的類添加一些Common DAO功能,這些實現被上層覆蓋以實現特定的類,但不適用於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獲得了一個未知實體。

現在這很有意義,因為首先是在Session之外創建它,因此它具有所需的所有配置,而DetachedCriteria是靜態方法,但是在嘗試執行以下操作時會出錯

criteria.list()

到那時它已經開始了Session並應該知道ICat實際上是一個帶有所有注釋的SquawkyMeowingCat。

所以我的問題分為兩部分:

1)這是已知的行為,並且會永遠如此嗎?

2)誰能想到一種簡單的方法,而無需使用接口和具體的ClassHolder來交出需要創建的類的實例?

我不確定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;
}

關於說明性代碼片段健壯性的常見警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM