Foros del Web » Programación para mayores de 30 ;) » Java »

Problema Hibernate al actualizar fila en relación OneToMany

Estas en el tema de Problema Hibernate al actualizar fila en relación OneToMany en el foro de Java en Foros del Web. Buenas, necesito ayuda con Hibernate. Tengo 2 entidades, Student y Phone, y hay una relación One to Many entre ellas, estas son las clases: Código: ...
  #1 (permalink)  
Antiguo 05/07/2011, 21:21
 
Fecha de Ingreso: diciembre-2007
Mensajes: 135
Antigüedad: 16 años, 4 meses
Puntos: 1
Problema Hibernate al actualizar fila en relación OneToMany

Buenas, necesito ayuda con Hibernate. Tengo 2 entidades, Student y Phone, y hay una relación One to Many entre ellas, estas son las clases:

Código:
@Entity  
@Table(name = "STUDENT")  
public class Student {  
  
    private long studentId;  
    private String studentName;  
    private Set<Phone> studentPhoneNumbers = new HashSet<Phone>(0);  
  
    public Student() {  
    }  
  
    public Student(String studentName, Set<Phone> studentPhoneNumbers) {  
        this.studentName = studentName;  
        this.studentPhoneNumbers = studentPhoneNumbers;  
    }  
  
    @Id  
    @GeneratedValue  
    @Column(name = "STUDENT_ID")  
    public long getStudentId() {  
        return this.studentId;  
    }  
  
    public void setStudentId(long studentId) {  
        this.studentId = studentId;  
    }  
  
    @Column(name = "STUDENT_NAME", nullable = false, length = 100)  
    public String getStudentName() {  
        return this.studentName;  
    }  
  
    public void setStudentName(String studentName) {  
        this.studentName = studentName;  
    }  
  
    @OneToMany (mappedBy="student", cascade = CascadeType.ALL)        
  
    public Set<Phone> getStudentPhoneNumbers() {  
        return this.studentPhoneNumbers;  
    }  
  
    public void setStudentPhoneNumbers(Set<Phone> studentPhoneNumbers) {  
        this.studentPhoneNumbers = studentPhoneNumbers;  
    }  
    
}
Código:
      
    @Entity  
    @Table(name = "PHONE")  
    public class Phone {  
      
        private long phoneId;  
        private String phoneType;  
        private String phoneNumber;  
      
        private Student student;  
        private Set<Student> students = new HashSet<Student>(0);  
          
        public Phone() {  
        }  
      
        public Phone(String phoneType, String phoneNumber) {  
            this.phoneType = phoneType;  
            this.phoneNumber = phoneNumber;  
        }  
          
        @Id  
        @GeneratedValue  
        @Column(name = "PHONE_ID")  
        public long getPhoneId() {  
            return this.phoneId;  
        }  
      
        public void setPhoneId(long phoneId) {  
            this.phoneId = phoneId;  
        }  
      
        @Column(name = "PHONE_TYPE", nullable = false, length=10)  
        public String getPhoneType() {  
            return this.phoneType;  
        }  
      
        public void setPhoneType(String phoneType) {  
            this.phoneType = phoneType;  
        }  
          
        @Column(name = "PHONE_NUMBER", nullable = false, length=15)  
        public String getPhoneNumber() {  
            return this.phoneNumber;  
        }  
      
        public void setPhoneNumber(String phoneNumber) {  
            this.phoneNumber = phoneNumber;  
        }  
          
        @ManyToOne(cascade = CascadeType.ALL)  
        @JoinColumn (name="STUDENT_ID")  
        public Student getStudent() {  
            return this.student;  
        }  
      
        public void setStudent(Student student) {  
            this.student = student;  
        }
Aquí está el código de applicationContext.xml:

Código:
    ...  
     <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">    
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>    
            <property name="url" value="jdbc:mysql://localhost/Project"/>    
            <property name="username" value="root"/>    
            <property name="password" value="root"/>    
        </bean>    
            
        <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">    
            <property name="dataSource" ref="myDataSource" />    
            <property name="annotatedClasses">    
                <list>    
                    <value>com.domain.Student</value>                         
                    <value>com.domain.Phone</value>                           
                </list>    
            </property>    
            <property name="hibernateProperties">    
                <props>    
                    <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>    
                    <prop key="hibernate.show_sql">true</prop>    
                    <prop key="hibernate.hbm2ddl.auto">create</prop>    
                </props>    
            </property>    
        </bean>    
      
     <bean id="myClassDAO" class="com.project.dao.ClassDAOImpl">  
            <property name="sessionFactory" ref="mySessionFactory"/>  
     </bean>   
      
    ...
Y ésta es la clase ClassDAOImpl.

Código:
    public class ClassDAOImpl{  
      
    private HibernateTemplate hibernateTemplate;  
    private Session session;  
    public void setSessionFactory(SessionFactory sessionFactory) {  
            this.hibernateTemplate = new HibernateTemplate(sessionFactory);  
            this.session = sessionFactory.openSession();  
    }     
      
    public void updateStudent(){  
              
            //update using hibernateTemplate  
      
            Student s = (Student)hibernateTemplate.get(Student.class, new Long(1));    
            Set<Phone> phoneNumbers =s.getStudentPhoneNumbers();    
            phoneNumbers.add(new Phone ("house","12342342"));    
            s.setStudentPhoneNumbers(phoneNumbers);    
            hibernateTemplate.update(s);    
      
            /* 
            //update using session 
     
            Transaction transaction = session.beginTransaction();           
            Student s = (Student)session.get(Student.class, new Long(1));   
            Set<Phone> phoneNumbers =s.getStudentPhoneNumbers();   
            phoneNumbers.add(new Phone ("house","12342342"));   
            s.setStudentPhoneNumbers(phoneNumbers);   
            session.update(s);   
            transaction.commit();   
            */  
      
    }  
      
    }
En esta clase lo único que pretendo es actualizar la lista de teléfonos del estudiante, añadiéndole uno más.
Me crea una nueva fila en la tabla Phone, con el nuevo teléfono, hasta ahí bien. El problema está en que no me crea la relación, la columna de join de la tabla phone (STUDENT_ID) parace con valor null, cuando debería aparecer con valor "1".

¿alguien sabe cómo puedo solucionar esto?


Gracias y un saludo
  #2 (permalink)  
Antiguo 07/07/2011, 11:15
 
Fecha de Ingreso: junio-2011
Mensajes: 16
Antigüedad: 12 años, 11 meses
Puntos: 2
Respuesta: Problema Hibernate al actualizar fila en relación OneToMany

El session.update solo actualiza el registro , si quieres agregar un nuevo telefono si ya existe, entonces guardar el nuevo registro.

prueba session.save

si no tendrias que crear un metodo independiente para guardar los detalles del registro principal
  #3 (permalink)  
Antiguo 08/07/2011, 12:59
 
Fecha de Ingreso: diciembre-2007
Mensajes: 135
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Problema Hibernate al actualizar fila en relación OneToMany

Cita:
Iniciado por al_cesar01 Ver Mensaje
El session.update solo actualiza el registro , si quieres agregar un nuevo telefono si ya existe, entonces guardar el nuevo registro.

prueba session.save

si no tendrias que crear un metodo independiente para guardar los detalles del registro principal

A ver, con Update quiero actualizar la tabla Student agregando un nuevo teléfono a un estudiante y sí que me agrega un nuevo telefono a la tabla Phone, lo que no hace es guardar la clave ajena de Student, aparece como null. Ya prové poniendo session.save y hace lo mismo.

Soy nuevo en esto y no se si estoy enfocando el tema mal, ya digo que lo único que pretendo es hacer una operación elemental, simplemente añadir un telefono a la tabla Phone, y asociarlo con un estudiante determinado. Pensé que la mejor manera de hacerlo era puse en mi primer post, partiendo de la entidad Student. ¿no es así como se hace en Hibernate? Que yo sepa las claves ajenas te las tiene que poner Hibernate automáticamente, yo las tienes que meter tú expresamente, ya que trabajas a un nivel superior...

¿nadie sabe como se hace esto?

Gracias
  #4 (permalink)  
Antiguo 08/07/2011, 19:41
 
Fecha de Ingreso: diciembre-2007
Mensajes: 135
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Problema Hibernate al actualizar fila en relación OneToMany

Ya he resuelto el problema, simplemente añadiendo "phone.setStudent(s);".

Lo que no me queda claro es si estoy obteniendo la sesion y manejando las transacciones correctamente, porque si cierro la sesión despues de hacer el commit de la transacción, luego solo puedo ejecutar el metodo updateStudent una vez, cuando lo ejecuto la siguiente vez me dice que la sesión está cerrada. ¿como ven mi codigo?
  #5 (permalink)  
Antiguo 11/07/2011, 13:21
 
Fecha de Ingreso: junio-2011
Mensajes: 16
Antigüedad: 12 años, 11 meses
Puntos: 2
Respuesta: Problema Hibernate al actualizar fila en relación OneToMany

Deberia respetarte el guardar y despues actualizarlo porque va en secuencia, y me imagino que cada vez que entra a ejecutar el metodo, allas declarado session.beginTransaction(); y trata de ponerlo en un try{} catch(){} para capturar los errones que tengas.

Etiquetas: fila, hibernate, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:38.