Sök…


Anmärkningar

SessionFactory bönan är ansvarig för att skapa, underhålla, stänga och spola alla databassessioner som TransactionManager ber den att skapa. Det är därför vi tillhandahåller SessionFactory till DAO: er och kör alla frågor genom den.

En av de största frågorna som nya Hibernate-användare ställer är "När blir mina förändringar engagerade?" och svaret är meningsfullt när du tänker hur TransactionManager fungerar med SesisonFactory . Dina databasförändringar spolas och begås när du lämnar servicemetoden som kommenterades med @Transactional . Anledningen till detta är att en transaktion är tänkt att representera en enda 'enhet' av obruten arbete. Om något går fel med enheten antas det att enheten misslyckades och alla förändringar ska rullas tillbaka. Så SessionFactory kommer att spola och rensa sessionen när du lämnar den servicemetod som du ursprungligen ringde.

Det är inte att säga att det inte kommer att spola och rensa sessionen medan din transaktion pågår. Om jag till exempel kallar en servicemetod för att lägga till en samling av 5 objekt och returnera det totala antalet objekt i databasen, skulle SessionFactory inse att frågan ( SELECT COUNT(*) ) kräver ett uppdaterat tillstånd för att vara korrekt, och så skulle spola tillägget av de 5 objekten innan du kör räknarfrågan. Utförandet kan se ut så här:

versioner

Version Dokumentationslänk Utgivningsdatum
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

Använd XML-konfiguration för att ställa in viloläge

Jag skapar en fil som heter database-servlet.xml någonstans på klassvägen.

Till en början ser din konfigurationsfil så ut:

<?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>

Du kommer att märka att jag importerade tx och jdbc namnområdena. Det beror på att vi kommer att använda dem ganska kraftigt i den här konfigurationsfilen.

Det första du vill göra är att aktivera anteckningsbaserad transaktionshantering ( @Transactional ). Det främsta skälet till att människor använder Viloläge på våren är att Spring kommer att hantera alla dina transaktioner åt dig. Lägg till följande rad i din konfigurationsfil:

<tx:annotation-driven />

Vi måste skapa en datakälla. Datakällan är i princip databasen som Hibernate kommer att använda för att kvarstå dina objekt. I allmänhet har en transaktionshanterare en datakälla. Om du vill att Hibernate ska prata med flera datakällor har du flera transaktionshanterare.

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

Klassen för denna böna kan vara vad som helst som implementerar javax.sql.DataSource så att du kan skriva din egen. Exempelklassen tillhandahålls av Spring, men har ingen egen trådpool. Ett populärt alternativ är Apache Commons org.apache.commons.dbcp.BasicDataSource , men det finns många andra. Jag förklarar var och en av egenskaperna nedan:

  • driverClassName : Sökvägen till din JDBC-drivrutin. Detta är en databasspecifik JAR som borde vara tillgänglig på din klassväg. Se till att du har den mest uppdaterade versionen. Om du använder en Oracle-databas behöver du en OracleDriver. Om du har en MySQL-databas behöver du en MySQLDriver. Se om du kan hitta den drivrutin du behöver här, men en snabb google bör ge dig rätt drivrutin.

  • url : URL till din databas. Vanligtvis kommer detta att vara något som jdbc\:oracle\:thin\:\path\to\your\database eller jdbc:mysql://path/to/your/database . Om du googlar efter standardplatsen för databasen du använder, bör du kunna ta reda på vad det här ska vara. Om du får en HibernateException med meddelandet org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set och du följer den här guiden, det finns 90% chans att din URL är fel, en 5% chans att din databas inte startas och 5% chans att ditt användarnamn / lösenord är fel.

  • användarnamn : Användarnamnet som ska användas vid autentisering med databasen.

  • lösenord : Lösenordet som ska användas vid autentisering med databasen.

Nästa sak är att ställa in SessionFactory . Det här är det som Viloläge använder för att skapa och hantera dina transaktioner, och faktiskt pratar med databasen. Det har en hel del konfigurationsalternativ som jag kommer att försöka förklara nedan.

<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 : Din datakällböna . Om du ändrade ID för datakällan ställer du in den här.

  • packageToScan : Paketen som ska skannas för att hitta dina JPA-annoterade objekt. Dessa är de objekt som sessionfabriken behöver hantera, kommer vanligtvis att vara POJO: er och antecknas med @Entity . För mer information om hur du skapar objektrelationer i viloläge se här .

  • annotatedClasses (visas inte): Du kan också tillhandahålla en lista över klasser för viloläge att skanna om de inte alla är i samma paket. Du bör använda antingen packagesToScan eller annotatedClasses men inte båda. Förklaringen ser ut så här:

<property name="annotatedClasses">
    <list>
        <value>foo.bar.package.model.Person</value>
        <value>foo.bar.package.model.Thing</value>
    </list>
</property>
  • hibernateProperties : Det finns en myriad av dessa alla kärleksfullt dokumenterade här . De viktigaste du kommer att använda är följande:
  • hibernate.hbm2ddl.auto : En av de hetaste frågorna om Hibernate beskriver den här egenskapen. Se det för mer info . Jag använder i allmänhet validera och ställer in min databas med antingen SQL-skript (för ett minne) eller skapar databasen i förväg (befintlig databas).
  • hibernate.show_sql : Boolean flagga, om sann Hibernate kommer att skriva ut all SQL den genererar till stdout . Du kan också konfigurera din logger så att du visar värden som är bundna till frågorna genom att ställa log4j.logger.org.hibernate.type=TRACE log4j.logger.org.hibernate.SQL=DEBUG i din log4j.logger.org.hibernate.SQL=DEBUG (jag använder log4j ).
  • hibernate.format_sql : Boolean flagga, kommer att få Hibernate att skriva ut SQL till stdout.
  • hibernate.dialect (visas inte, av goda skäl): Många gamla tutorials där ute visar hur du ställer in Hibernate-dialekten som den kommer att använda för att kommunicera till din databas. Viloläge kan automatiskt upptäcka vilken dialekt som ska användas baserat på JDBC-drivrutinen som du använder. Eftersom det finns cirka 3 olika Oracle-dialekter och 5 olika MySQL-dialekter, skulle jag lämna detta beslut till Viloläge. För en fullständig lista över dialekter Hibernate-stöd se här .

De sista 2 bönorna du behöver förklara är:

<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 översätter databasspecifik HibernateException eller SQLExceptions till SQLExceptions som kan förstås av applikationens sammanhang.

TransactionManager bönan är det som styr transaktioner såväl som roll-backs.

Obs! Du borde automatiskt ansluta din SessionFactory böna till dina DAO: er.

XML-mindre viloläge konfiguration

Detta exempel har tagits härifrån

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

    
}

Observera att den senaste funktionen i viloläge inte fungerar bra (Hibernate 5.2-versionen tillåter fortfarande den här konfigurationen)

Enkelt viloläge exempel med XML

För att skapa ett enkelt viloläge-projekt med XML för de konfigurationer du behöver 3 filer, hibernate.cfg.xml, en POJO för varje enhet och ett EntityName.hbm.xml för varje enhet. Här är ett exempel på var och en som använder 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 och testPassword skulle alla ersättas. Se till att använda hela resursnamnet om det finns i ett paket.

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>

Återigen, om klassen finns i ett paket, använd det fullständiga klassnamnet packageName.className.

När du har fått dessa tre filer är du redo att använda viloläge i ditt projekt.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow