Publica tu how-to

Dinos como hacer lo que sabes hacer, mándanos un email a wdonet@gmail.com y lo publicamos (dos días máximo) o si te interesa unirte al equipo de redactores, también háznoslo saber por correo.

Mostrando entradas con la etiqueta mapeo. Mostrar todas las entradas
Mostrando entradas con la etiqueta mapeo. Mostrar todas las entradas

ORM : Mapeo Objeto - Relacional

Es una técnica de programación muy utilizada en paradigmas orientados a objetos, que te permite 'mapear' (es decir, emparejar un par de entidades de tu programa): por un lado una base de datos relacional y por otro lado objetos.

Por poner un ejemplo sencillo, una agenda con personas / direcciones y teléfonos.
En la base de datos relacional, pueden haber tablas para:
  1. Las personas, con datos como su nombre completo, edad, género
  2. Los teléfonos, con el dato del número telefónico y relacionados con las personas a través de una llave foránea (si la relación es 1-N) o una tabla de rompimiento (si la relación es N-M)
  3. Las direcciones, con datos para calle, número exterior e interior, colonia, etc. y relacionados con las personas, también a través de una llave foránea.

Por otro lado, en tu programa podrías tener los siguientes objetos:
  1. Un objeto persona, con una propiedad cadena para el nombre, una propiedad entera para la edad, una propiedad de una enumeración para el género.
  2. Un objeto telefono, con una propiedad cadena para el número telefónico.
  3. Un objeto direccion, con una propiedad cadena para cada campo de la misma tabla

Pero además, en tu objeto persona podrías tener lo siguiente:
  1. Una propiedad lista de objetos telefono
  2. Una propiedad de objeto direccion
Y de esta manera, una persona tiene uno o mas números telefónicos, y una dirección asociada.

Ahora bien, el ORM, además de permitirte modelar tu información de manera que utilices objetos para representar las relaciones de la base de datos, también puede permitirte la llamada persistencia. Esta propiedad se refiere al hecho de que, a través del motor del ORM y gracias al mapeo establecido (por ejemplo en un archivo de configuración XML) entre los objetos y las tablas de la base de datos, se consigue que los datos manipulados en los objetos se reflejen en la base de datos, y que cualquier cambio en los objetos mismos dentro del programa permita que el mapeo, además de ser declarativo (que establece el mapeo en sí entre objeto y relación), sea también del contenido.

En los lenguajes orientados a objetos existen muchos motores o frameworks que permiten implementar ORM en un sistema. Sin embargo, a veces es necesario o más sencillo implementar uno propio, con o sin persistencia.

En cuanto a los frameworks existentes, y que pueden usarse para desarrollar sistemas con un ORM, se encuentran por ejemplo:
  • Hibernate, para el lenguaje Java
  • Propel, para el lenguaje PHP
  • SQLAlchemy, para el lenguaje Python
  • Doctrine, también para PHP
  • etc...

Hibernate: relaciones con annotations

Ejemplo de anotaciones uni y bidireccional en many-to-one

Tomando en cuenta q hay dos clases (tablas en BD) user y correo de la siguiente forma:

Lo basico:




Tabla USER
Tabla CORREO
ID (id)
NAME (name)
PWD (password)
ID (id)
MAIL (mail)
USER_ID [relacion]

La clase User tendra propiedades id, name, password
La clase Correo tendra propiedades id, mail

Las anotaciones, ademas de los campos arriba mencionados son como sigue:

Bidireccional User --- Correo (User y Correo saben de la existencia del otro)

class Correo {
@ManyToOne(fetch..)
@JoinCloumn(name="USER_ID")
privateUser usuario;
}
class User {
@OneToMany (cascade..,fetch..,mappedBy="usuario")
Set correos;
}

Unidireccional User --> Correo (User sabe q correos tiene pero Correo no sabe nada de User)

class Correo {
/**** no existe ningun atributo 'usuario' ****/
}
class User {
@OneToMany (cascade..,fetch..)
@JoinColumn(name="USER_ID")
Set correos;
}

Unidireccional User <-- Correo (Correo sabe a q user corresponde pero User no sabe nade de Correo) class Correo {
@ManyToOne(fetch..)
@JoinCloumn(name="USER_ID")
privateUser usuario;
}
class User {
**** no existe ningun atributo 'correos' ****
}

NOTA:

mappedBy hace referencia al nombre de atributo del otro lado
* @JoinColumn.name hace referencia al nombre de la tabla en la BD (no el atributo)
* los nombres de las tablas y sus campos aqui se indican en mayusculas, pero las clases Java y sus elementos siguen el mismo esquema q cualquier clase Java.