birleştirme() yönteminin nüansları

Halihazırda veritabanında depolanan bir nesneyi değiştirmek için Hazırda Beklet'i kullanmak istiyorsanız, bunun için de birkaç yöntem vardır.

İlki , aktarılan nesneye göre veritabanındaki bilgileri güncelleyen birleştirme() yöntemidir . Bu, SQL UPDATE sorgusunu çağırır. Örnek:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

User user2 = (User) session.merge(user);

Burada birkaç önemli nüans var.

İlk olarak, merge() yöntemi , güncellenen nesne olan sonucu döndürür. Bu nesnenin Kalıcı durumu vardır ve oturum nesnesine iliştirilmiştir. birleştirme() yöntemine iletilen nesne değişmez.

Kullanıcı ve kullanıcı2 arasında fark yok gibi görünebilir, ancak değildir. Merge() yöntemine bir POJO nesnesi iletebilirsiniz ve sonuç olarak, yöntem bir proxy döndürebilir (Hazırda Bekleme ayarlarına bağlı olarak). Bu nedenle, birleştirme() yönteminin iletilen nesneyi değiştirmediğini unutmayın .

İkinci olarak, birleştirme()' ye iletilen nesnenin durumu Geçici ise (ve kimliği yoksa), bu durumda veritabanında onun için ayrı bir satır oluşturulur. Başka bir deyişle, persist() komutu yürütülecektir .

Üçüncüsü, oturuma zaten eklenmiş bir nesne (Persist durumuyla) birleştirme() yöntemine iletilirse, o zaman hiçbir şey olmaz - yöntem aynı nesneyi döndürür. Neden? Ve hepsi, işlem yapıldığında, veriler yine de veritabanına yazılacağı için:

User user = new User();
user.setName("Kolyan");
session.save(user);

user.setName("Masha"); //change the object attached to the session

session.close();  //all changed objects will be written to the database

Herhangi bir değişiklikten sonra nesneyi her seferinde kaydetmeye gerek yoktur. Bu nesne Kalıcı durumdaysa, Hazırda Bekletme her şeyi kendisi yapacaktır. Eğer "tabana bağlı" bir nesneyi değiştirirseniz, tüm değişiklikleri tabana yazılacaktır.

update() yönteminin nüansları

Hibernate ayrıca, save() yöntemi gibi önceki sürümlerden devralınan bir update() yöntemine de sahiptir. Bu yöntemle, yalnızca önceden kaydedilmiş bir nesnenin verilerini güncelleyebilirsiniz. Bu, SQL UPDATE sorgusunu çağırır. Örnek:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

session.update(user);

Bu yöntem hiçbir şey döndürmez ve mevcut nesneyi değiştirmez.

Bu yöntemi yeni bir nesnede çağırırsanız, basitçe bir istisna atılır:

User user = new User();
user.setName("Kolyan");
session.update(user);   //an exception will be thrown here

saveOrUpdate() Yöntem

JPA'nın ortaya çıkmasından önce, persist() yönteminin işlevi saveOrUpdate() yöntemi tarafından gerçekleştiriliyordu . Görevi, veritabanındaki mevcut nesne hakkındaki bilgileri güncellemek ve yoksa, onu oluşturmaktı. Neredeyse her zaman save() ve update() yöntemlerinin yerine kullanılır .

update() yönteminin aksine , kendisine iletilen nesneyi değiştirebilir. Örneğin, veritabanına kaydederken atanan kimliğe ayarlayın. Örnek:

User user = new User();
user.setName("Kolyan");
session.saveOrUpdate(user);   //object will be written to the database

Nasıl çalışır:

  • iletilen nesnenin bir kimliği varsa, UPDATE SQL yöntemi çağrılır
  • geçirilen nesnenin kimliği ayarlanmamışsa, INSERT SQL yöntemi çağrılır