3.1 Conectarea Hibernate și baze de date

Am învățat cum să conectăm Hibernate la aplicația noastră folosind Maven și cum să mapam tabelele la clase folosind adnotări. Și acum apare următoarea întrebare - cum citim obiectele din baza de date sau le salvăm acolo?

Nu asa de repede. În primul rând, trebuie să vă ocupați de încă trei lucruri:

  • Configurarea unei conexiuni la baza de date
  • Configurarea Hibernate
  • Lucrul cu EntityManager

Hibernate ascunde complet lucrul cu baza de date din aplicația ta, dar pentru a evita orice excese, aceasta trebuie configurată corect. Nu puteți sări peste această etapă - altfel, cum va ști Hibernate în ce bază de date să salveze obiectele?

Hibernate poate fi configurat și furnizate informații de bază de date în trei moduri

  • Utilizați fișierul Proprietăți
  • Utilizați fișierul hibernate.cfg.xml
  • Utilizați metode de bean de configurare

Și deși ultimul îmi place cel mai mult, cu siguranță le vei întâlni pe toate trei, așa că le vom analiza pe toate trei aici.

3.2 Autorizare în baza de date

Să începem cu cele mai importante - conexiunile la baze de date. Pentru a face acest lucru, va trebui să furnizați date, astfel încât Hibernate să se poată conecta la baza de date dorită.

Configurare fișier de proprietăți
hibernare.proprietăţi
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

Aceleași setări pot fi setate sub forma unui fișier xml:

Configurație bazată pe XML
hibernate.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> 

În ambele exemple, vedem aceleași setări cu aceleași valori. Doar că primul exemplu le reprezintă ca fișier de proprietăți , iar al doilea ca fișier xml .

Aceste setări sunt împărțite în trei grupuri:

  1. Specificați tipul de SGBD
    • Specificați dialectul (tip DBMS), de exemplu, Oracle 9.0
    • Specificați numele driverului JDBC pentru lucrul cu acest SGBD
  2. Specificați datele pentru autorizare în baza de date
    • adresa URL a bazei de date
    • nume de utilizator
    • parola
  3. Configurarea motorului Hibernate
    • hibernate.show_sql- Hibernate va duplica în consolă toate solicitările pe care le execută
    • hbm2ddl.auto- Hibernate va schimba structura bazei de date dacă este necesar

Există o a treia modalitate de setare a configurației - prin containere. Este de obicei folosit împreună cu Spring, așa că ne vom uita la el când vom învăța SpringFramework.

3.3 Obțineți SessionFactory

Următorul pas este să obțineți obiectul SessionFactory. Există mai multe moduri de a face acest lucru:

Prima modalitate este să utilizați fișierul hibernate.properties .

Pentru a face acest lucru, trebuie doar să scrieți următorul cod:

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

Dacă fișierul hibernate.properties nu se găsește în directorul curent al proiectului, va fi aruncată o excepție.

A doua modalitate este configurarea folosind hibernate.cfg.xml .

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

Dacă scrieți un astfel de cod, atunci hibernate.cfg.xml. Dacă nu se găsește un astfel de fișier, metoda buildSessionFactory()va arunca o excepție.

A treia modalitate este să setați manual fișierul de configurare .

Uneori, în timpul procesului de dezvoltare, devine necesar să treceți la o bază de testare sau să schimbați alte setări pentru lucrul cu baza, pentru aceasta puteți seta manual fișierul de configurare:

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

Metoda patru - folosim un fișier personalizat hibernate.properties:

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

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

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

Și, în sfârșit, puteți pur și simplu coase toți parametrii necesari direct în cod:

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 Specificați unde să căutați clasele de Entități

Dar asta nu este tot. Când configurăm un obiect SessionFactory în Hibernate, acest SessionFactory verifică dacă toate tabelele necesare cu tipurile de coloane necesare există în baza de date.

Și pentru ca SessionFactory să poată face acest lucru, trebuie să i se transmită o listă de clase de entități pe care trebuie să le mapeze la baza de date.

Există trei moduri de a trece o listă de clase de entități:

Metoda unu. Adăugați hibernate.cfg.xmlo linie ca:

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

Exemplu:

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

Metoda a doua. Apelați metoda pe obiectul ConfigurareaddAnnotatedClass() . Exemplu:

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

Dacă există multe clase, atunci le puteți adăuga în pachete întregi:

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

3.5 Exemplu final

Acum că am învățat cum să configuram obiectul SessionFactory, să scriem codul care îl va folosi.

Acesta va consta din trei metode:

  1. Configurarea Hibernare
  2. Metodă care scoate toți angajații din baza de date
  3. Metodă care salvează un nou angajat în baza de date

Acest șablon de cod ar arăta cam așa:

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

Înainte de a executa o interogare în baza de date, trebuie să creați o sesiune separată. Dacă solicitările sunt legate, atunci acestea pot fi executate în aceeași sesiune. Dacă solicitările nu au legătură (și pot trece câteva minute între ele), atunci trebuie să-și facă propriile sesiuni.

Dacă doriți să citiți date din baza de date sau să executați o interogare complexă, trebuie mai întâi să creați un obiect Query și să îl utilizați pentru a executa interogarea.

De asemenea, fiecare interogare către baza de date este executată în propria tranzacție. Trebuie să îl deschideți, să efectuați operațiunile necesare și apoi să închideți (comitați).

În prelegerile următoare, vom analiza mai detaliat cum funcționează toate acestea.