2016-06-16 6 views
19

मैं हाइबरनेट 3.x से नवीनतम हाइबरनेट 5.2.0 अंतिम में अपग्रेड कर रहा हूं। मेरे पुराने कोड में हम नीचे मानदंड प्रश्नों का उपयोग कर रहे थे।Hibernate 5.2 में साझा सत्र Contract.createCriteria (क्लास persistentClass) के लिए सही विकल्प 5.2

Session session =getHibernateTemplate().getSessionFactory().getCurrentSession(); 
Criteria criteria = session.createCriteria(Employee.class); 
criteria.add(Restrictions.eq("Department", department)); 
return criteria.list(); 

अब हाइबरनेट 5.2.0 से createCriteria() विधि मान्य नहीं है। निम्नलिखित दस्तावेज से कौन सा पाया जा सकता है।

https://docs.jboss.org/hibernate/orm/5.2/javadocs/deprecated-list.html https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/SharedSessionContract.html#createCriteria-java.lang.Class-

प्रलेखन जेपीए मानदंड का उपयोग करने का सुझाव देते हैं। नीचे दिए गए पृष्ठभूमि के आधार पर मेरे कुछ प्रश्न नीचे दिए गए हैं।

  1. जब से हम EntityManager और भारी HibernateDAOSupport और HibernateTemplate पर निर्भर उपयोग नहीं कर रहे, मैं कैसे सत्र या sessionFactory का उपयोग कर JAP मानदंड का उपयोग कर सकते हैं?

  2. यदि मैं नीचे दिए गए कोड स्निपेट में डिटेक्टेडक्रिटिया का उपयोग करता हूं तो यह पिछले कार्यान्वयन के समान होगा या नीचे कोड हमें सत्र स्वतंत्र परिणाम देगा?

    DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class); 
    criteria.add(Restrictions.eq("Department", department)); 
    return (List<Employee>) getHibernateTemplate().findByCriteria(criteria); 
    
  3. एक विकल्प के रूप

    इसके अलावा, अगर मैं नीचे उल्लेख रास्ते में DetachedCriteria का उपयोग यह मेरे पुराने कोड के रूप में एक ही प्रभाव पड़ता है जा रहा है।

    Session session =getHibernateTemplate().getSessionFactory().getCurrentSession(); 
    DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class); 
    criteria.add(Restrictions.eq("Department", department)); 
    return criteria .getExecutableCriteria(session).list(); 
    

यदि इस से निपटने के लिए सुझाव है कि कृपया के रूप में मैं HibernateDAOSupport और HibernateTemplate के उपयोग को बदलने के लिए नहीं करना चाहती एक बेहतर तरीका है।

+7

मुझे खुशी है कि मैं दुनिया हाइबरनेट में इस अचानक परिवर्तन के साथ भ्रमित में अद्वितीय नहीं कर रहा हूँ कर रहा हूँ (पर विचार मैं 5.1 से आया)। मुझे नहीं पता कि मापदंडों के साथ कैसे कार्यान्वित करना है या 5.1 पर वापस जाना है, यह सोचना शुरू करना है या नहीं। – russellhoff

+0

इस पर अच्छा उदाहरण: [सत्र की विधि बनाने का मानदंड बहिष्कृत किया गया है, मुझे वर्ग मानदंड स्थापित करने के लिए कैसे आगे बढ़ना चाहिए?] (Https://teamtreehouse.com/community/the-sessions-method-createcriteria-is-deprecated-how-should- i-आगे बढ़ना के लिए स्थापित-वर्ग-मापदंड) – rvheddeg

उत्तर

3

दस्तावेज़ लिंक के बाद राज्यों है:

"विरासत हाइबरनेट org.hibernate.Criteria एपीआई, जो माना जाता पदावनत किया जाना चाहिए"

तो बस DetachedCriteria का उपयोग करने जा वर्तमान मूल्यह्रास से छुटकारा मिल जाएगा, लेकिन इसके सुझाव जेपीए मानदंड का उपयोग करने के लिए (जो org.hibernate.criterion.Restrictions आदि का समर्थन नहीं करता है)। यह अस्पष्ट है और रोडमैप बहुत मदद नहीं है।

यह करता है उल्लेख:

आप इस के साथ किसी भी आगे मिला "आखिरकार, हाइबरनेट-विशिष्ट मानदंडों सुविधाओं जेपीए javax.persistence.criteria.CriteriaQuery के विस्तार के रूप में भेजा जाएगा"?

3

हाइबरनेट 5.2, org.hibernate.Sessionjavax.persistence.EntityManager लागू करता है, ताकि आप सीधे Session का उपयोग कर मानदंड क्वेरी बना सकें। JPA - Criteria API देखें।

लेकिन वहाँ हाइबरनेट 5.2.1.Final में एक बग हो सकता है, setCacheable काम नहीं करता है, तो कॉल जेपीए मानदंड एपीआई TypedQuery#getResultList, Query#list() बजाय कहते हैं।

public <T> T getAll(Class<T> clazz, boolean cache){ 
    CriteriaQuery<T> query = getCurrentSession().getCriteriaBuilder().createQuery(clazz); 
    query.select(query.from(clazz)); 
    Query<T> q = getCurrentSession().createQuery(query); // CriteriaQueryTypeQueryAdapter instance 
    q.setCacheable(cache); // execute AbstractProducedQuery#setCacheable 
// return q.getResultList(); // CriteriaQueryTypeQueryAdapter#getResultList(), cache not works 
    return q.list(); // AbstractProducedQuery#list() cache may be enabled 
} 
4

उपयोग CriteriaBuilder जैसा कि नीचे वर्णित:

//Use below imports: 
import javax.persistence.criteria.CriteriaBuilder; 
import javax.persistence.criteria.CriteriaQuery; 
import javax.persistence.criteria.Root; 

//creating session. This you can create in your own way. 
Configuration cfg = new Configuration(); 
cfg.configure("hibernate.cfg.xml"); 
cfg.addAnnotatedClass(Employee.class); 

SessionFactory factory = cfg.buildSessionFactory(); 
Session session = factory.openSession(); 

//**creating CriteriaBuilder** 
CriteriaBuilder builder = session.getCriteriaBuilder(); 
CriteriaQuery<Employee> criteria = builder.createQuery(Employee.class); 
Root<Employee> employeeRoot=criteria.from(Employee.class); 
criteria.select(employeeRoot); 

//**Adding where clause** 
criteria.where(builder.equal(employeeRoot.get("employeeId"), "E01")); 
List<Employee> employeeList=session.createQuery(criteria).getResultList(); 
संबंधित मुद्दे