style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

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:

************************

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_prueba</property>
    <property name="hibernate.connection.username">zambrano</property>
    <property name="hibernate.connection.password">onikom</property>
    <!--<mapping resource="hibernate.hbm.xml"/>-->
    <mapping resource="pruebahibernate/Users.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

******************************

package pruebahibernate;

import java.util.*;
import java.lang.System;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;

public class Main {

    private SessionFactory sf;

    public Main(){
        try{
            System.out.println("Inicializando hibernate");
            sf = new Configuration().configure().buildSessionFactory();
            System.out.println("Terminando inicializacion de hibernate");
        }catch (HibernateException he){
            he.printStackTrace();
        }
    }

    private void agregarUsers(String name, String password, String email, Date login){
        try{
            Session s = sf.openSession();
            Transaction t = s.beginTransaction();
            Users u = new Users();
            u.setEmail(email);
            u.setLastLogin(login);
            u.setName(name);
            u.setPassword(password);
            s.save(u);
            t.commit();
            s.close();
        }catch (HibernateException he){
            he.printStackTrace();
        }

    }

private void actualizarUsers(String name, String password, String email, Date login){
        try{
            Session s = sf.openSession();
            Transaction t = s.beginTransaction();
            Users u = new Users();
            u.setEmail(email);
            u.setLastLogin(login);
            u.setName(name);
            u.setPassword(password);
            s.update(u);
            t.commit();
            s.close();
        }catch (HibernateException he){
            he.printStackTrace();
        }
    }

    private List listarDatos(){
        List datos = null;
        try{
            Session s = sf.openSession();
            Transaction t = s.beginTransaction();
            datos = s.find("from Users");
            t.commit();
            s.close();

        }catch(HibernateException he){
            he.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            return datos;
        }
    }

    public static void main(String[] args) {
        Main m = new Main();
        List rst = m.listarDatos();
        m.actualizarUsers("dahaliz", "*****", "dahaliz85@gmail.com", new Date());
        for(int x=0;x<rst.size();x++){
            Users u = (Users)rst.get(x);
            System.out.println("Usuario: "+u.getName()+" Password: "+u.getPassword()+" Email: "
                    +u.getEmail()+" Login: "+u.getLastLogin());
        }
    }
}

************************

package pruebahibernate;

import java.util.Date;

public class Users  implements java.io.Serializable {

     private Integer idUser;
     private String name;
     private String password;
     private String email;
     private Date lastLogin;

    public Users() {
    }

    public Users(String name, String password, String email, Date lastLogin) {
       this.name = name;
       this.password = password;
       this.email = email;
       this.lastLogin = lastLogin;
    }
   
    public Integer getIdUser() {
        return this.idUser;
    }
   
    public void setIdUser(Integer idUser) {
        this.idUser = idUser;
    }
    public String getName() {
        return this.name;
    }
   
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return this.password;
    }
   
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return this.email;
    }
   
    public void setEmail(String email) {
        this.email = email;
    }
    public Date getLastLogin() {
        return this.lastLogin;
    }
   
    public void setLastLogin(Date lastLogin) {
        this.lastLogin = lastLogin;
    }
}

*****************************

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 18/02/2010 12:59:49 PM by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="pruebahibernate.Users" table="users" catalog="hibernate_prueba">
        <id name="idUser" type="java.lang.Integer">
            <column name="id_user" />
            <generator class="identity" />
        </id>
        <property name="name" type="string">
            <column name="name" length="50" />
        </property>
        <property name="password" type="string">
            <column name="password" length="20" />
        </property>
        <property name="email" type="string">
            <column name="email" length="100" />
        </property>
        <property name="lastLogin" type="timestamp">
            <column name="last_login" length="19" />
        </property>
    </class>
</hibernate-mapping>

****************************

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:

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

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: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_sin...

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:

public static void main(String[] args) {
        Main m = new Main();
        List rst = m.listarDatos();
        m.actualizarUsers("dahaliz", "*****", "dahaliz85@gmail.com", new Date());
        for(int x=0;x<rst.size();x++){
            Users u = (Users)rst.get(x);
            System.out.println("Usuario: "+u.getName()+" Password: "+u.getPassword()+" Email: "
                    +u.getEmail()+" Login: "+u.getLastLogin());
        }
    }

private void actualizarUsers(String name, String password, String email, Date login){
        try{
            Session s = sf.openSession();
            Transaction t = s.beginTransaction();
            Users u = new Users();
            u.setEmail(email);
            u.setLastLogin(login);
            u.setName(name);
            u.setPassword(password);
            s.update(u);
            t.commit();
            s.close();
        }catch (HibernateException he){
            he.printStackTrace();
        }
    }

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:

public static void main(String[] args) {
        Main m = new Main();
        List rst = m.listarDatos();
        m.actualizarUsers("dahaliz", "*****", "dahaliz85@gmail.com", new Date());
        for(int x=0;x<rst.size();x++){
            Users u = (Users)rst.get(x);
            System.out.println("Usuario: "+u.getName()+" Password: "+u.getPassword()+" Email: "
                    +u.getEmail()+" Login: "+u.getLastLogin());
        }
    }

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.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">