Estoy tratando de ejecutar este código básico JPA / EJB:
public static void main(String[] args){
UserBean user = new UserBean();
user.setId(1);
user.setUserName("name1");
user.setPassword("passwd1");
em.persist(user);
}
Me sale este error:
javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.JPA.Database
¿Algunas ideas?
Busqué en Internet y la razón por la que encontré fue:
Esto se debió a cómo creó los objetos, es decir, si estableció la propiedad ID explícitamente. La eliminación de la asignación de identificación lo solucionó.
Pero no lo entendí, ¿qué tendré que modificar para que funcione el código?
El error se produce porque se establece el ID del objeto. Hibernate distingue entre objetos transitorios y separados y
persist
funciona solo con objetos transitorios. Sipersist
concluye que el objeto está separado (lo que sucederá porque el ID está establecido), devolverá el error "objeto separado pasado para persistir". Puede encontrar más detalles aquí y aquí .Sin embargo, esto solo se aplica si ha especificado que la clave principal se genere automáticamente: si el campo está configurado para establecerse siempre manualmente, entonces su código funciona.
fuente
eliminar
user.setId(1);
porque se genera automáticamente en la base de datos y continúa con el comando persistir.
fuente
Obtuve la respuesta, estaba usando:
Usé fusionar en lugar de persistir:
Pero ni idea, por qué persistir no funcionó. :(
fuente
si utilizas para generar la
id = GenerationType.AUTO
estrategia en tu entidad.Reemplaza
user.setId (1)
poruser.setId (null)
y el problema está resuelto.fuente
Sé que es demasiado tarde y probablemente todos obtuvieron la respuesta. Pero un poco más para agregar a esto: cuando se establece GenerateType, se espera que persist () en un objeto obtenga una identificación generada.
Si ya hay un valor establecido en el Id por el usuario, hibernate lo trata como un registro guardado y, por lo tanto, se trata como separado.
si la identificación es nula, en esta situación se genera una excepción de puntero nulo cuando el tipo es AUTO o IDENTIDAD, etc.a menos que la identificación se genere a partir de una tabla o una secuencia, etc.
diseño: esto sucede cuando la tabla tiene una propiedad de bean como clave primaria. GenerateType debe establecerse solo cuando una identificación se genera automáticamente. elimine esto y la inserción debería funcionar con la identificación especificada por el usuario. (es un mal diseño tener una propiedad asignada al campo de clave principal)
fuente
Aquí .persist () solo insertará el registro.Si usamos .merge () verificará si existe algún registro con la ID actual, si existe, se actualizará de lo contrario insertará un nuevo registro
fuente
Si establece id en su base de datos para que sea clave principal y autoincremento, entonces esta línea de código es incorrecta:
user.setId(1);
Prueba con esto:
public static void main(String[] args){ UserBean user = new UserBean(); user.setUserName("name1"); user.setPassword("passwd1"); em.persist(user); }
fuente
detached entity passed to persist
Tuve este problema y fue causado por el caché de segundo nivel:
Por lo tanto, debido a que el caché no se invalida, hibernate asumió que se trataba de una instancia separada de la misma entidad.
fuente