4.1 Transaktionen und Datenbankintegrität

Der normale Betriebsmodus einer Datenbank besteht darin, dass sie jede Minute Tausende von Anfragen von Hunderten verschiedener Clients erhält. Dabei kommt es häufig zu Situationen, in denen aus unterschiedlichen Abfragen auf dieselben Daten zugegriffen wird.

Seltener, aber auch hier kommt es von Zeit zu Zeit vor, dass eine Anfrage eine bestimmte Zeile liest und eine andere Anfrage sie gleichzeitig ändert. Stellen Sie sich vor, was passiert, wenn jemand eine Zeile liest, die nur zur Hälfte geändert ist? Nichts Gutes.

Dieses Problem wird auf verschiedene Weise gelöst. Erstens können Sie einfach die Zeile sperren, die sich ändert. Sowohl zum Lesen als auch zum Schreiben. Diese Methode funktioniert, allerdings leidet die Geschwindigkeit der Basis stark.

Die zweite Möglichkeit besteht darin, die Zeichenfolge nur zum Schreiben zu sperren. Es wird jedoch immer noch ein Problem auftreten, wenn jemand versucht, die teilweise geänderte Zeile zu lesen. Fazit: Es sollte nicht vorkommen, dass die Zeile teilweise geändert wird.

Deshalb haben sie eine dritte Methode entwickelt – Transaktionen. Eine Transaktion ist eine Gruppe von Aktionen, die entweder alle zusammen oder gar nicht ausgeführt werden. Es kann keine Situation geben, in der ein Teil der Aktionen ausgeführt wurde, der zweite Teil jedoch nicht. Wenn nicht alle Änderungen durchgeführt werden können, werden alle bereits vorgenommenen Änderungen rückgängig gemacht.

Auf jedem modernen SQL-Server können Sie Daten nur in Transaktionen ändern. Sie öffnen eine Transaktion, nehmen Änderungen an einer beliebigen Anzahl von Tabellen vor und schreiben die Transaktion fest. SQL Server versucht dann, Änderungen vorzunehmen. Wenn alles in Ordnung ist, werden sie zur allgemeinen Datenbank hinzugefügt. Wenn es Probleme gab, werden alle Änderungen verworfen.

Auch Hibernate nutzt dieses Paradigma. Aus diesem Grund haben wir in der vorherigen Vorlesung gesehen, dass beim Versuch, das Employee-Objekt in der Datenbank zu speichern, zunächst eine Transaktion geöffnet und nach dem Speichern festgeschrieben wurde.

Wir werden auf dieses Thema detaillierter eingehen, aber zunächst müssen wir nur wissen, warum Transaktionen benötigt werden und wo sie normalerweise verwendet werden.

4.2 Objekte abrufen

Wenn Hibernate eine Anfrage zum Abrufen von Daten ausführt, ist es nicht erforderlich, explizit eine Transaktion zu öffnen. Hibernate selbst wird dies tun, wenn es dies für richtig hält: Es hat seine eigenen Einstellungen sowie die Einstellungen des SQL-Servers.

Wir werden analysieren, wie mit der Datenbank gearbeitet wird. Und die einfachste davon besteht darin, ein Objekt anhand seiner ID zu ermitteln . Verwenden Sie dazu die Methode get()für das Sitzungsobjekt . Die allgemeine Form einer solchen Anfrage:

Class Name = session.get(Class.class, ID);

Beispiel:

public User getUserById(Integer id) {
    try (Session session = sessionFactory.openSession()) {
        User user = session.get(User.class, id);
        return user;
    }
}

4.3 Objekte speichern (hinzufügen).

Wenn Sie Ihr Objekt in der Datenbank speichern möchten, wird eine Abfrage auf SQL-Ebene ausgeführtEINFÜGUNG. Daher müssen Ihre Aktionen als separate Transaktion ausgeführt werden. Außerdem ist es besser ,persist() die Methode des Sitzungsobjekts für die Persistenz zu verwenden .

Die allgemeine Form einer solchen Anfrage:

session.persist(An object);

Die Methode persist()verändert nicht nur die Basis, sondern auch das Objekt selbst. Die Sache ist, dass, wenn wir ein Objekt zur Datenbank hinzufügen, dieses Objekt vor dem Hinzufügen noch keine eigene ID hat . Nun ja, normalerweise so, obwohl es Nuancen gibt. Und nach dem Hinzufügen hat das Objekt bereits eine ID .

public boolean saveUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.persist(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

Das Session- Objekt verfügt auch über eine Methode save(), die eine ähnliche Funktion ausführt. Es ist nur so, dass die Methode save()der alte Hibernate-Standard und die Methode persist()der JPA-Standard ist.

4.4 Objekte löschen

Wenn Sie ein vorhandenes Objekt löschen möchten, ist dies ganz einfach. Zu diesem Zweck verfügt das Sitzungsobjekt über eine spezielle Methode – remove().

Die allgemeine Form einer solchen Anfrage:

session.remove(An object);

Und natürlich schreiben wir den Code anhand eines Beispiels:

public boolean removeUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.remove(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

Warum ist es so schwierig, fragen Sie?

Zunächst einmal haben alle Änderungen an der Datenbank immer unterschiedliche und nicht immer offensichtliche Konsequenzen. Und zweitens könnten mit diesem Objekt untergeordnete Objekte usw. verknüpft sein. Daher sind Löschszenarien oft nicht trivial.