2012-01-03 11 views
0

Hibernate 3.6.8.FinalとSpring 3.0.5.RELEASEを使用して、特定のクラスを実装するために上書きされた複数の実装を持つクラスのCommon DAO機能をいくつか追加しようとしていますDetachedCriteriaで働いている。インターフェイスでDetachedCriteriaを使用するHibernate

例:基本クラスで

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

と春/ Hibernateは、それが特定のプロジェクトでの具体的な継承からICATのための注釈を引っ張ることを知っています。

は、しかし、私がやろうとします

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

は、私がICATのための実行時に不明なエンティティを取得します。それは

criteria.list() 

をやろうとしたときにDetachedCriteriaをしかしそれエラー静的メソッドであるのに対し、それは必要なすべての構成を有しているので、

さて、これは最初のインスタンスのように理にかなっているが、セッションをそれを作成していますそれまでにセッションを選択し、ICatが実際にすべての注釈を持つSquawkyMeowingCatであることを知る必要があります。

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

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

に関する通常の警告で例示的なコード・スピップットの堅牢性。

関連する問題