JPA EntityManager: Neden merge() yerine persist() kullanılmalı?
EntityManager.merge()` yeni nesneler ekleyebilir ve var olanları güncelleyebilir.
Neden persist()
(yalnızca yeni nesneler oluşturabilir) kullanılmak istensin ki?
920
3
Her iki yöntem de bir PersistenceContext'e bir varlık ekler, aradaki fark daha sonra varlıkla ne yapacağınızdır.
Persist, bir varlık örneğini alır, bağlama ekler ve bu örneği yönetilebilir hale getirir (yani, varlıkta gelecekte yapılacak güncellemeler izlenir).
Merge, varlığınızın yeni bir örneğini oluşturur, durumu sağlanan varlıktan kopyalar ve yeni kopyayı yönetilir hale getirir. İlettiğiniz örnek yönetilmeyecektir (yaptığınız herhangi bir değişiklik işlemin bir parçası olmayacaktır - tekrar merge çağrısı yapmadığınız sürece).
Belki bir kod örneği yardımcı olabilir.
Senaryo 1 ve 3 kabaca eşdeğerdir, ancak Senaryo 2'yi kullanmak isteyeceğiniz bazı durumlar vardır.
em.merge
kullandığımda, JPA'nın benim için oluşturduğu bir alan olmasa bile, her
INSERTiçin bir
SELECTifadesi aldığımı fark ettim - birincil anahtar alanı kendi belirlediğim bir UUID idi. em.persist(myEntityObject)
seçeneğine geçtim ve o zaman sadeceINSERT
deyimleri aldım.Oturumda olan lazy loaded bir koleksiyona erişmeye çalıştığım için varlığımda lazyLoading özel durumları alıyordum.
Yaptığım şey, ayrı bir istekte bulunmak, oturumdan varlığı almak ve ardından jsp sayfamdaki bir koleksiyona erişmeye çalışmaktı ki bu sorunluydu.
Bunu hafifletmek için, aynı varlığı denetleyicimde güncelledim ve jsp'me aktardım, ancak oturumda yeniden kaydettiğimde
SessionScope
aracılığıyla da erişilebilir olacağını ve birLazyLoadingException
atmayacağını hayal ediyorum, örnek 2'nin bir modifikasyonu:Aşağıdakiler benim işime yaradı: