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