كيف يمكنني الحصول على كائن الجلسة إذا كان لدي entityManager

StackOverflow https://stackoverflow.com/questions/4148231

سؤال

أملك

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();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top