unidades:03_relaciones:02_uno_a_uno_bidireccional
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:03_relaciones:02_uno_a_uno_bidireccional [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Uno a uno (bidireccional) ====== | ||
+ | Esta lección es muy similar a la anterior , pero en éste caso la relación entre las clases '' | ||
+ | |||
+ | ===== Clases Java ===== | ||
+ | Antes de entrar en cómo se implemente en Hibernate , veamos las clases Java y las tablas que definen la relación //uno a uno// | ||
+ | |||
+ | Para nuestro ejemplo vamos a usar las clases: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Estas dos clases van a tener una relación uno a uno. | ||
+ | |||
+ | <code java 1 | Listado 1.Relación 1 a 1> | ||
+ | public class Profesor implements Serializable | ||
+ | private int id; | ||
+ | private String nombre; | ||
+ | private String ape1; | ||
+ | private String ape2; | ||
+ | private Direccion direccion; | ||
+ | | ||
+ | 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 Direccion implements Serializable | ||
+ | private int id; | ||
+ | private String calle; | ||
+ | private int numero; | ||
+ | private String poblacion; | ||
+ | private String provincia; | ||
+ | private Profesor profesor; | ||
+ | | ||
+ | public Direccion(){ | ||
+ | } | ||
+ | |||
+ | public Direccion(int id, String calle, int numero, String poblacion, String provincia) { | ||
+ | this.id = id; | ||
+ | this.calle = calle; | ||
+ | this.numero = numero; | ||
+ | this.poblacion = poblacion; | ||
+ | this.provincia = provincia; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | En el listado 1 podemos ver cómo la clase '' | ||
+ | |||
+ | <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 Direccion | ||
+ | Direccion : int id | ||
+ | Direccion : String calle | ||
+ | Direccion : int numero | ||
+ | Direccion : String poblacion | ||
+ | Direccion : String provincia | ||
+ | |||
+ | 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 Direccion << | ||
+ | Direccion : INTEGER id | ||
+ | Direccion : VARCHAR calle | ||
+ | Direccion : INTEGER numero | ||
+ | Direccion : VARCHAR poblacion | ||
+ | Direccion : VARCHAR provincia | ||
+ | |||
+ | Profesor " | ||
+ | </ | ||
+ | |||
+ | Podemos apreciar que en el diseño de las tabla de la base de datos ya no existe una columna en '' | ||
+ | |||
+ | ===== 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=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | | ||
+ | < | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | El fichero básicamente contiene lo que se ha explicado en las lecciones anteriores excepto por el tag ''< | ||
+ | |||
+ | === Tag one-to-one === | ||
+ | El tag ''< | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | < | ||
+ | |||
+ | ==== Direccion.hbm.xml ==== | ||
+ | |||
+ | El fichero '' | ||
+ | <code xml 1| Fichero Direccion.hbm.xml> | ||
+ | <?xml version=" | ||
+ | < | ||
+ | < | ||
+ | <class name=" | ||
+ | <id column=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | | ||
+ | < | ||
+ | | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | La clase '' | ||
+ | |||
+ | ===== Anotaciones ===== | ||
+ | Para usar anotaciones 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 > | ||
+ | import java.io.Serializable; | ||
+ | import javax.persistence.*; | ||
+ | |||
+ | |||
+ | @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; | ||
+ | | ||
+ | @OneToOne(cascade=CascadeType.ALL) | ||
+ | @PrimaryKeyJoinColumn | ||
+ | private Direccion direccion; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | A la propiedad '' | ||
+ | * **@OneToOne(cascade=CascadeType.ALL)**: | ||
+ | * **@PrimaryKeyJoinColumn**: | ||
+ | <note tip>En caso de no incluir la anotación '' | ||
+ | <note tip> | ||
+ | < | ||
+ | |||
+ | El código de '' | ||
+ | |||
+ | <code java 1 | Clase Direccion anotada > | ||
+ | import java.io.Serializable; | ||
+ | import javax.persistence.Column; | ||
+ | import javax.persistence.Entity; | ||
+ | import javax.persistence.Id; | ||
+ | import javax.persistence.Table; | ||
+ | |||
+ | |||
+ | @Entity | ||
+ | @Table(name=" | ||
+ | public class Direccion implements Serializable | ||
+ | |||
+ | @Id | ||
+ | @Column(name=" | ||
+ | private int id; | ||
+ | | ||
+ | @Column(name=" | ||
+ | private String calle; | ||
+ | | ||
+ | @Column(name=" | ||
+ | private int numero; | ||
+ | | ||
+ | @Column(name=" | ||
+ | private String poblacion; | ||
+ | | ||
+ | @Column(name=" | ||
+ | private String provincia; | ||
+ | | ||
+ | @OneToOne(cascade=CascadeType.ALL) | ||
+ | @PrimaryKeyJoinColumn | ||
+ | private Profesor profesor; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Como en el caso anterior vemos cómo debemos incluir los tags '' | ||
+ | ====== 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> | ||
+ | Direccion direccion1=new Direccion(3, | ||
+ | Profesor profesor1=new Profesor(3, " | ||
+ | profesor1.setDireccion(direccion1); | ||
+ | direccion1.setProfesor(profesor1); | ||
+ | | ||
+ | Direccion direccion2=new Direccion(4, | ||
+ | Profesor profesor2=new Profesor(4, " | ||
+ | profesor2.setDireccion(direccion2); | ||
+ | direccion2.setProfesor(profesor2); | ||
+ | | ||
+ | | ||
+ | Session session=sessionFactory.openSession(); | ||
+ | session.beginTransaction(); | ||
+ | | ||
+ | session.save(profesor1); | ||
+ | session.save(direccion2); | ||
+ | | ||
+ | session.getTransaction().commit(); | ||
+ | session.close(); | ||
+ | </ | ||
+ | |||
+ | El ejemplo incluye dos casos: | ||
+ | * Crear un objeto '' | ||
+ | * Crear un objeto '' | ||
+ | |||
+ | <note important> | ||
+ | En ambos casos el resultado aparente es el mismo , se guarda tanto el objeto '' | ||
+ | |||
+ | En el primer caso, si persistimos un objeto '' | ||
+ | |||
+ | </ |