3.1 Hibernate und Datenbanken verknüpfen

Wir haben gelernt, wie wir Hibernate mithilfe von Maven mit unserer Anwendung verbinden und wie wir Tabellen mithilfe von Annotationen Klassen zuordnen. Und nun stellt sich die nächste Frage: Wie lesen wir Objekte aus der Datenbank oder speichern sie dort?

Nicht so schnell. Zunächst müssen Sie sich mit drei weiteren Dingen befassen:

  • Konfigurieren einer Datenbankverbindung
  • Ruhezustand einrichten
  • Arbeiten mit EntityManager

Hibernate verbirgt die Arbeit mit der Datenbank vollständig vor Ihrer Anwendung, aber um Übertreibungen zu vermeiden, muss es richtig konfiguriert werden. Sie können diesen Schritt nicht überspringen – woher weiß Hibernate sonst, in welcher Datenbank Objekte gespeichert werden sollen?

Hibernate kann auf drei Arten konfiguriert und mit Datenbankinformationen versorgt werden

  • Verwenden Sie die Eigenschaftendatei
  • Verwenden Sie die Datei hibernate.cfg.xml
  • Verwenden Sie Konfigurations-Bean-Methoden

Und obwohl mir das letzte am besten gefällt, werden Sie auf jeden Fall auf alle drei stoßen, deshalb werden wir hier alle drei analysieren.

3.2 Autorisierung in der Datenbank

Beginnen wir mit dem Wichtigsten – Datenbankverbindungen. Dazu müssen Sie Daten angeben, damit sich Hibernate bei der gewünschten Datenbank anmelden kann.

Konfiguration der Eigenschaftendatei
hibernate.properties
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

Die gleichen Einstellungen können in Form einer XML-Datei vorgenommen werden:

XML-basierte Konfiguration
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>

In beiden Beispielen sehen wir die gleichen Einstellungen mit den gleichen Werten. Es ist nur so, dass das erste Beispiel sie als Eigenschaftendatei darstellt und das zweite als XML-Datei .

Diese Einstellungen sind in drei Gruppen unterteilt:

  1. Geben Sie den Typ des DBMS an
    • Geben Sie den Dialekt (DBMS-Typ) an, zum Beispiel Oracle 9.0
    • Geben Sie den Namen des JDBC-Treibers für die Arbeit mit diesem DBMS an
  2. Geben Sie Daten zur Autorisierung in der Datenbank an
    • Datenbank-URL
    • Nutzername
    • Passwort
  3. Konfigurieren der Hibernate Engine
    • hibernate.show_sql- Hibernate dupliziert alle von ihm ausgeführten Anforderungen in der Konsole
    • hbm2ddl.auto- Hibernate ändert bei Bedarf die Datenbankstruktur

Es gibt eine dritte Möglichkeit, die Konfiguration festzulegen – über Bins. Es wird normalerweise in Verbindung mit Spring verwendet, daher werden wir es uns ansehen, wenn wir SpringFramework lernen.

3.3 Holen Sie sich die SessionFactory

Der nächste Schritt besteht darin, das SessionFactory-Objekt abzurufen. Dafür gibt es mehrere Möglichkeiten:

Die erste Möglichkeit besteht darin, die Datei hibernate.properties zu verwenden .

Dazu müssen Sie lediglich den folgenden Code schreiben:

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

Wenn die Datei hibernate.properties nicht im aktuellen Projektverzeichnis gefunden wird, wird eine Ausnahme ausgelöst.

Die zweite Möglichkeit ist die Konfiguration mit hibernate.cfg.xml .

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

Wenn Sie solchen Code schreiben, dann wird die hibernate.cfg.xml. Wenn keine solche Datei gefunden wird, buildSessionFactory()löst die Methode eine Ausnahme aus.

Die dritte Möglichkeit besteht darin, die Konfigurationsdatei manuell festzulegen .

Manchmal ist es während des Entwicklungsprozesses erforderlich, zu einer Testbasis zu wechseln oder andere Einstellungen für die Arbeit mit der Basis zu ändern. Dazu können Sie die Konfigurationsdatei manuell festlegen:

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

Methode vier – wir verwenden eine benutzerdefinierte hibernate.properties-Datei:

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

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

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

Und schließlich können Sie alle notwendigen Parameter einfach direkt in den Code einnähen:

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 Geben Sie an, wo nach Entitätsklassen gesucht werden soll

Aber das ist noch nicht alles. Wenn wir im Ruhezustand ein SessionFactory- Objekt konfigurieren , prüft diese SessionFactory , ob alle erforderlichen Tabellen mit den erforderlichen Spaltentypen in der Datenbank vorhanden sind.

Und damit die SessionFactory dies tun kann, muss ihr eine Liste von Entitätsklassen übergeben werden, die sie der Datenbank zuordnen muss.

Es gibt drei Möglichkeiten, eine Liste von Entitätsklassen zu übergeben:

Methode eins. Fügen Sie hibernate.cfg.xmleine Zeile hinzu wie:

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

Beispiel:

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

Methode zwei. Rufen Sie die Methode für das KonfigurationsobjektaddAnnotatedClass() auf . Beispiel:

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

Wenn es viele Klassen gibt, können Sie diese in ganzen Paketen hinzufügen:

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

3.5 Letztes Beispiel

Nachdem wir nun gelernt haben, wie man das SessionFactory-Objekt konfiguriert, schreiben wir den Code, der es verwendet.

Es wird aus drei Methoden bestehen:

  1. Konfigurieren des Ruhezustands
  2. Methode, die alle Mitarbeiter aus der Datenbank abruft
  3. Methode, die einen neuen Mitarbeiter in der Datenbank speichert

Diese Codevorlage würde etwa so aussehen:

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

Bevor Sie eine Abfrage an die Datenbank ausführen, müssen Sie eine separate Sitzung erstellen. Wenn die Anfragen zusammenhängen, können sie in derselben Sitzung ausgeführt werden. Wenn die Anfragen nichts miteinander zu tun haben (und zwischen ihnen mehrere Minuten vergehen können), müssen sie ihre eigenen Sitzungen durchführen.

Wenn Sie Daten aus der Datenbank lesen oder eine komplexe Abfrage ausführen möchten, müssen Sie zunächst ein Query-Objekt erstellen und dieses zum Ausführen Ihrer Abfrage verwenden.

Außerdem wird jede Abfrage an die Datenbank in einer eigenen Transaktion ausgeführt. Sie müssen es öffnen, die erforderlichen Vorgänge ausführen und dann schließen (festschreiben).

In den folgenden Vorträgen werden wir genauer analysieren, wie das alles funktioniert.