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ı
Model
nesnelerin 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-loaded
Uygulama 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 )