unidades:03_relaciones:01_uno_a_uno_direccional
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:03_relaciones:01_uno_a_uno_direccional [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Uno a uno (unidireccional) ====== | ||
+ | La relación uno a uno en Hibernate consiste simplemente en que un objeto tenga una referencia a otro objeto de forma que al persistirse el primer objeto también se persista el segundo. | ||
+ | En esta lección la relación va a ser unidireccional es decir que que la relación //uno a uno// va a ser en un único sentido. | ||
+ | |||
+ | ===== 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; | ||
+ | | ||
+ | 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 que la relación es solo 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=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | En el fichero '' | ||
+ | ===== 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 > | ||
+ | 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> | ||
+ | |||
+ | < | ||
+ | |||
+ | En 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; | ||
+ | } | ||
+ | </ | ||
+ | ====== 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 direccion=new Direccion(1, | ||
+ | Profesor profesor=new Profesor(1, " | ||
+ | profesor.setDireccion(direccion); | ||
+ | | ||
+ | Session session=sessionFactory.openSession(); | ||
+ | session.beginTransaction(); | ||
+ | | ||
+ | session.save(profesor); | ||
+ | | ||
+ | session.getTransaction().commit(); | ||
+ | session.close(); | ||
+ | </ | ||
+ | |||
+ | Como podemos ver no hay **nada** nuevo en el código Java para persistir una relación //uno a uno//, simplemente creamos las 2 clases (Líneas 1 y 2) y establecemos la relación entre ambas asignando al objeto '' | ||
+ | |||
+ | Al ejecutar el ejemplo Hibernate vemos cómo se han creado las filas en las tablas '' | ||
+ | |||
+ | |||
+ | Si vemos el log que se genera al persistir los 2 objetos , podemos ver que se realiza primero una orden '' | ||
+ | |||
+ | <note important> | ||
+ | Recuerda que la clave primaria de '' | ||
+ | </ |