2015-07-31 11 views
6

'dan sonra beklendiği gibi çalışmaz. Hazırda Bekletme 4.2'yi kullanıyorum ve bir alt öğe topluluğu içeren bir alt öğe var (One-To-Many, getirme türü LAZY ve @BatchSize(size=100)) ile açıklamalı .Hibernate @BatchSize, session.flush

i sorgulamak ve birkaç ana varlıkları yüklemek ve alt nesne içeren koleksiyon, derin uyku bekliyordu. olarak @BatchSize kullanan Ama oturumu, floş diyoruz ve daha sonra aynı şeyi yaparsan, o koleksiyonunu sadece başlatır erişimin ararsanız Bu özel ana varlık için

Hazırda bekletme durumu beklenen davranış?

Düzenleme: Numune Sorunuzu doğru alırsanız

 
    List parents = criteria.list() 
    parents.get(0).getXs().get(0) // triggers loading Xs of all parents 

vs

 
    List parents = criteria.list() 
    session.flush() 
    parents.get(0).getXs().get(0) // triggers loading Xs of only the first parent 

+0

için BatchFetchQueue temizler AbstractFlushingEventListenrner sınıfında bu kodu buldum Bu ilgisi yok Session.flush' ile. Session.clear'yi kastediyor musunuz? –

+0

Hayır, oturum temizlemeyi kullandığımdan eminim, bunu test ettim. Eğer session.flush demediysem, o zaman problemim çözülecektir. ama bunun arkasındaki teoriyi bilmek istiyorum. – hunter

+0

Ebeveynleri yüklemek için HQL'yi kullanmayı dener misiniz? –

cevap

2

Kendi sorumu cevaplayacağım çünkü bunun başkalarına yardımcı olacağını düşünüyorum. Bence bu, herhangi bir belgede belirtilmemiş olsa da Hazırda Bekletme davranışıdır. Biz Session.flush çağırdığınızda , bu Flushing olay dinleyicisine çağırır ve ve ben

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
// Post-flushing section 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

/** 
* 1. Recreate the collection key -> collection map 
* 2. rebuild the collection entries 
* 3. call Interceptor.postFlush() 
*/ 
protected void postFlush(SessionImplementor session) throws HibernateException { 

    LOG.trace("Post flush"); 

    final PersistenceContext persistenceContext = session.getPersistenceContext(); 
    persistenceContext.getCollectionsByKey().clear(); 

    // the database has changed now, so the subselect results need to be invalidated 
    // the batch fetching queues should also be cleared - especially the collection batch fetching one 
    persistenceContext.getBatchFetchQueue().clear(); 

Yani bu son satırı geçerli bağlam

+0

Ben bu 2 gün geçirdim. Benim floşımın ejb sınırım tarafından dolaylı olarak çağrılmasının dışında. Araştırma için teşekkürler. – Franck

1

Yani bu şu (sözde kod)

a = loadSomeEntity 
b = loadSomeEntity 
a.getXs.get(0) // triggers loading of Xs for a and b 

b = loadSomeEntity 
session.flush 
a = loadSomeEntity 
a.getXs.get(0) // triggers loading only of Xs for a 

vs olduğunu do bana garip ama eğer session.commit veya session.c Floş yerine, bunu beklemek gerekir, çünkü artık b artık oturumun bir parçası değildir ve bunun için parti getirme adayı değildir.

+0

evet, ama daha doğru ben kriterler.list kullanıyorum, yani yükleme a ve b tek bir satırda, daha sonra bir session.flush yaparsanız, batchsize çalışmıyor. – hunter

İlgili konular