Hazırda bekletme modundaki ayrılmış, kalıcı ve geçici nesneler nelerdir?


101

Hazırda bekletme modundaki ayrılmış, kalıcı ve geçici nesneler nelerdir? Lütfen bir örnekle açıklayınız.


session.close üzerine oturum kapsamında kalıcı olan tüm nesneleri kaldırmaz mı?
Jigar Joshi

Evet, bir nesnenin bir oturumu kapattığınızda kalıcı durumu Ayrılmış duruma dönüştürülür.
Rachel

@Rachel güzel bağlantısı, daha derin bir anlayış için
kodla sağlandı

Yanıtlar:


162

A newile ilişkili Sessionolmayan, veritabanında temsili olmayan ve hiçbir tanımlayıcı değeri Hibernate tarafından geçici olarak değerlendirilen kalıcı bir sınıf örneği :

Person person = new Person();
person.setName("Foobar");
// person is in a transient state

Bir kalıcı örneği veritabanında bir gösterimini, bir tanımlayıcı bir değere sahiptir ve bir ile ilişkilidir Session. Geçici bir vakayı aşağıdakilerle ilişkilendirerek kalıcı hale getirebilirsiniz Session:

Long id = (Long) session.save(person);
// person is now in a persistent state

Şimdi, closeHazırda Bekletersek Session, kalıcı bulut sunucusu ayrılmış bir bulut sunucusuna dönüşecektir : artık bir bulut sunucusuna bağlı değildir Session(ancak yine de değiştirilebilir ve Sessiondaha sonra yenisine yeniden bağlanabilir ).

Tüm bunlar 10. Bölümün tamamında açık bir şekilde açıklanmıştır. Hazırda bekletme belgelerinin yalnızca yukarıda açıkladığım nesnelerle çalışma . Kesinlikle okunması gereken bir şey.


Tanımlayıcı değeri, atanmış tanımlayıcı oluşturma stratejisini kullanabildiğim için, bir nesnenin kalıcı olması için büyük olasılıkla katı bir koşul değildir.
Abhijeet Kashnia

Örnekte okuyan oturumu kapatmanın yanı sıra, bir örnek session.evict () çağırarak ayrılabilir. Bu, onu Hazırda Bekletme tarafından yönetilmekten çıkarır (böylece, örnekteki değişikliklerin otomatik olarak tekrar veritabanına yayılmasını önler). Değişiklikleri db'ye session.update () aracılığıyla gönderebilir ve session.merge () ile yeniden ekleyebilirsiniz.
Mooshu

1
Çoğu zaman çerçeveler tarafından sağlanan orijinal dokümanları takip etmiyoruz .. Bazen kendisinde doğru açıklamalarla birlikte gizli bilgilere sahip olan sadece keşfetmeye ihtiyaç duyarız. tek sorun, onu kolayca bulamıyoruz :)
agpt

A persistent instance has a representation in the databaseKalıcı bir varlık, kaydetme işlemini gerçekleştirmeden önce veritabanında bir temsile sahip değildir.
O.Badr

1
Öyleyse, bağımsız ve geçici varlık farkı, kimliğin varlığı mı? Atanmış kimliğe sahip yeni bir örnek oluşturursam, resmi olarak geçicidir, çünkü henüz kalıcı değildir, ancak bir kimliği olduğu için ayrılmış durumdan ayırt edilemez. Sağ?
Ruslan Stelmachenko

9

Hazırda bekletme modundaki nesne aşağıdaki durumlara sahiptir:

Geçici - Yeni operatör kullanılarak örneklenen nesnelere geçici nesneler denir.

Bir nesne yeni operatör kullanılarak henüz başlatılmışsa geçicidir ve Hazırda Bekletme Oturumu ile ilişkilendirilmemişse. Veritabanında kalıcı bir temsili yoktur ve herhangi bir tanımlayıcı değeri atanmamıştır. Uygulama artık bir referans tutmuyorsa geçici örnekler çöp toplayıcı tarafından yok edilecektir.

Kalıcı - Kendisiyle ilişkilendirilmiş bir veritabanı kimliğine sahip olan nesneye kalıcı nesne denir.

Kalıcı bir örnek, veritabanında bir gösterime ve bir tanımlayıcı değerine sahiptir. Yeni kaydedilmiş veya yüklenmiş olabilir; ancak, tanımı gereği bir Oturum kapsamındadır. Hazırda bekletme, kalıcı durumdaki bir nesnede yapılan değişiklikleri algılar ve çalışma birimi tamamlandığında durumu veritabanıyla senkronize eder.

Ayrılmış - Ayrılmış bir örnek, kalıcı olan ancak Oturumu kapatılmış bir nesnedir.

Ayrılmış bir örnek, daha sonraki bir zamanda yeni bir Oturuma yeniden bağlanabilir ve bu da onu tekrar kalıcı hale getirir. Bu özellik, kullanıcının düşünme süresi gerektiren uzun süreli çalışma birimleri için bir programlama modeli sağlar. Bunlara uygulama işlemleri, yani kullanıcı açısından bir iş birimi diyoruz.

http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012


5

Çöp toplayıcı bakış açısından da açıklayayım.

Hazırda bekletme (veya) Hazırda bekletme Nesne Kapsamı için 3 Nesne durumu vardır.

  1. Geçici durum
  2. kalıcı durum
  3. bağımsız devlet

Bir kod örneği ile anlamak daha iyidir.

POJO sınıfını Öğrenci Nesnesi olarak ele alalım->

Student student = new Student(); 

Şimdi, bu öğrenci nesnesi geçici durumda .


Bu POJO nesnesini oturumu hazırda bekletmek için bağladığımızda->

session.save(student);

Şimdi bu POJO nesnesi kalıcı durumda .

(Çöp toplayıcı bakış açısı - GC kalıcı durumda olan herhangi bir nesneyi silemez. Soo, kalıcı durumun POJO nesneleri için geçici depolama gibi olduğunu söyleyebiliriz )


Yaparsak->

session.beginTransaction.commit();

POJO nesnesi Kalıcı veya Veritabanı depolama durumundadır

Görünümü-GC (çöp toplayıcı noktası temizlik üzerinden değil, bu nesne, bu POJO amacı bu veritabanı depolama durumu gibi olduğunu söyleyebiliriz JVM kapsamı dışında artık bir database.Soo içindeki bir şekilde tablosunda saklanan, çünkü POJO için kalıcı depolama nesneler )


Yaparsak->

session.evict(student); 

daha sonra POJO nesnesi çıkarılır veya kalıcı durumdan ayrılmış duruma geri alınır. Çok POJO nesnesinin bu durumu ayrılmış durumdadır .

(Çöp toplayıcı bakış açısı - GC, ayrılmış durumdaki POJO nesnesini JVM'den kolayca silebilir)


2

Aşağıdaki varlık verildiğinde:

@Entity
public class City {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)    
    private long id;

    // other fields and methods.
}

Gönderen Hazırda 5.2 belgelerinde (Ben de dahil ettik removeddurumu):

geçici

varlık henüz somutlaştırılmıştır ve kalıcılık bağlamıyla ilişkilendirilmemiştir. Veritabanında kalıcı bir temsili yoktur ve tipik olarak hiçbir tanımlayıcı değeri atanmamıştır (atanan oluşturucu kullanılmadıkça).

City city = new City();

yönetilen veya kalıcı

varlık ilişkili bir tanımlayıcıya sahiptir ve bir kalıcılık bağlamı ile ilişkilendirilmiştir. Henüz veritabanında fiziksel olarak mevcut olabilir veya olmayabilir.

// city will be in a managed/persistent state and any changes to it, will be tracked by hibernate
// and reflected to the database when the persistence context is flushed.
session.save(city);

müstakil

varlığın ilişkili bir tanımlayıcısı vardır, ancak artık kalıcılık bağlamıyla ilişkili değildir (genellikle kalıcılık bağlamı kapatıldığı veya örnek bağlamdan çıkarıldığı için)

// city is in a detached state, Hibernate is no longer aware of the entity 
session.evict(city)

kaldırıldı

varlık ilişkili bir tanımlayıcıya sahiptir ve bir kalıcılık bağlamıyla ilişkilendirilmiştir, ancak veritabanından kaldırılması planlanmıştır.

session.remove(city);


Not: Hibernate API, varlık durumları arasında geçiş yapmak için çift yöntemler sunar ve bence bir Hibernate Session sınıfını keşfetmeye değer .


0

Halihazırda tanımlanmış olan doğru cevabın yanı sıra kalıcı, geçici, kopuk sadece nesnenin hazırda bekletme durumundaki durumudur.

Daha kesin olmak gerekirse, bu üç durum aslında hazırda bekletilen nesne değişikliklerini ve oturum yaşam döngüsü durumunu gösterir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.