Y eso a pesar de que yo creo un objeto nuevo y simplemente lo intento guardar en BBDD, algo así:
UserBean user = new UserBean(); user.setUserName("name1"); user.setPassword("passwd1"); em.persist(user);¿Y porque pasa esto? Simple, yo le estoy indicando un identificador. Aunque yo no le ponga nada, el identificador es un entero que por defecto es 0, por lo cual el objeto tiene un identificador.
Hibernate distingue entre los objetos pertenecientes a una transacción y los que no (transient y detached) e intenta almacenar en la BBDD (persist) aquellos objetos transaccionales. Si al usar el método persist, el intenta guardar un objeto transaccional y cree que este lo es, puesto que tiene indicado un id (aunque sea 0). Verá que no puede obtener el estado actual del objeto (puesto que no ha sido almacenado aún) y entiende que esta fuera de la transacción (osea detached).
Para evitar este problema podemos hacer dos cosas, una de ellas es utilizar el método merge, que es capaz de manejar mas eficazmente los objetos. O simplemente poner un null en el identificador a almacenar (en el caso de que la clave primaria sea un primitivo es evidente que esto no es posible).
No hay comentarios:
Publicar un comentario