4.1 İşlemler ve veritabanı bütünlüğü

Bir veritabanının normal çalışma modu, yüzlerce farklı istemciden her dakika binlerce istek aldığı zamandır. Bu durumda, genellikle aynı verilere farklı sorgulardan erişildiğinde durumlar ortaya çıkar.

Daha az sıklıkla, ancak yine, zaman zaman bir talebin belirli bir satırı okuduğu ve aynı anda başka bir talebin onu değiştirdiği durumlar vardır. Birisi sadece yarısı değiştirilmiş bir satır okursa ne olacağını hayal edin? Hiçbir şey iyi değil.

Bu sorun birkaç şekilde çözülür. İlk olarak, değişen satırı kilitleyebilirsiniz. Hem okumak için hem de yazmak için. Bu yöntem işe yarar, ancak üssün hızı büyük ölçüde zarar görür.

İkinci yol, dizgiyi yalnızca yazmak için kilitlemektir. Ancak, birisi kısmen değiştirilmiş satırı okumaya çalıştığında yine de bir sorun olacaktır. Sonuç - hattın kısmen değiştiği bir durum olmamalıdır.

Bu nedenle, üçüncü bir yöntem buldular - işlemler. Bir işlem, hep birlikte gerçekleştirilen veya hiç yapılmayan bir eylemler grubudur. Eylemlerin bir kısmının yapılıp ikinci kısmının yapılmadığı bir durum olamaz. Tüm değişiklikleri yapmak mümkün değilse, daha önce yapılmış olan tüm değişiklikler geri alınır.

Herhangi bir modern SQL sunucusu, verileri yalnızca işlemlerde değiştirmenize izin verir. Bir işlem açarsınız, istediğiniz sayıda tablo üzerinde değişiklik yapar ve işlemi gerçekleştirirsiniz. SQL Server daha sonra değişiklik yapmaya çalışır. Her şey yolundaysa, genel veritabanına eklenirler. Sorun varsa, tüm değişiklikler iptal edilecektir.

Hibernate ayrıca bu paradigmayı kullanır. Bu nedenle, bir önceki derste, Çalışan nesnesini veritabanına kaydetmeye çalışırken, önce bir işlemin açıldığını ve kaydettikten sonra bunun taahhüt edildiğini gördük.

Bu konuyu daha ayrıntılı olarak ele alacağız, ancak şimdilik işlemlere neden ihtiyaç duyulduğunu ve genellikle nerede kullanıldığını bilin.

4.2 Nesneleri alma

Hazırda Bekletme, veri almak için bir istek yürütürse, açıkça bir işlem açmaya gerek yoktur. Hazırda Bekletme, uygun görürse bunu kendisi yapacaktır: kendi ayarları ve SQL sunucusunun ayarları vardır.

Veritabanıyla nasıl çalışılacağını analiz edeceğiz. Ve en basiti, kimliğine göre bir nesne elde etmektir . Bunu yapmak için oturumget() nesnesindeki yöntemi kullanın . Böyle bir talebin genel şekli:

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

Örnek:

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

4.3 Nesneleri kaydetme (ekleme)

Nesnenizi veritabanına kaydetmek istiyorsanız, SQL düzeyinde bir sorgu yürütülür.SOKMAK. Bu nedenle işlemleriniz ayrı bir işlem olarak gerçekleştirilmelidir. Ayrıca, oturumpersist() nesnesinin kalıcılık yöntemini kullanmak daha iyidir .

Böyle bir talebin genel şekli:

session.persist(An object);

Yöntem persist()sadece tabanı değil, nesnenin kendisini de değiştirir. Mesele şu ki, veritabanına bir nesne eklediğimizde, bu nesnenin eklenmeden önce henüz kendi kimliği yok . Nüanslar olsa da genellikle öyledir. Ve nesneyi ekledikten sonra zaten bir kimliği vardır .

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

Oturum nesnesi de save()benzer bir işlevi gerçekleştiren bir yönteme sahiptir . Sadece yöntem save()eski Hibernate standardıdır ve yöntem persist()JPA standardıdır.

4.4 Nesneleri silme

Mevcut bir nesneyi silmek istiyorsanız, bunu yapmak çok kolaydır. Bunu yapmak için oturum nesnesinin özel bir yöntemi vardır - remove().

Böyle bir talebin genel şekli:

session.remove(An object);

Ve tabii ki kodu bir örnekle yazalım:

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

Neden bu kadar zor, soruyorsun?

Her şeyden önce, veritabanındaki herhangi bir değişikliğin her zaman farklı ve her zaman açık olmayan sonuçları vardır. İkincisi, bu nesnenin kendisiyle ilişkilendirilmiş alt nesneleri vb. olabilir. Bu nedenle, silme senaryoları genellikle önemsiz değildir.