unidades:03_relaciones:04_uno_a_muchos_ordenada
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:03_relaciones:04_uno_a_muchos_ordenada [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Uno a muchos (ordenada) ====== | ||
+ | La relación uno a muchos consiste simplemente en que un objeto //padre// tenga una lista **Ordenar** de otros objetos //hijo// de forma que al persistirse el objeto principal también se persista la lista de objetos //hijo//. Esta relación también suele llamarse // | ||
+ | |||
+ | ===== Clases Java ===== | ||
+ | Antes de entrar en cómo se implementa en Hibernate , veamos las clases Java y las tablas que definen la relación uno a muchos. | ||
+ | |||
+ | Para nuestro ejemplo vamos a usar las clases: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Estas dos clases van a tener una relación uno a muchos. | ||
+ | |||
+ | <code java 1 | Listado 1.Relación 1 a n> | ||
+ | public class Profesor implements Serializable | ||
+ | private int id; | ||
+ | private String nombre; | ||
+ | private String ape1; | ||
+ | private String ape2; | ||
+ | private List< | ||
+ | | ||
+ | |||
+ | public Profesor(){ | ||
+ | } | ||
+ | |||
+ | public Profesor(int id, String nombre, String ape1, String ape2) { | ||
+ | this.id = id; | ||
+ | this.nombre = nombre; | ||
+ | this.ape1 = ape1; | ||
+ | this.ape2 = ape2; | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | |||
+ | public class CorreoElectronico implements Serializable { | ||
+ | private int idCorreo; | ||
+ | private String direccionCorreo; | ||
+ | private Profesor profesor; | ||
+ | | ||
+ | public CorreoElectronico() { | ||
+ | | ||
+ | } | ||
+ | | ||
+ | public CorreoElectronico(int idCorreo, | ||
+ | this.idCorreo=idCorreo; | ||
+ | this.direccionCorreo=direccionCorreo; | ||
+ | this.profesor=profesor; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | En el listado 1 podemos ver cómo la clase '' | ||
+ | |||
+ | El mecanismo que usamos en Java para almacenar una serie de objetos //hijo// es el interfaz <javadoc jdk7> | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | En el siguiente diagrama UML se ve la relación desde '' | ||
+ | |||
+ | <uml> | ||
+ | class Profesor | ||
+ | Profesor : int id | ||
+ | Profesor : String nombre | ||
+ | Profesor : String ape1 | ||
+ | Profesor : String ape2 | ||
+ | |||
+ | |||
+ | class CorreoElectronico | ||
+ | CorreoElectronico: | ||
+ | CorreoElectronico: | ||
+ | |||
+ | |||
+ | Profesor " | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Tablas ===== | ||
+ | La tablas de base de datos quedarían de la siguiente forma: | ||
+ | |||
+ | <uml> | ||
+ | class Profesor << | ||
+ | Profesor : INTEGER id | ||
+ | Profesor : VARCHAR nombre | ||
+ | Profesor : VARCHAR ape1 | ||
+ | Profesor : VARCHAR ape2 | ||
+ | |||
+ | |||
+ | class CorreoElectronico << | ||
+ | CorreoElectronico: | ||
+ | CorreoElectronico: | ||
+ | CorreoElectronico: | ||
+ | CorreoElectronico: | ||
+ | |||
+ | |||
+ | Profesor " | ||
+ | </ | ||
+ | |||
+ | Podemos ver cómo la tabla '' | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | ===== Fichero de mapeo '' | ||
+ | Al persistir dos clases serán necesarios dos ficheros de persistencia: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ==== Profesor.hbm.xml ==== | ||
+ | |||
+ | |||
+ | El fichero '' | ||
+ | |||
+ | <code xml 1| Fichero Profesor.hbm.xml> | ||
+ | <?xml version=" | ||
+ | < | ||
+ | < | ||
+ | <class name=" | ||
+ | <id column=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | | ||
+ | <list name=" | ||
+ | <key> | ||
+ | <column name=" | ||
+ | </ | ||
+ | < | ||
+ | <column name=" | ||
+ | </ | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | El fichero básicamente contiene lo que se ha explicado en las lecciones anteriores excepto por el tag ''< | ||
+ | |||
+ | === Tag list === | ||
+ | El tag ''< | ||
+ | |||
+ | == Atributos == | ||
+ | * **name**: Es el nombre de la propiedad Java del tipo <javadoc jdk7> | ||
+ | * **cascade**: | ||
+ | * **inverse**: | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | |||
+ | inverse=" | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | == Tags anidados == | ||
+ | * **key** Este tag contiene otro anidado llamado '' | ||
+ | * **list-index** Este tag contiene otro anidado llamado '' | ||
+ | * **one-to-many** Este tag contiene el atributo '' | ||
+ | |||
+ | < | ||
+ | Podemos pensar que el valor del atributo '' | ||
+ | |||
+ | org.hibernate.MappingException: | ||
+ | | ||
+ | </ | ||
+ | ==== CorreoElectronico.hbm.xml ==== | ||
+ | |||
+ | El fichero '' | ||
+ | <code xml 1| Fichero CorreoElectronico.hbm.xml> | ||
+ | <?xml version=" | ||
+ | < | ||
+ | < | ||
+ | <class name=" | ||
+ | <id column=" | ||
+ | < | ||
+ | |||
+ | |||
+ | < | ||
+ | <column name=" | ||
+ | </ | ||
+ | |||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | El fichero básicamente contiene lo que se ha explicado en las lecciones anteriores excepto por el tag ''< | ||
+ | |||
+ | === Tag many-to-one === | ||
+ | El tag ''< | ||
+ | |||
+ | == Atributos == | ||
+ | * **name**: Es el nombre de la propiedad Java que enlaza con el objeto //padre//. En nuestro ejemplo el valor es '' | ||
+ | |||
+ | == Tags anidados == | ||
+ | * **column ** Este tag contiene el atributo '' | ||
+ | |||
+ | ===== Anotaciones ===== | ||
+ | Para usar notaciones deberemos modificar el código fuente de las clases Java y no usar los ficheros '' | ||
+ | |||
+ | El código fuente de la clase '' | ||
+ | |||
+ | <code java 1 | Clase profesor anotada> | ||
+ | @Entity | ||
+ | @Table(name=" | ||
+ | public class Profesor implements Serializable | ||
+ | | ||
+ | @Id | ||
+ | @Column(name=" | ||
+ | private int id; | ||
+ | | ||
+ | @Column(name=" | ||
+ | private String nombre; | ||
+ | | ||
+ | @Column(name=" | ||
+ | private String ape1; | ||
+ | | ||
+ | @Column(name=" | ||
+ | private String ape2; | ||
+ | | ||
+ | @OneToMany(cascade= CascadeType.ALL) | ||
+ | @JoinColumn(name=" | ||
+ | @IndexColumn(name=" | ||
+ | private List< | ||
+ | | ||
+ | |||
+ | public Profesor(){ | ||
+ | } | ||
+ | |||
+ | public Profesor(int id, String nombre, String ape1, String ape2) { | ||
+ | this.id = id; | ||
+ | this.nombre = nombre; | ||
+ | this.ape1 = ape1; | ||
+ | this.ape2 = ape2; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | A la propiedad '' | ||
+ | * **OneToMany**: | ||
+ | * **cascade**: | ||
+ | * **JoinColumn**: | ||
+ | * **IndexColumn**: | ||
+ | |||
+ | El código de la clase CorreoElectronico es el siguiente: | ||
+ | <code java 1 | Clase CorreoElectronico anotada> | ||
+ | @Entity | ||
+ | @Table(name=" | ||
+ | public class CorreoElectronico implements Serializable { | ||
+ | | ||
+ | @Id | ||
+ | @Column(name=" | ||
+ | private int idCorreo; | ||
+ | | ||
+ | @Column(name=" | ||
+ | private String direccionCorreo; | ||
+ | | ||
+ | @ManyToOne | ||
+ | @JoinColumn(name=" | ||
+ | private Profesor profesor; | ||
+ | | ||
+ | public CorreoElectronico() { | ||
+ | | ||
+ | } | ||
+ | | ||
+ | public CorreoElectronico(int idCorreo, | ||
+ | this.idCorreo=idCorreo; | ||
+ | this.direccionCorreo=direccionCorreo; | ||
+ | this.profesor=profesor; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | A la propiedad '' | ||
+ | * **ManyToOne**: | ||
+ | * **JoinColumn**: | ||
+ | ====== Código Java ====== | ||
+ | Ahora que ya tenemos preparadas las clase Java para que puedan persistirse veamos el código necesario para persistirlas. | ||
+ | |||
+ | <code java 1 | Persistiendo la clase Profesor> | ||
+ | Profesor profesor=new Profesor(9, " | ||
+ | List< | ||
+ | correosElectronicos.add(new CorreoElectronico(3, | ||
+ | correosElectronicos.add(new CorreoElectronico(2, | ||
+ | correosElectronicos.add(new CorreoElectronico(1, | ||
+ | |||
+ | profesor.setCorreosElectronicos(correosElectronicos); | ||
+ | |||
+ | Session session=sessionFactory.openSession(); | ||
+ | session.beginTransaction(); | ||
+ | |||
+ | session.save(profesor); | ||
+ | |||
+ | session.getTransaction().commit(); | ||
+ | session.close(); | ||
+ | </ | ||
+ | |||
+ | La explicación del código es la siguiente: | ||
+ | * En la línea 1 se crea el objeto '' | ||
+ | * En la segunda línea se crea el objeto <javadoc jdk7> | ||
+ | * Desde las líneas 3 a la 5 se crean los objetos '' | ||
+ | * En la línea 7 se establece la relación entre la lista de hijos ('' | ||
+ | * En la línea 12 se guarda el objeto '' |