3.1 Sammenkædning af Hibernate og databaser

Vi lærte, hvordan man forbinder Hibernate til vores applikation ved hjælp af Maven, og hvordan man kortlægger tabeller til klasser ved hjælp af annoteringer. Og nu opstår det næste spørgsmål - hvordan læser vi objekter fra databasen eller gemmer dem der?

Ikke så hurtigt. Først og fremmest skal du beskæftige dig med tre ting mere:

  • Konfiguration af en databaseforbindelse
  • Opsætning af Hibernate
  • Arbejder med EntityManager

Hibernate skjuler helt arbejdet med databasen fra din applikation, men for at undgå overskridelser skal den konfigureres korrekt. Du kan ikke springe dette trin over - ellers kan Hibernate vide, hvilken database objekter skal gemmes i?

Hibernate kan konfigureres og gives databaseoplysninger på tre måder

  • Brug egenskabsfilen
  • Brug filen hibernate.cfg.xml
  • Brug konfigurationsbønnemetoder

Og selvom jeg bedst kan lide den sidste, vil du helt sikkert støde på alle tre, så vi analyserer alle tre her.

3.2 Autorisation i databasen

Lad os starte med det vigtigste - databaseforbindelser. For at gøre dette skal du angive data, så Hibernate kan logge på den ønskede database.

Egenskaber Filkonfiguration
dvale.egenskaber
hibernate.dialect= org.hibernate.dialect.Oracle9Dialect
hibernate.connection.driver_class= oracle.jdbc.driver.OracleDriver
hibernate.connection.url= jdbc:oracle:thin:@localhost:1521:supershop
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=update

De samme indstillinger kan indstilles i form af en xml-fil:

XML-baseret konfiguration
dvale.cfg.xml
<hibernate-configuration>
	<session-factory>

    	<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
    	<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    	<property name="connection.url">jdbc:oracle:thin:@localhost:1521:supershop</property>
    	<property name="connection.username">root</property>
    	<property name="connection.password">secret</property>
    	<property name="hibernate.show_sql ">true</property>
    	<property name="hbm2ddl.auto">update</property>

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

I begge eksempler ser vi de samme indstillinger med de samme værdier. Det er bare, at det første eksempel repræsenterer dem som en egenskabsfil , og det andet som en xml-fil .

Disse indstillinger er opdelt i tre grupper:

  1. Angiv typen af ​​DBMS
    • Angiv dialekten (DBMS-type), for eksempel Oracle 9.0
    • Angiv navnet på JDBC-driveren til at arbejde med dette DBMS
  2. Angiv data til autorisation i databasen
    • database url
    • brugernavn
    • adgangskode
  3. Konfiguration af Hibernate Engine
    • hibernate.show_sql- Hibernate vil duplikere i konsollen alle anmodninger, som den udfører
    • hbm2ddl.auto- Hibernate vil ændre databasestrukturen, hvis det er nødvendigt

Der er en tredje måde at indstille konfiguration på - gennem beholdere. Det bruges normalt sammen med Spring, så vi vil se på det, når vi lærer SpringFramework.

3.3 Hent SessionFactory

Det næste trin er at hente SessionFactory-objektet. Der er flere måder at gøre dette på:

Den første måde er at bruge filen hibernate.properties .

For at gøre dette skal du blot skrive følgende kode:

SessionFactory sessionFactory = new Configuration().buildSessionFactory();

Hvis filen hibernate.properties ikke findes i den aktuelle projektmappe, vil en undtagelse blive kastet.

Den anden måde er konfiguration ved hjælp af hibernate.cfg.xml .

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

Hvis du skriver en sådan kode, vil hibernate.cfg.xml. Hvis der ikke findes en sådan fil, vil metoden buildSessionFactory()give en undtagelse.

Den tredje måde er at indstille konfigurationsfilen manuelt .

Nogle gange bliver det under udviklingsprocessen nødvendigt at skifte til en testbase eller ændre nogle andre indstillinger for at arbejde med basen, for dette kan du indstille konfigurationsfilen manuelt:

SessionFactory sessionFactory = new Configuration().configure("hibernate-dev.cfg.xml").buildSessionFactory();

Metode fire - vi bruger en brugerdefineret hibernate.properties fil:

ClassLoader classLoader = Thread.currentThread().getClassLoader();

Properties properties = new Properties();
properties.load(classLoader.getResourceAsStream("hibernate-dev.properties"));

SessionFactory sessionFactory = new Configuration()
            .addProperties(properties)
            .buildSessionFactory();

Og endelig kan du simpelthen sy alle de nødvendige parametre direkte ind i koden:

Properties properties = new Properties();
properties.put(Environment.DRIVER, "com.mysql.jdbc.Driver");
properties.put(Environment.URL, "jdbc:mysql://localhost:3306/supershop");
properties.put(Environment.USER, "root");
properties.put(Environment.PASS, "password");

SessionFactory sessionFactory = new Configuration()
            .setProperties(properties)
            .buildSessionFactory();

3.4 Angiv, hvor du skal søge efter enhedsklasser

Men det er ikke alt. Når vi konfigurerer et SessionFactory -objekt i Hibernate, kontrollerer denne SessionFactory , at alle de påkrævede tabeller med de nødvendige kolonnetyper findes i databasen.

Og for at SessionFactory skal kunne gøre dette, skal den have bestået en liste over enhedsklasser, som den skal tilknytte databasen.

Der er tre måder at bestå en liste over enhedsklasser på:

Metode et. Tilføj hibernate.cfg.xmlen linje som:

<mapping class="class-qualified-name" />

Eksempel:

<mapping class="com.codegym.data.User" />
<mapping class="com.codegym.data.Employee" />
<mapping class="com.codegym.data.Task" />

Metode to. Kald metoden på konfigurationsobjektetaddAnnotatedClass() . Eksempel:

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addAnnotatedClass(com.codegym.data.User.class)
   	.buildSessionFactory();

Hvis der er mange klasser, kan du tilføje dem i hele pakker:

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addPackage("com.codegym.data")
   	.buildSessionFactory();

3.5 Afsluttende eksempel

Nu hvor vi har lært, hvordan man konfigurerer SessionFactory-objektet, lad os skrive koden, der skal bruge det.

Det vil bestå af tre metoder:

  1. Konfigurerer Dvale
  2. Metode, der får alle medarbejdere fra databasen
  3. Metode, der gemmer en ny medarbejder i databasen

Denne kodeskabelon ville se nogenlunde sådan ud:

class EmployeeManager {
    private SessionFactory sessionFactory;

    public void class init() {
    	this.sessionFactory = new Configuration()
        	.configure()
        	.buildSessionFactory();
   }

   public List<Employee> getAllEmployes() {
         try (Session session = sessionFactory.openSession()) {
  	          Query<Employee> query = session.createQuery("from Employee", Employee.class);
    	        return query.list();
         }
   }

   public void addEmployee(Employee employee ) {
     	try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
       	    session.save(employee);
            transaction.commit();
     	}
   }
}

Før du udfører en forespørgsel til databasen, skal du oprette en separat session. Hvis anmodningerne er relaterede, kan de udføres i samme session. Hvis anmodningerne ikke er relaterede (og der kan gå flere minutter imellem dem), skal de lave deres egne sessioner.

Hvis du vil læse data fra databasen eller udføre en kompleks forespørgsel, skal du først oprette et Query-objekt og bruge det til at udføre din forespørgsel.

Hver forespørgsel til databasen udføres også i sin egen transaktion. Du skal åbne den, udføre de nødvendige handlinger og derefter lukke (commit).

I de følgende foredrag vil vi analysere mere detaljeret, hvordan det hele fungerer.