3.1 Łączenie Hibernate i baz danych

Dowiedzieliśmy się, jak połączyć Hibernate z naszą aplikacją za pomocą Mavena oraz jak mapować tabele na klasy za pomocą adnotacji. I teraz pojawia się kolejne pytanie - w jaki sposób odczytujemy obiekty z bazy danych lub je tam zapisujemy?

Nie tak szybko. Przede wszystkim musisz zająć się jeszcze trzema sprawami:

  • Konfigurowanie połączenia z bazą danych
  • Konfigurowanie Hibernacji
  • Praca z EntityManagerem

Hibernate całkowicie ukrywa pracę z bazą danych przed Twoją aplikacją, jednak aby uniknąć wszelkich ekscesów, musi być odpowiednio skonfigurowany. Nie możesz pominąć tego etapu – w przeciwnym razie skąd Hibernate będzie wiedział, do której bazy danych zapisać obiekty?

Hibernate można skonfigurować i podać informacje o bazie danych na trzy sposoby

  • Użyj pliku właściwości
  • Użyj pliku hibernate.cfg.xml
  • Użyj metod komponentu bean konfiguracji

I choć najbardziej podoba mi się ten ostatni, na pewno spotkacie się ze wszystkimi trzema, więc tutaj przeanalizujemy wszystkie trzy.

3.2 Autoryzacja w bazie danych

Zacznijmy od najważniejszego - połączeń z bazami danych. Aby to zrobić, musisz podać dane, aby Hibernate mógł zalogować się do żądanej bazy danych.

Konfiguracja pliku właściwości
hibernacja.właściwości
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

Te same ustawienia można ustawić w postaci pliku xml:

Konfiguracja oparta na 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> 

W obu przykładach widzimy te same ustawienia z tymi samymi wartościami. Po prostu pierwszy przykład przedstawia je jako plik właściwości , a drugi jako plik xml .

Te ustawienia są podzielone na trzy grupy:

  1. Określ typ DBMS
    • Określ dialekt (typ DBMS), na przykład Oracle 9.0
    • Podaj nazwę sterownika JDBC do pracy z tym DBMS
  2. Określ dane do autoryzacji w bazie danych
    • Adres bazy danych
    • nazwa użytkownika
    • hasło
  3. Konfigurowanie silnika Hibernate
    • hibernate.show_sql- Hibernate zduplikuje w konsoli wszystkie żądania, które wykonuje
    • hbm2ddl.auto- Hibernate w razie potrzeby zmieni strukturę bazy danych

Istnieje trzeci sposób konfiguracji ustawień - poprzez pojemniki. Zwykle jest używany w połączeniu ze Springiem, więc przyjrzymy się mu, kiedy nauczymy się SpringFramework.

3.3 Pobierz SessionFactory

Następnym krokiem jest pobranie obiektu SessionFactory. Można to zrobić na kilka sposobów:

Pierwszym sposobem jest użycie pliku hibernate.properties .

Aby to zrobić, wystarczy napisać następujący kod:

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

Jeśli plik hibernate.properties nie zostanie znaleziony w bieżącym katalogu projektu, zostanie zgłoszony wyjątek.

Drugim sposobem jest konfiguracja za pomocą pliku hibernate.cfg.xml .

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

Jeśli napiszesz taki kod, to plik hibernate.cfg.xml. Jeśli taki plik nie zostanie znaleziony, metoda buildSessionFactory()zgłosi wyjątek.

Trzecim sposobem jest ręczne ustawienie pliku konfiguracyjnego .

Czasami podczas procesu programowania konieczne staje się przejście do bazy testowej lub zmiana innych ustawień pracy z bazą, w tym celu można ręcznie ustawić plik konfiguracyjny:

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

Metoda czwarta - używamy niestandardowego pliku 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 wreszcie, możesz po prostu wszyć wszystkie niezbędne parametry bezpośrednio do kodu:

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 Określ, gdzie szukać klas jednostek

Ale to nie wszystko. Kiedy konfigurujemy obiekt SessionFactory w Hibernate, ten SessionFactory sprawdza, czy wszystkie wymagane tabele z wymaganymi typami kolumn istnieją w bazie danych.

Aby obiekt SessionFactory mógł to zrobić, musi otrzymać listę klas jednostek, które musi zmapować do bazy danych.

Listę klas jednostek można przekazać na trzy sposoby:

Metoda pierwsza. W hibernate.cfg.xmldodaj linię taką jak:

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

Przykład:

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

Metoda druga. Wywołaj metodę na obiekcie ConfigurationaddAnnotatedClass() . Przykład:

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

Jeśli jest wiele klas, możesz dodać je w całych pakietach:

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

3.5 Ostatni przykład

Teraz, gdy nauczyliśmy się konfigurować obiekt SessionFactory, napiszmy kod, który będzie z niego korzystał.

Będzie się składał z trzech metod:

  1. Konfigurowanie hibernacji
  2. Metoda pobierająca wszystkich pracowników z bazy danych
  3. Metoda zapisująca nowego pracownika do bazy danych

Ten szablon kodu wyglądałby mniej więcej tak:

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

Przed wykonaniem zapytania do bazy danych należy utworzyć osobną sesję. Jeśli żądania są powiązane, można je wykonać w tej samej sesji. Jeśli żądania nie są ze sobą powiązane (i może upłynąć kilka minut między nimi), muszą utworzyć własne sesje.

Jeśli chcesz odczytać dane z bazy danych lub wykonać złożone zapytanie, musisz najpierw utworzyć obiekt Query i użyć go do wykonania zapytania.

Ponadto każde zapytanie do bazy danych jest wykonywane we własnej transakcji. Musisz go otworzyć, wykonać niezbędne operacje, a następnie zamknąć (zatwierdzić).

W kolejnych wykładach przeanalizujemy bardziej szczegółowo, jak to wszystko działa.