2012-02-08 12 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(); 

Como se puede ver, no estoy llamando persist, ha comentado, porque soy el funcionamiento en seco primero este código. Sin embargo, como resulta, no es tan seco. Al inspeccionar la base de datos, veo que los datos han cambiado (afortunadamente es una base de datos de prueba).¿El JPA/Hibernate ahorrar aún cuando no llamar a persistir

Aparentemente mi comprensión de Hibernate/JPA es defectuosa. ¿No es obligatorio llamar al persist para cambiar los datos? Y si no, ¿cuáles son las reglas sobre cuándo se guarda algo ?

+0

pero estás llamando a commit? –

Respuesta

9

Sí, las entidades administradas se guardan cuando se realiza una descarga (el enjuague también se realiza con una confirmación) si se detecta algún cambio, se denomina comprobación sucia.

+0

Bueno saber. ¿Se puede confiar en eso, o es una llamada "persistente" todavía sabia? –

+0

@Bart Solo las entidades ** administradas ** se guardan de esta manera, la gestión significa que el administrador de entidades utilizado para cargar esas entidades aún no está cerrado, así que tenga cuidado. Y persiste trabaja para crear una nueva entidad. Si lo usa en una entidad ya existente (como aquí) arrojará una excepción. Eche un vistazo a la API: [link] (http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html) – Pablo

+0

Pero uso 'persist' en entidades cargadas todo el tiempo, sin excepciones –

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

Esa línea de código recupera la sd ejemplo StringData de la sesión em, cualquier cambio que realice se guardarán en ras (cuando termina transacciones) debido a que la instancia de objeto está asociado con la sesión em (es decir, administrado).

Puede separarlo o devolverlo del método. Fuera de la transacción, no está asociado con la sesión em y los cambios no se conservarán hasta que se vuelvan a vincular mediante la fusión.

+0

La parte importante no es que la transacción esté comprometida, la parte importante es que el administrador de entidades está cerrado. Si la transacción está comprometida pero el administrador de la entidad no está cerrado, la entidad aún está asociada con el administrador de la entidad. – Pablo

+0

@Pablo Entonces, ¿qué sucede si la entidad se cambia fuera de la transacción, pero dentro del administrador de la entidad? –

+0

@Bart El administrador de la entidad intentará guardarlo la próxima vez que se llame a flush() o commit(). – Pablo

Cuestiones relacionadas