0

Hibernate3.6.8.FinalとSpring3.0.5.RELEASEを使用して、特定のクラスを実装するために複数の実装がオーバーライドされたクラスにいくつかの共通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の不明なエンティティを取得します。

これは、最初のインスタンスがセッションから作成しているので意味があり、必要なすべての構成がありますが、DetachedCriteriaは静的メソッドですが、実行しようとするとエラーになります。

criteria.list()

その時点でセッションを取得し、ICatが実際にはすべての注釈を持つSquawkyMeowingCatであることを知っている必要があります。

だから私の質問は2つの部分です:

1)これは既知の動作であり、これからもずっとこのようになりますか?

2)作成する必要のあるクラスのインスタンスを返す、インターフェイスと具体的なClassHolderを使用せずに、簡単な方法を考えられるでしょうか。

4

1 に答える 1

0

DetachedCriteriaの場合についてはよくわかりませんが、具象クラスへの明示的な依存を回避する1つの方法は、インターフェースを使用して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;
}

実例となるコードスピペットの堅牢性に関する通常の警告があります。

于 2012-01-05T15:05:25.137 に答える