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)

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

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...

Imagen de benek

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.

Imagen de Nopalin

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

Imagen de luxspes

RDFSC

RDF ... Source Code (ahora resulta que yo soy una mala influencia ;-) ):

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:

 

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)

Imagen de luxspes

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:

at org.hibernate.impl.SessionImpl.update(SessionImpl.java:544)
at pruebahibernate.Main.agregarUsers(Main.java:34)
at pruebahibernate.Main.main(Main.java:64)

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

Imagen de ezamudio

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.