Bienvenida

Como todo en la vida, la innovación es la clave del éxito por lo que nos hemos visto en la necesidad de "evolucionar" este blog para abarcar muchos otros temas que estaban quedando de lado en nuestros cursos "oficiales".

Si deseas aprender o profundizar algunos temas en particular, no dudes en contactarnos.


martes, 31 de mayo de 2011

JPA : OneToMany / ManyToOne


Hasta el momento no lo habíamos mencionado, pero existen básicamente dos formas de asociación:
  • Las basadas en valores simples.
  • Las basadas en colecciones de valores.



Dentro de esas formas de asociación, existen cuatro formas de “mapeo”:
  • Relación One-To-One (valores simples). Este tema lo tratamos en un post anterior.
  • Relación Many-To-One (valores simples)
  • Relación One-To-Many (colecciones de valores)
  • Relación Many-To-Many (colecciones de valores)

En este post trataremos el tema de las relaciones One-to-Many y Many-to-One (caso típico de las aplicaciones que manejan cabecera y detalle).

Si este es el esquema de base de datos, observa que la orden tiene una llave foránea que es el CUST_ID (de la tabla TBCUSTOMER) para poder identificar de quien es la orden:



Las entidades respectivas tendrían el siguiente formato:


Es importante tener en cuenta que:

a) El lado “many-to-one” siempre es el lado “owner” de la relación. En consecuencia, la anotación @JoinColumn debe estar en dicho lado.
b) El lado “one-to-many” es el lado “inverso”, por lo que el elemento “mappedBy” debe ser utilizado en este lado.



El atributo "optional" en valor "false" indica que la relación siempre debe existir: es decir, no puede haber órdenes sin cliente asociado.

La anotación @JoinColumn especifica en el atributo "name" el nombre de la columna en la tabla "owner" de la relación. Mientras que el atributo "referencedColumnName" especifica el nombre de la columna en la tabla destino.

En la clase "Customer1" nota que existe un atributo "orders" que es una colección de órdenes que se cargarán de manera EAGER.

TIP: para evitar referenciar dentro de nuestros programas a cada atributo de la entidad, creamos un método "toString" que nos retorne la concatenación de los valores. Por ejemplo para la entidad "ORDERS" agregamos el método siguiente (aparte de los setter/getter ):
EJEMPLO 1: Fragmento de Programa main que lee desde el Cliente ( para la PK 1000 ) la relación One-To-Many. Este fragmento busca al cliente con PK = 1000 y al referenciar al atributo "orders", automáticamente jala las órdenes relacionadas.
EJEMPLO 2: Fragmento de Programa main que lee todas las órdenes para el cliente con  PK = 1000. Es la relación Many-To-One


Si observas la consola de tu IDE, verás las sentencias SQL que se ejecutan ( siempre que la opción de debug esté habilitada en tu persistence.xml ).

¿ que te pareció ? ... Por favor comenta y opina.



4 comentarios:

  1. Muy buena explicación profe, solo que en cuanto a la parte de que la opción de debug esté habilitada!!!, no se a que líneas del persitance hace referencia!!!

    ResponderEliminar
  2. Se refiere a las propiedades particulares de la implementacion que uses : EclipselInk, Hibernate u OpenJPA ...
    Es decir , veras las sentencias SQL si has colocado esas propiedades en tu persistence.xml

    Saludos

    ResponderEliminar