unidades:03_relaciones:03_uno_a_muchos_desordenada
no way to compare when less than two revisions
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:03_relaciones:03_uno_a_muchos_desordenada [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Uno a muchos (desordenada) ====== | ||
+ | La relación uno a muchos consiste simplemente en que un objeto //padre// tenga una lista **sin 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 Set< | ||
+ | | ||
+ | |||
+ | 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> | ||
+ | <javadoc jdk7> | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | En el siguiente diagrama UML se ve que 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: | ||
+ | |||
+ | |||
+ | Profesor " | ||
+ | </ | ||
+ | |||
+ | Podemos ver cómo la tabla '' | ||
+ | |||
+ | ===== 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=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | | ||
+ | <set name=" | ||
+ | <key> | ||
+ | <column name=" | ||
+ | </ | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | El fichero básicamente contiene lo que se ha explicado en las lecciones anteriores excepto por el tag ''< | ||
+ | |||
+ | === Tag set === | ||
+ | El tag ''< | ||
+ | |||
+ | == Atributos == | ||
+ | * **name**: Es el nombre de la propiedad Java del tipo <javadoc jdk7> | ||
+ | * **cascade**: | ||
+ | * **inverse**: | ||
+ | |||
+ | < | ||
+ | |||
+ | < | ||
+ | La documentación de hibernate no ayuda mucho a entender el atributo '' | ||
+ | |||
+ | //Marks this collection as the " | ||
+ | |||
+ | |||
+ | //For you, and for Java, a bi-directional link is simply a matter of setting the references on both sides correctly. Hibernate, however, does not have enough information to correctly arrange SQL INSERT and UPDATE statements (to avoid constraint violations). Making one side of the association inverse tells Hibernate to consider it a mirror of the other side. That is all that is necessary for Hibernate to resolve any issues that arise when transforming a directional navigation model to a SQL database schema. The rules are straightforward: | ||
+ | </ | ||
+ | |||
+ | == Tags anidados == | ||
+ | * **key** 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(mappedBy=" | ||
+ | private Set< | ||
+ | | ||
+ | |||
+ | 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**: | ||
+ | * **mappedBy**: | ||
+ | * **cascade**: | ||
+ | |||
+ | 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(7, " | ||
+ | Set< | ||
+ | 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 '' | ||
+ | |||
+ | |||
+ | |||
+ | ====== Referencias ====== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// |
unidades/03_relaciones/03_uno_a_muchos_desordenada.txt · Última modificación: 2023/04/07 21:26 por 127.0.0.1