Nous utilisons l'implémentation Toplink de JPA + Spring + EJB. Dans l'un de nos EJBs nous avons quelque chose comme ceci:JPA - enregistrement des modifications sans persist()
public void updateUser(long userId, String newName){
User u = em.get(User.class, userId);
u.setName(newName);
// no persist is invoked here
}
Ainsi, fondamentalement cette méthode de updateUser est censé mettre à jour le nom de l'utilisateur avec l'identifiant donné. Mais l'auteur de cette méthode a oublié d'invoquer em.persist (u);
Et la chose la plus étrange est que cela fonctionne bien. Comment ça peut être? J'étais sûr à 100% que sans invoquer em.persist() ou em.merge() il n'y a aucun moyen que des changements aient pu être sauvegardés dans la base de données. Pourraient-ils? Y a-t-il un scénario où cela pourrait arriver?
Merci
Merci. Cela a beaucoup aidé! J'ai toujours pensé que l'appel à em.persist() est requis, même si l'objet est associé à EntityManager actuel. – anthony
Bizarre: Dans ma configuration, j'ai une référence à une entité gérée. Ensuite, je change l'état de cette entité. Ensuite, j'appelle 'entityManager.flush()'. Dans le cas où cela est en cours d'exécution dans une transaction, l'état modifié ** de l'entité est écrit ** dans la base de données. Dans le cas où cela est en cours sans transaction, l'état modifié de l'entité ** n'est pas écrit ** dans la base de données. L'affirmation suivante est donc vraie?: * "Il doit toujours y avoir une validation de transaction ou un appel' entityManager.persist (obj) 'pour écrire le dernier état de' obj' dans la base de données. " J'utilise JPA 2.0 avec Hibernate (4.1.7.Final)) – Abdull
@Abdull, oui, la spécification JPA ne définit aucun comportement d'autocommit, donc vous avez besoin d'une transaction en cours ou rien n'est écrit dans la base de données. – Henning