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

Relación many-to-many con Hibernate

Estas en el tema de Relación many-to-many con Hibernate en el foro de Java en Foros del Web. Hola a todos. Estoy empezando con hibernate, y me ha surgido una duda al hacer una relación many-to-many utilizando una join table. Quiero relacionar clientes ...
  #1 (permalink)  
Antiguo 13/06/2007, 08:42
 
Fecha de Ingreso: julio-2004
Mensajes: 7
Antigüedad: 19 años, 9 meses
Puntos: 0
Relación many-to-many con Hibernate

Hola a todos.
Estoy empezando con hibernate, y me ha surgido una duda al hacer una relación many-to-many utilizando una join table. Quiero relacionar clientes de un videoclub con las peliculas que alquilan. Un usuario puede alquilar varias peliculas, y una pelicula puede ser alquilada por vario usuarios. Mi problema reside en que quiero hacer que una misma pelicula pueda ser alquilada varias veces por el mismo cliente, para lo cual guardo la fecha y hora en la que ha alquilado una pelicula. El modelo de datos que he creado para hacer esto es una tabla para los usuarios, con un id de clave primaria (usuario_id). Otra para las peliculas, tambien con el id (peli_id). Y la tercera, que me relaciona ambas tablas, he hecho una triple clave, con usuario_id, peli_id, y la fecha de alquiler, para conseguir que el mismo usuario pueda alquilar la misma pelicula en distintas fechas.
He hecho dos archivos de configuración, uno para usuarios, y otro para las pelis, con relación bidireccional entre ambas, utilizando sets. Pero no se como hacer para guardar el campo fecha de la tabla relacional (o cualquier otro campo que pudiera añadir en ella).
¿Como debo hacer el mapeo de las tablas?
¿Y la implementación de las clases?
Porque cuando hago un save, por ejemplo de un usuario, con su set cargado con las pelis que quiere alquilar, solo me salva las ids, y por tanto, al "repetir el alquiler", me da un error de inserción por clave primaria. Y si hago un update no se realiza la funcionalidad que quiero implementar. No se si me he explicado con claridad. Espero que me podais ayudar.
Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 13/06/2007, 14:58
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Relación many-to-many con Hibernate

Si tienes campos de datos en la relación, en realidad no tienes una N-M, tienes dos 1-N. Crea una clase (Alquiler, por ejemplo) para representar la entidad intermedia y listo.
Para mi, si tiene datos propios no es una relación, es una entidad y la trato como tal.

S!
  #3 (permalink)  
Antiguo 14/06/2007, 04:33
 
Fecha de Ingreso: julio-2004
Mensajes: 7
Antigüedad: 19 años, 9 meses
Puntos: 0
Re: Relación many-to-many con Hibernate

La nueva duda que me plantea tu solución es la restricción de la triple clave primaria, dado que en las dos relaciones que tu planteas siempre hay que tener cuidado de un campo restrictivo que pertenece a una tercera tabla. Es decir, si supongo que un usuario lleva tres alquileres (la entidad que tu propones), esos alquileres deben ser de peliculas existentes en la bbdd.
¿Hay alguna forma de decirle esto a hibernate en los archivos de configuración, o debo preocuparme de que se respete esta situación desde el código java?
Yo me habia planteado buscar una solucion a la relación N-M mediante Maps o algo así, pero soy demasiado novato todavía para llegar a eso. A lo mejor ni se puede plantear así... Seguiré indagando a ver, pero probaré tu solución. Muchas gracias.
  #4 (permalink)  
Antiguo 14/06/2007, 06:29
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Relación many-to-many con Hibernate

Ummm, en Hibernate se pueden utilizar claves compuestas, pero yo no las uso nunca así que no te puedo ayudar mucho en cuanto a la configuracion.

Lo de que las peliculas existan en la BDD... eso no es ningun problema. Tu acabas con una entidad (Alquiler) con dos Foreign Keys (una a usuario y otra a pelicula) así que por las mismas reglas de integridad de la BDD, es imposible que alquiles una pelicula que no existe en la BDD. O que una pelicula sea alquilada por un usuario que no existe. Lo puedes comprobar por programa, para manejar los errores de forma más controlada, pero de cualquier forma la BDD es la ultima salvaguarda de que eso no ocurre.

Y relativo a las claves primarias triples, yo siempre uso claves generadas sin significado real y luego las restricciones como las que mencionas (que un usuario no alquile la misma pelicula en la misma fecha) las fuerzo a base de constraints tipo Unique. Pero eso ya es más cuestión de gustos.

S!
  #5 (permalink)  
Antiguo 14/06/2007, 07:44
 
Fecha de Ingreso: julio-2004
Mensajes: 7
Antigüedad: 19 años, 9 meses
Puntos: 0
Re: Relación many-to-many con Hibernate

Bueno. Utilizaré la solución que me has dado, y a ratos seguiré investigando a ver si se puede hacer una relación N-M sin la entidad "alquiler". Si consigo averiguar si se puede hacer lo postaré. Muchas gracias por tus comentarios. Un saludo.
  #6 (permalink)  
Antiguo 19/06/2007, 09:49
Avatar de pyanqn  
Fecha de Ingreso: noviembre-2005
Mensajes: 331
Antigüedad: 18 años, 5 meses
Puntos: 8
Re: Relación many-to-many con Hibernate

Pudes utilizar un mapeo de la forma:

<class name="Order" table="orders">
<id name="id">
<generator class="native"/>
</id>
<property name="date"/>
<many-to-one name="customer" column="customer_id"/>
<list name="lineItems" table="line_items">
<key column="order_id"/>
<list-index column="line_number"/>
<composite-element class="LineItem">
<property name="quantity"/>
<many-to-one name="product" column="product_id"/>
</composite-element>
</list>
</class>

que utiliza un composite-element para representar una entidad intermedia.

El ejemplo que te muestro esta en:
Capitulo: 23.3. Customer/Order/Product (Ejemplos)
http://www.hibernate.org/hib_docs/v3...ample-mappings
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 16:36.