Hibernate'i Spring çerçevesi ve onun bildirime dayalı işlem sınırlama yetenekleri (örneğin @Transactional ) ile birlikte kullanma eğilimindeyim .
Hepimizin bildiği gibi, hazırda bekletme , mümkün olduğunca müdahaleci olmayan ve şeffaf olmaya çalışır , ancak bu, ilişkileri uygularken biraz daha zorlayıcıdırlazy-loaded .
Farklı şeffaflık seviyelerine sahip bir dizi tasarım alternatifi görüyorum.
- İlişkileri tembel olmayan bir şekilde yapın (ör.
fetchType=FetchType.EAGER)- Bu, tüm tembel yükleme fikrini geçersiz kılar ..
- Kullanarak koleksiyonları başlat
Hibernate.initialize(proxyObj);- Bu, DAO'ya nispeten yüksek bağlantı anlamına gelir
- İle bir arayüz tanımlayabilsek de
initialize, diğer uygulamaların herhangi bir eşdeğer sağlaması garanti edilmez.
- Kalıcı
Modelnesnelerin kendilerine işlem davranışı ekleyin ( dinamik proxy veya kullanarak@Transactional)- Dinamik proxy yaklaşımını denemedim, ancak @Transactional'ın kalıcı nesnelerin kendileri üzerinde çalışmasını hiç görmedim. Muhtemelen bu hazırda bekletme, birlikte olunacak bir proxy üzerinde işlemden kaynaklanmaktadır.
- İşlemler gerçekten gerçekleşirken kontrol kaybı
- Hem tembel / tembel olmayan API sağlayın, örneğin
loadData()veloadDataWithDeps()- Uygulamayı hangi rutini ne zaman kullanacağını bilmeye zorlar, yine sıkı bağlantı
- Yöntem taşması,
loadDataWithA()....,loadDataWithX()
- Bağımlılıklar için aramayı zorla, ör. Yalnızca
byId()işlemleri sağlayarak- Örneğin, nesneye yönelik olmayan çok sayıda rutin gerektirir
findZzzById(zid)vegetYyyIds(zid)bunun yerinez.getY() - İşlemler arasında büyük bir işlem ek yükü varsa, koleksiyondaki her nesneyi tek tek getirmek faydalı olabilir.
- Örneğin, nesneye yönelik olmayan çok sayıda rutin gerektirir
- Yalnızca DAO yerine @Transactional uygulamanın bir parçası olun
- İç içe yerleştirilmiş işlemlerle ilgili olası hususlar
- İşlem yönetimi için uyarlanmış rutinler gerektirir (örneğin, yeterince küçük)
- Küçük programatik etki, ancak büyük işlemlerle sonuçlanabilir
- DAO'ya dinamik getirme profilleri sağlayın , ör.
loadData(id, fetchProfile);- Uygulamalar hangi profili ne zaman kullanacaklarını bilmelidir
- AoP türü işlemler, örneğin işlemleri durdurma ve gerektiğinde işlemleri gerçekleştirme
- Bayt kodu manipülasyonu veya proxy kullanımı gerektirir
- İşlemler yapıldığında kontrol kaybı
- Kara büyü, her zamanki gibi :)
Herhangi bir seçeneği kaçırdım mı?
lazy-loadedUygulama tasarımınızda ilişkilerin etkisini en aza indirmeye çalışırken tercih ettiğiniz yaklaşım hangisidir?
(Oh, ve WoT için üzgünüm )