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