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

hibernate

Estas en el tema de hibernate en el foro de Java en Foros del Web. Hola!!! ¿Cómo tiene que ser el mapeo y la sql para modificar la clase padre y sus hijos a la vez? Mi clase padre es ...
  #1 (permalink)  
Antiguo 25/07/2008, 06:59
 
Fecha de Ingreso: julio-2008
Mensajes: 15
Antigüedad: 15 años, 9 meses
Puntos: 0
hibernate

Hola!!!

¿Cómo tiene que ser el mapeo y la sql para modificar la clase padre y sus hijos a la vez?

Mi clase padre es esta:

<hibernate-mapping package="com.dap.pip.modelo">
<class name="RecursoHumano" table="PIPSR_RRHH">
<id name="idRRHH" column="ID_RRHH" type="java.lang.Integer">
<generator class="sequence">
<param name="sequence">PIPS_SQ_RRHH</param>
</generator>
</id>
<many-to-one name="tipoTecnico" class="TipoTecnico"><column name="CD_TIPO_TECNICO"/>
</many-to-one>
<property name="txNif" column="TX_NIF" type="java.lang.String" />
<set name="tareas" table="PIPSR_TAREA_RRHH" cascade="save-update">
<key column="CD_RRHH"/>
<many-to-many class="Tarea" column="CD_TAREA"/>
</set>

</class>
</hibernate-mapping>

Y clase hija no tengo mapeada porque esta referenciada con el many-to-many.
Aunque falta un campo de esta clase que no se como ponerlo, que es la fecha!!!

Saludos y gracias de antemano si alguien me puede ayudar!!!!!!!
  #2 (permalink)  
Antiguo 25/07/2008, 08:39
Usuario no validado
 
Fecha de Ingreso: junio-2008
Mensajes: 386
Antigüedad: 15 años, 9 meses
Puntos: 10
Respuesta: hibernate

Recuerda que para hacer una relacion muchos a muchos con Hibernate deberas tener una tabla intermedia entre las dos tablas.

Por ejemplo, una relacion entre Alumnos y Materias, un alumno puede tener muchas materias y cada materia pueden tener muchos alumnos.

Supongamos que en la tabla alumnos tienes idAlumno, nombre y fecha y en la tabla Materias tienes idMateria y nombre, entonces necesitaras crear una tabla intermedia que contendria las claves de las dos tablas.

Entonces, la tabla alumno_materia tendria solo dos columnas: idAlumno, idMateria

Por lo tanto tu mapeo de alumno quedaria asi:

<hibernate-mapping>
<class name="Alumno" table="alumno">
<id name="idAlumno" column="idAlumno">
<generator class="increment"/>
</id>
<property name="nombre" column="nombre"/>
<property name="fecha" column="fechaIngreso"/>

<set name="materias" table="alumno_materia">
<key column="idAlumno"/>
<many-to-many column="idMateria" class="Materia"/>
</set>
</class>
</hibernate-mapping>

Y tu mapeo de materia quedaria asi:
<hibernate-mapping>
<class name="Materia" table="materia">
<id name="idMateria" column="idMateria">
<generator class="increment"/>
</id>
<property name="nombre" column="nombre"/>

<set name="alumnos" table="materia_alumno">
<key column="idMateria"/>
<many-to-many column="idAlumno" class="Alumno"/>
</set>
</class>
</hibernate-mapping>

Espero te haya ayudado, cualquier cosa aqui estamos!

saludos!
  #3 (permalink)  
Antiguo 28/07/2008, 00:53
 
Fecha de Ingreso: julio-2008
Mensajes: 15
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: hibernate

hola!!!

Muchas gracias antes de nada.
Si mi tabla la tengo mapeada así. El problema que me surge es cuando intento modificar el padre y los hijos de esta. No sé como mapear esto. En tu ejemplo es como si modifico el alumno y las materias de este. ¿Sabes cómo tengo que hacer esto???

Gracias!!!!
  #4 (permalink)  
Antiguo 28/07/2008, 09:39
Usuario no validado
 
Fecha de Ingreso: junio-2008
Mensajes: 386
Antigüedad: 15 años, 9 meses
Puntos: 10
Respuesta: hibernate

Cita:
Iniciado por Hibernate Ver Mensaje
hola!!!

Muchas gracias antes de nada.
Si mi tabla la tengo mapeada así. El problema que me surge es cuando intento modificar el padre y los hijos de esta. No sé como mapear esto. En tu ejemplo es como si modifico el alumno y las materias de este. ¿Sabes cómo tengo que hacer esto???

Gracias!!!!
Hola,

Por ejemplo si quieres agregarle a un alumno una materia debes:
1. Una referencia de los dos objetos
2. Utilizar los metodos comunes de las listas.

Ejemplo:
1: Crear la referencia:
Alumno alumno=(Alumno)session.load(Alumno.class,1); //consultas el alumno con id=1
Materia materia=(Materia)session.load(Materia.class,3); //consultas la materia con id=3

Ya que tengas las dos referencias creadas, lo unico que tienes que hacer es usar los metodos "normales" que tienen la lista:

Por ejemplo para agregarle al alumno la materia, solo tienes que hacer esto:
alumno.getMaterias().add(materia);

Para borrarle la materia al alumno:
alumno.getMaterias().remove(materia);

Solo es eso

NOTA: Recuerda hacerle commit a la transaccion:
tx.commit();

Espero te sirva.

saludos!
  #5 (permalink)  
Antiguo 29/07/2008, 13:19
 
Fecha de Ingreso: julio-2008
Mensajes: 15
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: hibernate

Hola!!!!

Muchas gracias antes de nada.

He hecho esto que me comentas, pero tengo un problema, te comento por si tu puedes ayudarme.

Yo tengo mi objeto padre con sus hijos:
Ej: Padre
Hijo 1
Hijo 2
Hijo 3

Al modificar el padre le digo que sus hijos ya solo son el 1 y el 2, por lo tanto hago
padre.getHijos().add(hijo1);
padre.getHijos().add(hijo2);
session.update(padre);

Me da el siguiente error:
net.sf.hiberante.NonUniqueObjectExcepction: a differente object with the same identifier value was already associated with the session: 142, of class: com.proyecto.modelo.Hijo

¿Puede que tengan mal el mapeo?¿O es que estoy haciendo algo mal en la clase?

Saludos y muchas gracias!!!
  #6 (permalink)  
Antiguo 29/07/2008, 14:27
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: hibernate

Supuestamente, el problema es que has creado dos hijos con el mismo código, el 142.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #7 (permalink)  
Antiguo 05/07/2011, 04:22
 
Fecha de Ingreso: julio-2011
Mensajes: 1
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: hibernate

Hola, tengo una duda de lo que hai aquí puesto, si tu quieres saber las materias asociadas a un alumno como se hace
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 13:16.