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 '' | ||