سؤال

ولدي داو السبات معلمات التي تنفذ عمليات الخام الأساسية، وعندما معلمات يستخدم كمندوب لتحقيق عمليات الخام الأساسية لداو معينة.

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

وأريد أن أكون قادرة على استخلاص الدرجة من T في وقت التشغيل لإنشاء استعلامات المعايير في السبات، مثل ما يلي:

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

وأنا أعلم:

T.getClass()

لا وجود لها، ولكن هل هناك أي طريقة لاشتقاق كائن من الدرجة الصحيح من T في وقت التشغيل؟

ولقد بحثت في الأدوية والتفكير ولكن لم تأتي إلى حل مناسب، وربما أنا في عداد المفقودين شيء.

وشكرا.

هل كانت مفيدة؟

المحلول

هل يمكن أن يكون من الدرجة الاولى مرت كحجة المنشئ.

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

    // ....

}

نصائح أخرى

وهناك كيف السبيل لمعرفة 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top