2009-11-03 23 views
25

Diyelim ki 200 sütunlu bir masa var ve çoğunun hiç kullanılmadığını varsayalım.2 Aynı masadaki JPA objeleri

Sık sık kullanılan 10 sütunlara SmallEntity map. Bunu diğer varlıklarla derneklerde kullanırım. Hızlı yükleniyor, az miktarda hafıza tüketiyor ve beni mutlu ediyor.

Ama bazen 200 sütunları görüntülemek gerekir. BigEntity sınıfını 200 sütun üzerinde eşlemek istiyorum. Başka bir varlığa bağlı değildir, hiçbir ilişkisi yoktur.

Soru: Hiç deneyimin bunu yaparken var mı? Hibernate'in, örneğin ilk seviye önbellek, kirli kontrol ve genel olarak genel yaşam döngüsü gibi sorunların farkında mısınız?

+1

İyi soru. Yeni çerçeveye geçiş, böyle bir sorunun başka bir nedeni olabilir. Örneğin. Eski sistem ve yeni sistem olabilir ve her ikisi de aynı veritabanına karşı çalışmalıdır. – TomR

cevap

17

Bunu yapmanın en basit yolu kullanmayan özelliklerini eşleştirmek için olduğu sıklıkla lazy olarak:

<property name="extendedProperty" lazy="true" /> 

... or using Annotations ... 

@Basic(fetch = FetchType.LAZY) 
String getExtendedProperty() { ... } 

hazırda başlangıçta böyle özelliklere yük olmaz; bunun yerine talep üzerine yüklenir (ilk erişildiğinde). HANG sorgunuzda fetch all properties maddesini kullanarak tüm özellikleri yüklemek için Hazırda bekletebilirsiniz.

Bir diğer olası senaryo aslında aynı tabloya birbirinden tamamen ayrı varlıklar map ama bunların immutable birini yapmaktır. (Değişmezlik önemlidir neden olan) onlar birinci/ikinci seviye önbellek ikisi için tamamen ayrı olmak üzere hazırda tarafından farklı kişiler ele alınacaktır unutmayın. Hazırda daima gerçek somut varlık türünü döndürdüğü için

Sen DEĞİL miras haritalama yoluyla bu işlevselliği elde etmek mümkün olacaktır. Ayrıntılı bir açıklama için cevabımı Hibernate Inheritance Strategy sorusuna bir göz atın.

+0

Bu harika cevap için çok teşekkür ederim! –

+0

Özelliklerin tembel getirilmesi, bayt kodu enstrümantasyonu gerektirir. Projelerde bu çok yaygın mı? Bu Hazırda Bekletme Ek Açıklamaları kılavuzundandır: Özellik düzeyi tembel getirme özelliğini etkinleştirmek için, sınıflarınızın gereç olması gerekir: bu özelliği etkinleştirmek için orijinaline bytecode eklenir, lütfen Hazırda bekleyen başvuru belgelerine bakın. Sınıflarınız enstrümanlanmamışsa, özellik seviyesi tembel yükleme sessizce göz ardı edilir. (Http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html#performance-fetching-lazyproperties

+0

Evet, baytkodu enstrümantasyon tembel özellikleri için gerekli olan ancak inşa sırasında eklemek çok kolay). (Benim tecrübemde) çok yaygın değil çünkü tembel özellikler için kullanım durumu (tembel çağrışımların aksine) o kadar da yaygın değil ama aynı zamanda da son derece nadir değil. Bu kesinlikle daha önce yapıldı ve endişeniz varsa üretime hazır. – ChssPly76