2010-12-11 4 views
3

Nur eine kurze Frage, aber ist die Spülung in diesem Code erforderlich? Beachten Sie, dass dies innerhalb einer JPA-Transaktion erfolgen würde.Frage zum Spülen mit JPA vor einer Abfrage heißt

User user = new User(); 
em.persist(user); 

em.flush; 

User aUser = em.find(User.class,user.getId()); 
assert(user.equals(aUser)); 

Oder wird es ohne die Spülung funktionieren?

User user = new User(); 
em.persist(user); 

User aUser = em.find(User.class,user.getId()); 
assert(user.equals(aUser)); 

Oder gleiche Frage, aber ein wenig mehr beteiligt Beispiel:

User user = em.find(User.class,id); 
user.setName("My Name"); 
em.merge(user); 

em.flush; //Is this line needed? 

User aUser = em.createQuery("select u from User where u.name = 'My Name'); 
assert(user.equals(aUser)); 

Antwort

7

Im ersten Fall bündig wird benötigt, solange User eine automatisch generierte ID hat, da es nicht vor bündig zugewiesen wird. Wenn id nicht generiert wird, gibt em.find() dieselbe Instanz aus dem Persistenzkontext zurück, so dass Flush nicht benötigt wird.

Im zweiten Fall ist explizites Flush nicht erforderlich, da JPA Flush durchführt, bevor eine Abfrage automatisch ausgeführt wird (wenn der Flush-Modus standardmäßig AUTO ist, andernfalls explizites Flush erforderlich).