كيف يمكنني الحصول على كائن الجلسة إذا كان لدي entityManager
-
30-09-2019 - |
سؤال
أملك
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria( ??? ).list();
}
كيف يمكنني استرداد الجلسة إذا كنت أستخدم EntityManager أو كيف يمكنني الحصول على النتيجة من الانفصال؟
المحلول
لكي تكون شاملاً تمامًا ، تختلف الأمور إذا كنت تستخدم تطبيق JPA 1.0 أو JPA 2.0.
JPA 1.0
مع JPA 1.0 ، يجب عليك استخدام EntityManager#getDelegate()
. لكن ضع في اعتبارك ذلك نتيجة هذه الطريقة هي التنفيذ المحددة أي غير محمول من خادم التطبيق باستخدام السبات إلى الآخر. فمثلا مع jboss كنت ستفعل:
org.hibernate.Session session = (Session) manager.getDelegate();
ولكن مع الأسماك الزجاجية, ، يجب عليك القيام به:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
أوافق ، هذا أمر فظيع ، والمواصفات هي المسؤول هنا (غير واضح بما فيه الكفاية).
JPA 2.0
مع JPA 2.0 ، هناك جديد (وأفضل بكثير) EntityManager#unwrap(Class<T>)
الطريقة التي يجب تفضيلها EntityManager#getDelegate()
للتطبيقات الجديدة.
لذلك مع تنفيذ Hibernate كـ JPA 2.0 (انظر 3.15. API السباتي الأصلي)، كنت ستفعل:
Session session = entityManager.unwrap(Session.class);
نصائح أخرى
انظر القسم "5.1. الوصول إلى واجهات برمجة تطبيقات السبات من JPA" في ال دليل مستخدم ORM Hibernate:
Session session = entityManager.unwrap(Session.class);
هذا سوف يفسر بشكل أفضل.
EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
كنت أعمل في Wildfly لكنني كنت أستخدم
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
وكان الصحيح
org.hibernate.Session session = (Session) manager.getDelegate();