Problema con anotacion @Transactional y con TransientPropertyValueException #407
-
Buenas tardes! Tengo un problema con el uso de las trasacciones de la entityManager. Estabamos arreglando los tests que involucran la creacion de clases como Usuarios, Incidentes, Comunidades, Entidades, servicios, entre otros, los cuales tienen su repositorio donde ser persisten. Estos repositorios hereda de uno solo:
El condigo continua, pero sigue el mismo formato. Es decir. al momento de agregarlo al repo, se inicia una transaccion, se persiste y luego se hace el commit Otras clases como MedioNotificacion no tienen repositorio, por lo que hay que persistirlos "a mano" con El caso es que estabamos corrigiendo los tests desactualizados y en casi todos el error es el siguiente:
En muchos test el error es casi igual, TransientPropertyValueException, en este caso es MedioNotificador pero en otros caso son otras clases como Miembro o Servicios. Por lo que averiguamos esto se debe a que una clase que se persiste quiere guardar como atributo un elemento NO persistido de otra clase. La primer solucion es poner trasacciones y persist en los objetos creados pero siguen apareciendo. Adjunto el codigo del test en cuestion:
Ahora bien, se me ocurrio cambiar el Repositorio, comentando los metodos de entityManager().getTransaction().begin(); y entityManager().getTransaction().commit(); y en su lugar, escribir arriba la anotacion @transactional. Esto para no realizar las transacciones manualmente. Quizas alli estaba el error . Y me resolvio el problema de los tests, todos corrian o si no lo hacian era por otros errores, pero este error se solucionaba completamente. Pero surgia otro problema, los objetos que estaban automaticamente en el Bootstrap, al momento de correr el Router, no se cargaban (No se si es necesario pasar el codigo completo del bootstrap, en caso que si no hay problema) y por lo que vi es causa de la anotacion ya que al volver a quitarla y regresar el begin() y commit() el problema del bootstrap se resuelve, pero el TransientPropertyValueException de los tests regresa. Queria preguntar por que ocurre el problema con la anotacion @transactional? De ser necesario pasare el codigo del bootstrap Disculpe las molestias, espero su respuesta |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 3 replies
-
¡Hola! En primer lugar, no implementes las transacciones en los repositorios; cómo explicamos varias veces en clase (sugiero ver los vídeos), el manejo de transacciones debe ser implementado en los controladores y otros componentes de alto nivel (cómo por ejemplo, En segundo lugar, no utilicen la anotación En tercer lugar, no cierren el entity manager en sus tests y en su lugar usen el |
Beta Was this translation helpful? Give feedback.
¡Hola @tobiascastaneda2000!
Cómo te decía más arriba, no cierres el entity manager, la clase abstracta de la que estás heredando ahora se encarga de manejar el ciclo de vida del contexto de persistencia.
En otras palabras, en tu código no debería haber llamadas a
flush
niclose
, y salvo en controladores o bootstrap, no deberías tener código de manejo de transacciones.Por último, no me queda claro esa biblioteca que mencionas de dónde sale, estimo que la importaste por error y poder quitarla.
Saludos