2012-02-08 13 views
6
em.getTransaction().begin(); 

StringData sd = em.find(StringData.class, key); 
System.out.println("Old value: " + sd.getData()); 
sd.setData(newValue); 
// em.persist(sd); 

em.getTransaction().commit(); 

inat çağırarak değilken JPA/hazırda bile tasarruf mu, o dışarı yorum yazdığını. Ancak, ortaya çıktığı gibi çok kuru değil. Veritabanını incelediğimde, verilerin değiştiğini görüyorum (neyse ki bir test veritabanı).sen, ben <code>persist</code> demiyorum görebileceğiniz gibi

Görünüşe göre Hazırda Bekleme/JPA anlayışım hatalı. Verileri değiştirmek için her zaman persist aramıyor mu? Ve değilse, bir şeyin kaydedildiği zamanki kurallar nelerdir?

+0

fakat siz bir taahhüt mi arıyorsunuz? –

cevap

9

Evet, yönetilen varlıklar, herhangi bir değişiklik algılanırsa, bir temizleme (aynı zamanda bir taahhüt ile de yapılır) yapıldıktan sonra kaydedilir, buna kirli kontrol denir. Nesne örneği em oturumu ilişkili olduğundan

+0

Yararlı bilgi. Bu güvenilir olabilir, ya da hala 'akıllı' bir çağrıdır? –

+0

@Bart Yalnızca ** tarafından yönetilen ** varlıklar bu şekilde kaydedilir, yönetilen, bu varlıkları yüklemek için kullanılan varlık yöneticisinin henüz kapatılmadığı anlamına gelir, bu yüzden dikkatli olun. Ve kalıcı yeni bir varlık yaratmak için çalışır. Eğer zaten var olan bir varlıkta kullanırsanız (buradaki gibi) bir istisna atar. API'ya bakın: [link] (http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html) – Pablo

+0

Ancak, yüklenen varlıklarda sürekli olarak 'persist' kullanıyorum istisnalar. –

2
StringData sd = em.find(StringData.class, key); 

kod, bu hat em oturumundan StringData örneği sd alır, yaptığınız değişiklikler (işlemler sona erdiği) floş kaydedilecektir (yani yönetilen).

Ayırmayı kaldırabilir veya yöntemden döndürebilirsiniz. İşlem dışında em oturumuyla ilişkilendirilmez ve birleştirme yoluyla yeniden iliştirilene kadar değişiklikler kalıcı olmaz.

+0

Önemli kısmı, işlemin yapılmadığı değil, önemli olan taraf yöneticisinin kapalı olmasıdır. İşlemin yapılması ancak varlık yöneticisinin kapatılmaması durumunda, işletme hala varlık yöneticisi ile ilişkilendirilir. – Pablo

+0

@Pablo Peki, işlem, işlemin dışında, ancak varlık yöneticisi içinde değiştirilirse ne olur? –

+0

@Bart Varlık yöneticisi, bir sonraki (flush() veya commit() çağrıldığında onu kaydetmeye çalışacaktır. – Pablo

İlgili konular