11

基本的なクラッド操作を実行するパラメーター化された休止状態のdaoがあり、パラメーター化された場合、特定のdaoの基本的なクラッド操作を実行するためのデリゲートとして使用されます。

public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>

実行時にTからClassを派生させて、Hibernateで次のような基準クエリを作成できるようにしたいと思います。

public T findByPrimaryKey(ID id) {
    return (T) HibernateUtil.getSession().load(T.getClass(), id);
}

知っている:

T.getClass()

は存在しませんが、実行時にTから正しいClassオブジェクトを派生させる方法はありますか?

私はジェネリックスとリフレクションを見てきましたが、適切な解決策を思いつきませんでした。おそらく何かが足りません。

ありがとう。

4

2 に答える 2

17

クラスをコンストラクター引数として渡すことができます。

public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID> {

    private final Class<? extends T> type;

    public HibernateDao(Class<? extends T> type) {
        this.type = type;
    }

    // ....

}
于 2009-04-29T11:38:29.047 に答える
7

リフレクションを使用してclass型引数を理解する方法は次のとおりです。T

private Class<T> persistentClass = (Class<T>)
    ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

これが私がそれを使う方法です:

public class GenericDaoJPA<T> implements GenericDao<T> {

    @PersistenceContext
    protected EntityManager entityManager;

    protected Class<T> persistentClass = figureOutPersistentClass();

    private Class<T> figureOutPersistentClass() {
        Class<T> clazz = (Class<T>)((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[0];
        log.debug("persistentClass set to {}", clazz.getName());
        return clazz;
    }

    public List<T> findAll() {
        Query q = entityManager.createQuery("SELECT e FROM " + persistentClass.getSimpleName() + " e");
        return (List<T>) q.getResultList();
    }

}

これは、あなたConcreteEntityDaoがの直接のスーパークラスである場合にのみ機能すると思いますHibernateDao<ConcreteEntity,...>

私はここでそれを見つけました:www.greggbolinger.com/blog/2008/04/17/1208457000000.html

于 2009-05-20T12:57:37.300 に答える