3.1 Koble til dvalemodus og databaser

Vi lærte hvordan du kobler Hibernate til applikasjonen vår ved hjelp av Maven, og hvordan du kartlegger tabeller til klasser ved hjelp av merknader. Og nå oppstår neste spørsmål - hvordan leser vi objekter fra databasen eller lagrer dem der?

Ikke så fort. Først av alt må du forholde deg til tre ting til:

  • Konfigurere en databasetilkobling
  • Setter opp Hibernate
  • Jobber med EntityManager

Hibernate skjuler helt arbeidet med databasen fra applikasjonen din, men for å unngå overskridelser må den konfigureres riktig. Du kan ikke hoppe over dette stadiet - ellers hvordan vil Hibernate vite hvilken database objekter skal lagres i?

Hibernate kan konfigureres og gis databaseinformasjon på tre måter

  • Bruk egenskapsfilen
  • Bruk hibernate.cfg.xml-filen
  • Bruk konfigurasjonsbønnemetoder

Og selv om jeg liker den siste best, vil du definitivt støte på alle tre, så vi analyserer alle tre her.

3.2 Autorisasjon i databasen

La oss starte med det viktigste - databasetilkoblinger. For å gjøre dette må du oppgi data slik at Hibernate kan logge på ønsket database.

Egenskaper Filkonfigurasjon
dvale.egenskaper
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 innstillingene kan settes i form av en xml-fil:

XML-basert konfigurasjon
dvalemodus.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 eksemplene ser vi de samme innstillingene med de samme verdiene. Det er bare at det første eksemplet representerer dem som en egenskapsfil , og det andre som en xml-fil .

Disse innstillingene er delt inn i tre grupper:

  1. Spesifiser typen DBMS
    • Spesifiser dialekten (DBMS-type), for eksempel Oracle 9.0
    • Angi navnet på JDBC-driveren for å arbeide med denne DBMS
  2. Spesifiser data for autorisasjon i databasen
    • database url
    • brukernavn
    • passord
  3. Konfigurere Hibernate Engine
    • hibernate.show_sql- Hibernate vil duplisere i konsollen alle forespørsler som den utfører
    • hbm2ddl.auto- Hibernate vil endre databasestrukturen om nødvendig

Det er en tredje måte å stille inn konfigurasjon på - gjennom søppelkasser. Det brukes vanligvis sammen med Spring, så vi skal se på det når vi lærer SpringFramework.

3.3 Skaff deg SessionFactory

Det neste trinnet er å hente SessionFactory-objektet. Det er flere måter å gjøre dette på:

Den første måten er å bruke hibernate.properties-filen .

For å gjøre dette trenger du bare å skrive følgende kode:

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

Hvis hibernate.properties-filen ikke finnes i den gjeldende prosjektkatalogen, vil et unntak bli kastet.

Den andre måten er konfigurasjon ved hjelp av hibernate.cfg.xml .

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

Hvis du skriver en slik kode, vil hibernate.cfg.xml. Hvis ingen slik fil blir funnet, vil metoden buildSessionFactory()gi et unntak.

Den tredje måten er å stille inn konfigurasjonsfilen manuelt .

Noen ganger under utviklingsprosessen blir det nødvendig å bytte til en testbase eller endre noen andre innstillinger for å jobbe med basen, for dette kan du stille inn konfigurasjonsfilen manuelt:

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

Metode fire - vi bruker en tilpasset 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 til slutt kan du ganske enkelt sy alle nødvendige parametere direkte inn 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 Angi hvor du skal se etter Entity-klasser

Men det er ikke alt. Når vi konfigurerer et SessionFactory -objekt i Hibernate, sjekker denne SessionFactory at alle de nødvendige tabellene med de nødvendige kolonnetypene finnes i databasen.

Og for at SessionFactory skal kunne gjøre dette, må den sendes en liste over entitetsklasser som den må tilordne til databasen.

Det er tre måter å sende en liste over enhetsklasser på:

Metode én. Legg hibernate.cfg.xmltil en 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. Kalle metoden på konfigurasjonsobjektetaddAnnotatedClass() . Eksempel:

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

Hvis det er mange klasser, kan du legge dem til i hele pakker:

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

3.5 Siste eksempel

Nå som vi har lært hvordan du konfigurerer SessionFactory-objektet, la oss skrive koden som skal bruke det.

Den vil bestå av tre metoder:

  1. Konfigurerer dvalemodus
  2. Metode som henter alle ansatte fra databasen
  3. Metode som lagrer en ny ansatt i databasen

Denne kodemalen vil se omtrent slik ut:

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 utfører en spørring til databasen, må du opprette en separat økt. Hvis forespørslene er relatert, kan de utføres i samme økt. Hvis forespørslene ikke er relatert (og det kan gå flere minutter mellom dem), må de lage sine egne økter.

Hvis du vil lese data fra databasen eller utføre en kompleks spørring, må du først opprette et Query-objekt og bruke det til å utføre spørringen.

Hver spørring til databasen utføres også i sin egen transaksjon. Du må åpne den, utføre de nødvendige operasjonene og deretter lukke (forplikte).

I de påfølgende forelesningene vil vi analysere nærmere hvordan alt dette fungerer.