2010-07-14 8 views
5

Por qué necesito la línea "session.save (user);" en el siguiente fragmento de código? Pensé que, con la llamada a buscar, el usuario ya estaba conectado a la sesión y los cambios se registrarían y confirmarían. ¿Te importaría explicar los detalles por mí? ¿O necesito una configuración especial u otras circunstancias en las que podría haber escuchado acerca de esta 'función'?¿Por qué tengo que guardar explícitamente después de un hallazgo con Hibernate?

session = createSession(); 
ta = session.beginTransaction(); 
assertEquals(1, session.createCriteria(MyUser.class).list().size()); 
// find one user 
MyUser user = session.createCriteria(MyUser.class).uniqueResult(); 
user.setName("Rocker!"); 
// ### HERE ### 
// WHY this 'save' is necessary!!?? 
session.save(user); 
ta.commit(); 

ta = session.beginTransaction(); 
assertEquals(1, session.createCriteria(MyUser.class).list().size()); 
MyUser user = session.createCriteria(MyUser.class).uniqueResult(); 
assertEquals("Rocker!", user.getName()); 
ta.commit(); 

ACTUALIZACIÓN 1

La misma cuestión se aplica a

  1. session.save (usuario);
  2. user.setName ("Rocker!");
  3. ta.commit();

ACTUALIZACIÓN 2

La solución al problema es: Estoy utilizando guice/urdimbre persisten. Y en algunos casos me vincularon incorrectamente un bloque de código a una transacción a través de @Transactional: por lo tanto, la transacción se realizó demasiado pronto y, por lo tanto, el cambio por separado no se incluyó en la confirmación. ¡Gracias chicos! Por lo tanto, siempre asegúrese de que sabe acerca de su ámbito de transacción en caso de que esté utilizando primavera o guice ...

+0

¿Has activado el registro de hibernación para examinar qué ocurre entre el retorno de uniqueresult() y commit()? –

+0

Siempre lo hice con ese 'guardado' explícito de los últimos meses con hibernación. hasta hoy: donde pregunté esto yo mismo. Echaré un vistazo a los registros. Pero mira mi edición debajo del código: el guardado explícito también es necesario después de que ya llamé al guardado – rocker

+0

cuando algo funciona durante mucho tiempo "hasta hoy" y el código no ha cambiado, implica que alguna configuración en otro lugar ha cambiado: ser asegúrese de revisar qué ha cambiado exactamente en todo el proyecto/aplicación desde el último estado de trabajo conocido. Obviamente las cosas no solo dejan de funcionar. –

Respuesta

5

Tiene razón en que Hibernate debe detectar automáticamente los cambios en el estado de los objetos persistentes:

persistente - una instancia persistente tiene una representación en la base de datos y un valor de identificador. Puede haber sido guardado o cargado, sin embargo, es por definición en el ámbito de una sesión. Hibernate detectará cualquier cambio realizado en un objeto en estado persistente y sincronizará el estado con la base de datos cuando la unidad de trabajo finalice. Los desarrolladores no ejecutan sentencias manuales de ACTUALIZACIÓN o DELETA cuando un objeto debe convertirse en transitorio.

quiero suponer que los resultados de los criterios no se devuelven en estado persistente (pero parece que no puede encontrar la prueba de esto en la documentación)

Trate de usar una consulta HQL, para los que los documentos son claro:

casos Entidad recuperados por una consulta se encuentran en un estado persistente

también asegúrese de que el modo de descarga de la sesión se establece en AUTO o r COMMIT.

+0

El modo de descarga 'AUTO' - es el predeterminado y ¿cómo puedo cambiarlo? – rocker

+0

Con la consulta HQL, es lo mismo: es necesario un almacenamiento explícito (después de que algo haya cambiado). – rocker

+1

@rocker, 'session.setFlushMode (FlushMode.AUTO)'. –

Cuestiones relacionadas