4.1 Transaksi dan integritas basis data

Mode normal operasi database adalah ketika menerima ribuan permintaan setiap menit dari ratusan klien yang berbeda. Dalam hal ini, situasi sering muncul ketika data yang sama diakses dari query yang berbeda.

Lebih jarang, tetapi, sekali lagi, dari waktu ke waktu ada situasi ketika satu permintaan membaca baris tertentu, dan permintaan lain mengubahnya pada saat yang bersamaan. Bayangkan apa yang terjadi jika seseorang membaca baris yang hanya setengah berubah? Tidak ada yang baik.

Masalah ini diselesaikan dengan beberapa cara. Pertama, Anda cukup mengunci garis yang berubah. Baik untuk membaca maupun untuk menulis. Metode ini berhasil, tetapi kecepatan pangkalan sangat menderita.

Cara kedua adalah mengunci string untuk menulis saja. Namun, masih akan ada masalah saat seseorang mencoba membaca baris yang dimodifikasi sebagian. Kesimpulan - seharusnya tidak ada situasi ketika garis diubah sebagian.

Oleh karena itu, mereka menemukan metode ketiga - transaksi. Transaksi adalah sekelompok tindakan yang dilakukan bersama-sama, atau tidak sama sekali. Tidak mungkin ada situasi di mana bagian dari tindakan dilakukan, dan bagian kedua tidak. Jika tidak memungkinkan untuk melakukan semua perubahan, maka semua perubahan yang sudah dilakukan akan dibatalkan.

Setiap server SQL modern memungkinkan Anda untuk mengubah data hanya dalam transaksi. Anda membuka transaksi, membuat perubahan apa pun pada sejumlah tabel, dan melakukan transaksi. SQL Server kemudian mencoba membuat perubahan. Jika semuanya baik-baik saja, maka mereka akan ditambahkan ke database umum. Jika ada masalah, maka semua perubahan akan dibatalkan.

Hibernasi juga menggunakan paradigma ini. Itulah mengapa pada kuliah sebelumnya kita melihat bahwa saat mencoba menyimpan objek Employee ke database, sebuah transaksi pertama kali dibuka, dan setelah disimpan, transaksi tersebut dikomit.

Kami akan membahas topik ini secara lebih rinci, tetapi untuk saat ini, ketahui saja mengapa transaksi diperlukan dan di mana biasanya digunakan.

4.2 Mendapatkan objek

Jika Hibernate mengeksekusi permintaan untuk mendapatkan data, maka tidak perlu membuka transaksi secara eksplisit. Hibernasi sendiri akan melakukan ini jika dianggap perlu: ia memiliki pengaturannya sendiri, serta pengaturan server SQL.

Kami akan menganalisis cara bekerja dengan database. Dan yang paling sederhana adalah mendapatkan objek dengan ID -nya . Untuk melakukannya, gunakan metode get()pada objek sesi . Bentuk umum permintaan seperti itu:

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

Contoh:

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

4.3 Menyimpan (menambahkan) objek

Jika Anda ingin menyimpan objek Anda ke database, maka kueri akan dieksekusi di tingkat SQLMENYISIPKAN. Oleh karena itu, tindakan Anda harus dilakukan sebagai transaksi terpisah. Selain itu, lebih baik menggunakan metode persist()objek session untuk persistence .

Bentuk umum permintaan seperti itu:

session.persist(An object);

Metode persist()tidak hanya mengubah basis, tetapi juga objek itu sendiri. Masalahnya adalah ketika kita menambahkan objek ke database, objek tersebut belum memiliki ID sendiri sebelum menambahkannya . Nah, biasanya begitu, meski ada nuansanya. Dan setelah menambahkan objek tersebut sudah memiliki 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;
   	}
}

Objek Session juga memiliki metode save()yang melakukan fungsi serupa. Hanya saja metodenya save()standar Hibernate lama dan metodenya persist()standar JPA.

4.4 Menghapus objek

Jika Anda ingin menghapus objek yang sudah ada, maka caranya sangat mudah. Untuk melakukan ini, objek sesi memiliki metode khusus - remove().

Bentuk umum permintaan seperti itu:

session.remove(An object);

Dan, tentu saja, mari kita tulis kodenya dengan sebuah contoh:

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

Mengapa begitu sulit, Anda bertanya?

Pertama-tama, setiap perubahan pada database selalu memiliki konsekuensi yang berbeda dan tidak selalu jelas. Dan kedua, objek ini dapat memiliki objek turunan yang terkait dengannya, dll. Jadi, skenario penghapusan seringkali tidak sepele.