4.1 Transaksi dan integriti pangkalan data

Mod operasi biasa pangkalan data ialah apabila ia menerima beribu-ribu permintaan setiap minit daripada ratusan pelanggan yang berbeza. Dalam kes ini, situasi sering timbul apabila data yang sama diakses daripada pertanyaan yang berbeza.

Kurang kerap, tetapi, sekali lagi, dari semasa ke semasa terdapat situasi apabila satu permintaan membaca baris tertentu, dan permintaan lain mengubahnya pada masa yang sama. Bayangkan apa yang berlaku jika seseorang membaca baris yang hanya berubah separuh? Tiada yang baik.

Masalah ini diselesaikan dengan beberapa cara. Pertama, anda hanya boleh mengunci baris yang berubah. Baik untuk membaca mahupun untuk menulis. Kaedah ini berfungsi, tetapi kelajuan pangkalan sangat merosot.

Cara kedua ialah mengunci rentetan untuk menulis sahaja. Walau bagaimanapun, masih terdapat masalah apabila seseorang cuba membaca baris yang diubah suai sebahagiannya. Kesimpulan - tidak sepatutnya ada situasi apabila garisan sebahagiannya diubah.

Oleh itu, mereka datang dengan kaedah ketiga - urus niaga. Transaksi ialah sekumpulan tindakan yang dilakukan sama ada secara bersama-sama, atau tidak sama sekali. Tidak boleh ada situasi di mana sebahagian daripada tindakan dilakukan, dan bahagian kedua tidak. Jika tidak mungkin untuk membuat semua perubahan, maka semua perubahan yang telah dibuat akan digulung semula.

Mana-mana pelayan SQL moden membenarkan anda menukar data hanya dalam transaksi. Anda membuka urus niaga, membuat sebarang perubahan pada sebarang bilangan jadual dan melakukan transaksi. SQL Server kemudian cuba membuat perubahan. Jika semuanya baik-baik saja, maka ia akan ditambahkan ke pangkalan data umum. Jika terdapat masalah, maka semua perubahan akan dibatalkan.

Hibernate juga menggunakan paradigma ini. Itulah sebabnya dalam kuliah sebelumnya kita melihat bahawa apabila cuba menyimpan objek Pekerja ke pangkalan data, transaksi pertama kali dibuka, dan selepas menyimpan, ia dilakukan.

Kami akan membincangkan topik ini dengan lebih terperinci, tetapi buat masa ini, ketahui sahaja mengapa urus niaga diperlukan dan di mana ia biasanya digunakan.

4.2 Mendapatkan objek

Jika Hibernate melaksanakan permintaan untuk mendapatkan data, maka tidak perlu membuka transaksi secara eksplisit. Hibernate sendiri akan melakukan ini jika dilihat sesuai: ia mempunyai tetapannya, serta tetapan pelayan SQL.

Kami akan menganalisis cara bekerja dengan pangkalan data. Dan yang paling mudah ialah mendapatkan objek dengan IDnya . Untuk melakukan ini, gunakan kaedah get()pada objek sesi . Bentuk umum permintaan sedemikian:

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 (menambah) objek

Jika anda ingin menyimpan objek anda ke pangkalan data, maka pertanyaan akan dilaksanakan pada peringkat SQLINSERT. Oleh itu, tindakan anda mesti dilakukan sebagai transaksi berasingan. Selain itu, lebih baik menggunakan kaedah persist()objek sesi untuk kegigihan .

Bentuk umum permintaan sedemikian:

session.persist(An object);

Kaedah persist()mengubah bukan sahaja asas, tetapi juga objek itu sendiri. Masalahnya ialah apabila kita menambah objek pada pangkalan data, objek ini belum mempunyai ID sendiri sebelum menambahkannya . Nah, biasanya begitu, walaupun terdapat nuansa. Dan selepas menambah objek sudah mempunyai 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 Sesi juga mempunyai kaedah save()yang melaksanakan fungsi yang serupa. Cuma kaedahnya save()adalah standard Hibernate lama dan kaedahnya persist()adalah standard JPA.

4.4 Memadam objek

Jika anda ingin memadamkan objek sedia ada, maka sangat mudah untuk melakukannya. Untuk melakukan ini, objek sesi mempunyai kaedah khas - remove().

Bentuk umum permintaan sedemikian:

session.remove(An object);

Dan, sudah tentu, mari tulis kod dengan 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 ia begitu sukar, anda bertanya?

Pertama sekali, sebarang perubahan pada pangkalan data sentiasa mempunyai akibat yang berbeza dan tidak selalu jelas. Dan kedua, objek ini boleh mempunyai objek kanak-kanak yang dikaitkan dengannya, dsb. Jadi senario pemadaman selalunya bukan perkara remeh.