update con hibernate
estoy iniciando en esto de hibernate con java y estoy tratando de hacer un update pero no se como realizarlo...si alguien me puede echar una mano, esto es lo poco que llevo:
************************
******************************
************************
*****************************
****************************
org.hibernate.TransientObjectException: The given object has a null identifier: pruebahibernate.Users
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.getUpdateId(DefaultSaveOrUpdateEventListener.java:249)
at org.hibernate.event.def.DefaultUpdateEventListener.getUpdateId(DefaultUpdateEventListener.java:46)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:217)
Usuario: dahaliz Password: ***** Email: dahaliz85@gmail.com Login: 2010-02-18 13:53:13.0
at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:564)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:552)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:544)
at pruebahibernate.Main.agregarUsers(Main.java:34)
at pruebahibernate.Main.main(Main.java:64)
- Inicie sesión o regístrese para enviar comentarios
RTFS
Otro caso de RTFS. Está muy claro: la llave primaria de tu clase es idUser, tipo Integer, y no le pasaste ningún valor cuando lo quieres insertar. El generador que pusiste de "identity" no funcionó con tu base de datos.
Una nota al margen: Es recomendable que los nombres tablas en base de datos sean en singular, al igual que los nombres de las clases de dominio. Es decir, la tabla USER, no USERS. y la clase User, no Users.
Qué versión de Hibernate estás utilizando? Parece la 2... en la 3 ya puedes manejar muchas cosas con anotaciones en Java y evitar el uso del XML para la configuración de Hibernate...
Hibernate 3
Es la tres:
Como dice ezamudio en la versión 3 podrías usar anotaciones dentro de las clases y evitar la configuración vía XML.
Checa esta documentación:
Saludos.
Javier Ramírez Jr.
hmm lo dice al inicio
Creo que la presencia de luxess (creo que asi se escribe) esta como que influenciando con tigo, antes tenias unas muy buenas respuestas y no este tipo de cosas jeje.
En realidad lo que hay que explicarle es (como ya bien menciono que es nuevo y pues ya hizo la talacha de hacer el ejemplo y ponerlo a la primera, lo que significa que no es cualquier kiddie) es que el tipo identity como generator en realidad requiere que la columna sea auto_increment en mysql. Por default segun se, es que hibernate no le agrega ese atributo cuando crea la tabla, lo tiene que agregar tu manualmente. Asi cuando mysql hace el insert y en el campo id va un null o un 0, mysql automaticamente toma el siguiente valor de la columna y realiza la inserción.
saludos
RDFSC
RDF ... Source Code (ahora resulta que yo soy una mala influencia ;-) ):
Que esta mal en ese "source code"?
Que esta usando session.update, para un registro nuevo. Ese es el problema. Te recomiendo que uses log4jdbc para que puedas ver claramente el SQL que Hibernate envia a la base de datos (y asi puedas entender mejor que esta pasando)
RTFS y RTFSC: El ejemplo no es lo que el hizo
Por otro lado, si el ejemplo que pones es contradictorio, pues se complican las cosas, segun tu stacktrace:
Pero segun tu codigo:
Segun el stacktrace, estabas llamando a agregarUsers, pero segun tu codigo, estabas llamando a actualizarUsers... supongo que al final, lo mas probable es que Nopalin tenga razon y te falte el autoincrement en la base de datos... aunque bien podria ser cualquier otra cosa... si quieres evitar confusiones de parte de quienes puedan ayudarte, trata de que tus posts sean consistentes...
P.D. Te recomiendo que evites la mala constumbre de usar System.out. para tus mensajes de depuracion, mejor usa slf4j con logback. Ezamudio escribio un muy buen blog post al respecto
autoincrement, session.update()
No sabía lo del auto-increment (no manejo bien MySQL, declaro n00b en ese aspecto), esa podría ser la razón. O lo que dice luxspes de que llamó update() en vez de save(). A veces te puedes evitar broncas llamando simplemente saveOrUpdate() (o se llama updateOrSave()? no recuerdo).
Creo que el error es que
Creo que el error es que estas intentando actualizar, pero sin haber consultado el registro previamente, te recomiendo que comentes la linea:
//m.actualizarUsers("dahaliz", "*****", "dahaliz85@gmail.com", new Date());
y si el programa se ejecuta sin problemas estamos seguros de lo que te estoy comentando es decir en la linea que comentamos se esta intentado actualizar un usuario que en este caso es "dahaliz" pero primero debes realizar la lectura del registro correspondiente.