खोज…


टिप्पणियों

SessionFactory बीन उन सभी डेटाबेस सत्रों को बनाने, बनाए रखने, बंद करने और फ्लशिंग के लिए जिम्मेदार है जो TransactionManager इसे बनाने के लिए कहता है। कारण है कि हम autowire कि के SessionFactory डीएओ के में और बनाने के माध्यम से यह सभी प्रश्नों को चलाते हैं।

नए हाइबरनेट उपयोगकर्ताओं से सबसे बड़ा सवाल यह है कि "मेरे परिवर्तन कब किए जाते हैं?" और जवाब समझ में आता है जब आप सोचते हैं कि TransactionManager कैसे SesisonFactory साथ काम करता है। आपका डेटाबेस परिवर्तन प्लावित और प्रतिबद्ध जब आप सेवा विधि है कि के साथ एनोटेट किया गया था से बाहर निकलने की जाएगी @Transactional । इसका कारण यह है, कि एक लेन-देन को अखंड काम के एक एकल 'इकाई' का प्रतिनिधित्व करना है। यदि यूनिट के साथ कुछ गलत होता है, तो यह माना जाता है कि यूनिट विफल हो गई है और सभी परिवर्तनों को वापस रोल किया जाना चाहिए। तो जब आप मूल रूप से सेवा पद्धति से बाहर निकलेंगे तो SessionFactory हो जाएगा और सत्र को खाली कर देगा।

यह कहने के लिए नहीं है कि यह तब भी फ्लश नहीं करेगा और सत्र को खाली कर देगा जबकि आपका लेनदेन चल रहा है। उदाहरण के लिए, यदि मैं 5 ऑब्जेक्ट्स के संग्रह को जोड़ने के लिए एक सेवा पद्धति को कॉल करता हूं और डेटाबेस में ऑब्जेक्ट्स की कुल संख्या को वापस करता हूं, तो SessionFactory को पता चलेगा कि क्वेरी ( SELECT COUNT(*) ) को अपडेट होने के लिए सटीक स्थिति की आवश्यकता होती है, और इसलिए काउंट क्वेरी चलाने से पहले 5 ऑब्जेक्ट्स को जोड़ना होगा। निष्पादन कुछ इस तरह दिख सकता है:

संस्करण

संस्करण डॉक्यूमेंटेशन लिंक रिलीज़ की तारीख
4.2.0 http://hibernate.org/orm/documentation/4.2/ 2013-03-01
4.3.0 http://hibernate.org/orm/documentation/4.3/ 2013-12-01
5.0.0 http://hibernate.org/orm/documentation/5.0/ 2015/09/01

हाइबरनेट सेट करने के लिए XML कॉन्फ़िगरेशन का उपयोग करना

मैं एक फाइल बनाता हूं, जिसे database-servlet.xml कहा जाता database-servlet.xml

प्रारंभ में आपकी कॉन्फ़िग फ़ाइल इस तरह दिखाई देगी:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

</beans>

आप देखेंगे कि मैंने tx और jdbc स्प्रिंग नामस्थान आयात किए हैं। ऐसा इसलिए है क्योंकि हम इस कॉन्फ़िग फ़ाइल में उनका उपयोग बहुत अधिक करने जा रहे हैं।

पहली चीज जो आप करना चाहते हैं, वह एनोटेशन आधारित लेनदेन प्रबंधन (@ @Transactional ) सक्षम है। वसंत में लोग हाइबरनेट का उपयोग करने का मुख्य कारण यह है कि वसंत आपके लिए अपने सभी लेनदेन का प्रबंधन करेगा। अपनी कॉन्फ़िगरेशन फ़ाइल में निम्न पंक्ति जोड़ें:

<tx:annotation-driven />

हमें एक डेटा स्रोत बनाने की आवश्यकता है। डेटा स्रोत मूल रूप से डेटाबेस है जिसे हाइबरनेट आपकी वस्तुओं को बनाए रखने के लिए उपयोग करने जा रहा है। आम तौर पर एक लेनदेन प्रबंधक के पास एक डेटा स्रोत होगा। यदि आप चाहते हैं कि हाइबरनेट कई डेटा स्रोतों से बात करे तो आपके पास कई लेनदेन प्रबंधक हैं।

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="" />
    <property name="url" value="" />
    <property name="username" value="" />
    <property name="password" value="" />
</bean>

इस बीन का वर्ग कुछ भी हो सकता है जो javax.sql.DataSource लागू javax.sql.DataSource ताकि आप अपना स्वयं का लिख सकें। यह उदाहरण वर्ग स्प्रिंग द्वारा प्रदान किया गया है, लेकिन इसका अपना थ्रेड पूल नहीं है। एक लोकप्रिय विकल्प अपाचे कॉमन्स org.apache.commons.dbcp.BasicDataSource , लेकिन कई अन्य हैं। मैं नीचे दिए गए प्रत्येक गुण की व्याख्या करूँगा:

  • DriverClassName : आपके JDBC ड्राइवर का पथ। यह एक डेटाबेस विशिष्ट JAR है जो आपके क्लासपाथ पर उपलब्ध होना चाहिए। सुनिश्चित करें कि आपके पास सबसे अद्यतित संस्करण है। यदि आप Oracle डेटाबेस का उपयोग कर रहे हैं, तो आपको OracleDriver की आवश्यकता होगी। यदि आपके पास MySQL डेटाबेस है, तो आपको MySQLDriver की आवश्यकता होगी। देखें कि क्या आपको वह ड्राइवर मिल सकता है जिसकी आपको आवश्यकता है लेकिन एक त्वरित Google को आपको सही ड्राइवर देना चाहिए।

  • url : आपके डेटाबेस का URL। आमतौर पर यह कुछ ऐसा होगा जैसे jdbc\:oracle\:thin\:\path\to\your\database या jdbc:mysql://path/to/your/database । यदि आप अपने द्वारा उपयोग किए जा रहे डेटाबेस के डिफ़ॉल्ट स्थान के लिए चारों ओर Google करते हैं, तो आपको यह पता लगाने में सक्षम होना चाहिए कि यह क्या होना चाहिए। यदि आपको संदेश के साथ HibernateException मिल रही है। org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set और आप इस गाइड का अनुसरण कर रहे हैं, तो 90% है कि आपका URL गलत है, 5% मौका आपका डेटाबेस शुरू नहीं हुआ है और 5% संभावना है कि आपका उपयोगकर्ता नाम / पासवर्ड गलत है।

  • उपयोगकर्ता नाम : डेटाबेस के साथ प्रमाणीकरण करते समय उपयोग करने वाला उपयोगकर्ता नाम।

  • पासवर्ड : डेटाबेस के साथ प्रमाणीकरण करते समय उपयोग करने वाला पासवर्ड।

अगली बात, SessionFactory स्थापित करना है। यह वह चीज़ है जो हाइबरनेट आपके लेनदेन को बनाने और प्रबंधित करने के लिए उपयोग करता है, और वास्तव में डेटाबेस से बात करता है। इसके पास कुछ विन्यास विकल्प हैं जिन्हें मैं नीचे समझाने की कोशिश करूंगा।

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="au.com.project />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.use_sql_comments">true</prop>
            <prop key="hibernate.hbm2ddl.auto">validate</prop>
        </props>
    </property>
</bean>
  • dataSource : आपका डेटा स्रोत बीन। यदि आपने डेटा स्रोत का आईडी बदल दिया है, तो इसे यहां सेट करें।

  • packageToScan : अपने JPA एनोटेट वस्तुओं को खोजने के लिए स्कैन करने के लिए संकुल। ये वे वस्तुएं हैं जिन्हें सत्र कारखाने को प्रबंधित करने की आवश्यकता होती है, आमतौर पर POJO की और @Entity साथ एनोटेट किया @Entity । हाइबरनेट में वस्तु संबंध स्थापित करने के तरीके के बारे में अधिक जानकारी के लिए यहां देखें

  • annotatedClasses (नहीं दिखाया गया): आप हाइबरनेट के लिए वर्गों की एक सूची प्रदान कर सकते हैं ताकि स्कैन कर सकें कि वे सभी एक ही पैकेज में नहीं हैं। आपको या तो packagesToScan उपयोग करना annotatedClasses या annotatedClasses लेकिन दोनों नहीं। घोषणा इस तरह दिखती है:

<property name="annotatedClasses">
    <list>
        <value>foo.bar.package.model.Person</value>
        <value>foo.bar.package.model.Thing</value>
    </list>
</property>
  • hibernateProperties : यहाँ इन सभी को प्यार से प्रलेखित किया गया है । आपके द्वारा उपयोग किए जाने वाले मुख्य इस प्रकार हैं:
  • hibernate.hbm2ddl.auto : हाइबरनेट प्रश्नों में से एक इस संपत्ति का विवरण देता है। अधिक जानकारी के लिए इसे देखें । मैं आमतौर पर सत्यापन का उपयोग करता हूं, और SQL स्क्रिप्ट (इन-मेमोरी) के लिए अपने डेटाबेस को सेट करता हूं, या पहले से मौजूद डेटाबेस (मौजूदा डेटाबेस) बनाता हूं।
  • hibernate.show_sql : बूलियन ध्वज, यदि सच्चा हाइबरनेट सभी SQL को प्रिंट करेगा तो यह stdout उत्पन्न होता है। आप अपने लॉगर को भी कॉन्फ़िगर कर सकते हैं ताकि आप उन मानों को दिखा log4j.logger.org.hibernate.type=TRACE log4j.logger.org.hibernate.SQL=DEBUG को अपने लॉग मैनेजर में सेट log4j.logger.org.hibernate.type=TRACE (मैं log4j का उपयोग करता हूं )।
  • hibernate.format_sql : बूलियन ध्वज, हाइबरनेट के कारण आपके SQL को stdout में प्रिंट करेगा।
  • hibernate.dialect (अच्छे कारण के लिए नहीं दिखाया गया है): बहुत सारे पुराने ट्यूटोरियल आपको दिखाते हैं कि हाइबरनेट बोली को कैसे सेट करना है जो वह आपके डेटाबेस से संवाद करने के लिए उपयोग करेगा। हाइबरनेट ऑटो-डिटेक्ट कर सकता है कि JDBC ड्राइवर के आधार पर किस बोली का उपयोग करना है। चूंकि लगभग 3 अलग-अलग ओरेकल बोलियाँ और 5 अलग-अलग MySQL बोलियाँ हैं, इसलिए मैं इस निर्णय को हाइबरनेट तक छोड़ दूंगा। हाइबरनेट बोलियों की पूरी सूची के लिए यहाँ देखें

अंतिम 2 बीन्स आपको घोषित करने की आवश्यकता है:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"
    id="PersistenceExceptionTranslator" />

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

PersistenceExceptionTranslator डेटाबेस विशिष्ट HibernateException या SQLExceptions को स्प्रिंग अपवादों में अनुवाद करता है जिन्हें एप्लिकेशन संदर्भ द्वारा समझा जा सकता है।

TransactionManager बीन वह है जो लेनदेन के साथ-साथ रोल-बैक को भी नियंत्रित करता है।

नोट: आप अपने DAO में अपने SessionFactory सेम SessionFactory होना चाहिए।

XML- कम हाइबरनेट कॉन्फ़िगरेशन

इसका उदाहरण यहाँ से लिया गया है

package com.reborne.SmartHibernateConnector.utils;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class LiveHibernateConnector implements IHibernateConnector {

    private String DB_DRIVER_NAME = "";
    private String DB_URL = "jdbc:h2:~/liveDB;MV_STORE=FALSE;MVCC=FALSE";
    private String DB_USERNAME = "sa";
    private String DB_PASSWORD = "";
    private String DIALECT = "org.hibernate.dialect.H2Dialect";
    private String HBM2DLL = "create";
    private String SHOW_SQL = "true";
    
    private static Configuration config;
    private static SessionFactory sessionFactory;
    private Session session;
    
    private boolean CLOSE_AFTER_TRANSACTION = false;

    public LiveHibernateConnector() {
        
        config = new Configuration();

        config.setProperty("hibernate.connector.driver_class",         DB_DRIVER_NAME);
        config.setProperty("hibernate.connection.url",                 DB_URL);
        config.setProperty("hibernate.connection.username",         DB_USERNAME);
        config.setProperty("hibernate.connection.password",         DB_PASSWORD);
        config.setProperty("hibernate.dialect",                     DIALECT);
        config.setProperty("hibernate.hbm2dll.auto",                 HBM2DLL);
        config.setProperty("hibernate.show_sql",                    SHOW_SQL);
    
        /*
         * Config connection pools
         */

        config.setProperty("connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");
        config.setProperty("hibernate.c3p0.min_size", "5");
        config.setProperty("hibernate.c3p0.max_size", "20");
        config.setProperty("hibernate.c3p0.timeout", "300");
        config.setProperty("hibernate.c3p0.max_statements", "50");
        config.setProperty("hibernate.c3p0.idle_test_period", "3000");
        
        
        /**
         * Resource mapping
         */
        
//        config.addAnnotatedClass(User.class);
//        config.addAnnotatedClass(User.class);
//        config.addAnnotatedClass(User.class);
    
        sessionFactory = config.buildSessionFactory();
    }


    public HibWrapper openSession() throws HibernateException {
        return new HibWrapper(getOrCreateSession(), CLOSE_AFTER_TRANSACTION);
    }


    public Session getOrCreateSession() throws HibernateException {
        if (session == null) {
            session = sessionFactory.openSession();
        }
        return session;
    }

    public void reconnect() throws HibernateException {
        this.sessionFactory = config.buildSessionFactory();
    }

    
}

कृपया ध्यान दें, नवीनतम हाइबरनेट के साथ यह दृष्टिकोण अच्छी तरह से काम नहीं करता है (हाइबरनेट 5.2 रिलीज़ अभी भी इस कॉन्फ़िगरेशन की अनुमति देता है)

XML का उपयोग करके सरल हाइबरनेट उदाहरण

XML के लिए एक सरल हाइबरनेट प्रोजेक्ट सेट अप करने के लिए कॉन्फ़िगरेशन के लिए आपको 3 फाइलें चाहिए, hibernate.cfg.xml, प्रत्येक इकाई के लिए एक POJO और प्रत्येक इकाई के लिए एक EntityName.hbm.xml। यहां MySQL का उपयोग करने वाले प्रत्येक का एक उदाहरण दिया गया है:

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <session-factory>
   <property name="hibernate.dialect">
      org.hibernate.dialect.MySQLDialect
   </property>
   <property name="hibernate.connection.driver_class">
      com.mysql.jdbc.Driver
   </property>

   <property name="hibernate.connection.url">
      jdbc:mysql://localhost/DBSchemaName
   </property>
   <property name="hibernate.connection.username">
      testUserName
   </property>
   <property name="hibernate.connection.password">
      testPassword
   </property>

   <!-- List of XML mapping files -->
   <mapping resource="HibernatePractice/Employee.hbm.xml"/>

</session-factory>
</hibernate-configuration>

DBSchemaName, testUserName और testPassword सभी को बदल दिया जाएगा। यदि यह किसी पैकेज में है, तो पूर्ण संसाधन नाम का उपयोग करना सुनिश्चित करें।

Employee.java

package HibernatePractice;

public class Employee {
    private int id;
    private String firstName;
    private String middleName;
    private String lastName;
    
    public Employee(){
        
    }
    public int getId(){
        return id;
    }
    public void setId(int id){
        this.id = id;
    }
    public String getFirstName(){
        return firstName;
    }
    public void setFirstName(String firstName){
        this.firstName = firstName;
    }
    public String getMiddleName(){
        return middleName;
    }
    public void setMiddleName(String middleName){
        this.middleName = middleName;
    }
    public String getLastName(){
        return lastName;
    }
    public void setLastName(String lastName){
        this.lastName = lastName;
    }
}

Employee.hbm.xml

<hibernate-mapping>
   <class name="HibernatePractice.Employee" table="employee">
      <meta attribute="class-description">
         This class contains employee information. 
      </meta>
      <id name="id" type="int" column="empolyee_id">
         <generator class="native"/>
      </id>
      <property name="firstName" column="first_name" type="string"/>
      <property name="middleName" column="middle_name" type="string"/>
      <property name="lastName" column="last_name" type="string"/>
   </class>
</hibernate-mapping>

फिर से, यदि क्लास एक पैकेज में है तो फुल क्लास नाम पैकेज का उपयोग करें। Name.className।

आपके पास ये तीन फाइलें होने के बाद आप अपनी परियोजना में हाइबरनेट का उपयोग करने के लिए तैयार हैं।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow