Birisi bana Hibernate'te persist()
ile save()
in avantajının ne olduğunu söyleyebilir mi?
Bu forum gönderisinden]1
persist()
iyi tanımlanmıştır. Bu bir geçici örnek kalıcı. Bununla birlikte, bu durum tanımlayıcı değerine atanacaktır kalıcı örnek hemen, görevlendirme floşta gerçekleşebilir zaman. Şartname bunu söylemiyor, ki gt;persist()
ile ilgili yaşadığım sorun.
persist()
ayrıca aşağıdakileri de garanti eder ise bir INSERT deyimini çalıştırmaz işlem dışında çağrılır sınırlar. Bu şu durumlarda kullanışlıdır ile uzun süredir devam eden konuşmalar genişletilmiş Oturum/devamlılık bağlamı.gt;
persist()
gibi bir yöntem gereklidir.gt;
save()
aynı şeyi garanti etmez, bu bir tanımlayıcı döndürür ve eğer bir almak için INSERT'in çalıştırılması gerekir. tanımlayıcı (örneğin "kimlik" oluşturucu, değil "sequence"), bu INSERT gerçekleşir olsanız da olmasanız da hemen bir işlemin içinde veya dışında. Bu uzun süreli bir işlemde iyi değildir uzun süreli bir sohbet Oturum/devamlılık bağlamı.
Bu soru Hibernate'teki farklı kalıcılık yöntemleri hakkında bazı iyi yanıtlar içermektedir. Sorunuza doğrudan yanıt vermek gerekirse, save() ile insert deyimi işlem durumuna bakılmaksızın hemen yürütülür. Eklenen anahtarı döndürür, böylece şöyle bir şey yapabilirsiniz:
long newKey = session.save(myObj);
Bu nedenle, kalıcı örneğe hemen atanmış bir tanımlayıcıya ihtiyacınız varsa save() işlevini kullanın.
persist() ile, insert deyimi hemen olmasa da bir transaction içinde yürütülür. Çoğu durumda bu tercih edilir.
Ekleme işleminin işlem sırası dışında gerçekleşmesini istemiyorsanız ve eklenen anahtarın döndürülmesine ihtiyacınız yoksa persist() işlevini kullanın.
Aslında hibernate save() ve persist() metotları arasındaki fark kullandığımız generator sınıfına bağlıdır.
Eğer generator sınıfımız assigned ise save() ve persist() metotları arasında bir fark yoktur. Çünkü generator 'assigned' demek, bir programcı olarak veritabanına kaydetmek için birincil anahtar değerini vermemiz gerektiği anlamına gelir [ Umarım bu generators kavramını biliyorsunuzdur ]
Atanmış üreteç sınıfı dışında bir üreteç sınıfı olması durumunda, üreteç sınıfımızın adının Increment olması, hibernate'in kendisinin birincil anahtar kimlik değerini veritabanına doğru atayacağı anlamına gelir [atanmış üreteç dışında, hibernate yalnızca birincil anahtar kimlik değerini hatırlamak için kullanılır], bu durumda save() veya persist() yöntemini çağırırsak, kaydı normal şekilde veritabanına ekleyecektir
Ancak, save() yöntemi hibernate tarafından oluşturulan birincil anahtar id değerini döndürebilir ve bunu
long s = session.save(k);
Aynı durumda, persist() istemciye hiçbir zaman herhangi bir değer geri vermez, void döndürür.
persist() ayrıca, işlem sınırları dışında çağrılması durumunda bir INSERT deyiminin yürütülmeyeceğini garanti eder.
Save() INSERT ise bir işlemin içinde ya da dışında olmanıza bakılmaksızın hemen gerçekleşir.