Olası nesne durumu seçenekleri

Fark etmiş olabileceğiniz gibi, bir nesne Hibernate'e eklendiğinde, durumu Persistent veya Managed olarak adlandırılır . Nasıl doğru? Kalıcı mı yoksa Yönetilen mi?

Bu mümkün ve çok ve çok. JPA spesifikasyonuna göre, bir nesnenin Kalıcı durumu vardır ve Hazırda Bekleme spesifikasyonuna göre, durumu Yönetilen olarak adlandırılır.

Hazırda Bekletme modunda, veritabanıyla çalışma, org.hibernate.Session türündeki bir nesne aracılığıyla gerçekleştirilir . JPA'ya göre sınıfın adı javax.persistence.EntityManager olmalıdır. Her iki tür de arayüz olduğundan, bu gerçekten büyük bir sorun değil.

org.hibernate.Session arabirimi şu şekilde bildirilir:

interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager,    QueryProducer, java.io.Serializable, SharedSessionContract {

}

Bu nedenle, Oturum arabirimi, EntityManager arabirimindeki tüm yöntemlere sahiptir . Ancak, henüz JPA spesifikasyonu olmadığında, Hibernate'in önceki sürümlerinden miras aldığı kendine ait bir özelliği de vardır.

Bütün bu durum şu şekilde açıklanmaktadır:

Oturum arayüzünün sahip olduğu tüm yöntemlere ve çalışmalarının nüanslarına bir göz atalım.

persist() yönteminin nüansları

Bir nesneyi veritabanına kaydederken iki şeyi hatırlamanız gerekir.

İlk olarak, nesneyi kaydetmek, sonunda SQL komutlarından birinin yürütülmesiyle sonuçlanacaktır: INSERT veya UPDATE. İkinci olarak, bu eylemler, nesnenin yöntemini çağırdıktan hemen sonra gerçekleşmeyecektir.oturum, ancak yalnızca işlemi kapattıktan sonra.

Bazı basit durumları ele alalım, örneğin, bir User sınıfınız var :

@Entity
public class User {
	@Id
	@GeneratedValue
    public Integer id;

	@Columnt(name=”user_name”)
    public String name;
}

Persist() metodunu kullanarak nesnesini veritabanına kaydedelim .

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

Bu yöntemin amacı veritabanına yeni bir nesne kaydetmektir. Henüz böyle bir nesne yoksa, INSERT SQL yöntemi çağrılarak veritabanına eklenecektir .

Nesne zaten veritabanındaysa, hiçbir şey olmaz. Bununla birlikte, üçüncü bir durum da mümkündür - Ayrılmış durumdaki bir nesneyi veritabanına kaydetme girişimi. Bu durumda, bir istisna atılacaktır. Örnek:

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

session.evict(user);     // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!

save() yönteminin nüansları

save() yöntemi, geçerli Hibernate tarafından önceki sürümlerinden devralınmıştır. Özünde, persist() yöntemine çok benzer , ayrıca INSERT yöntemini kullanarak tabloya yeni bir kayıt ekler. Ancak, birkaç ilginç nüansı var.

İlk olarak, bu yöntem bir değer döndürür - nesnenin yeni kimliği . Bildiğiniz gibi, nesnelerin veri tabanına eklenmeden önce genellikle bir kimlikleri yoktur ve zaten veri tabanı tarafından atanmıştır. Bu nedenle, oturum nesnesinin save() yöntemi , kaydedilen nesneye atanan kimliği döndürür.

Önemli! Hazırda Bekletme Kimliği belirtimine göre, yalnızca bir sayı değil, herhangi bir seri hale getirilebilir nesne olabilir. Veritabanındaki bir tablonun bir sütununa tamamen yerleştirilebilen bir dizi, bir sayı, bir enum veya genel olarak herhangi bir şey olabilir.

save() yöntemi Serileştirilmiş bir sonuç türüne sahiptir, dolayısıyla sonucu doğru türe dönüştürülmelidir:

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

Ayrıca, save() yöntemi , nesnenin Ayrılmış durumunda farklı bir davranışa sahiptir. Böyle bir nesneyi yeni olarak kabul eder ve basitçe başka bir giriş ekler:

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

session.evict(user); 	// detach the object from the session
Integer id2 = (Integer) session.save(user);

id ve id2 değişkenleri farklı olacaktır. Veritabanındaki tabloya her bir save() işlemi için bir kayıt eklenecektir .