apuntes:hibernate
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
apuntes:hibernate [2019/02/03 14:33] – [Mapeado de las relaciones con atributos Java] fernando | apuntes:hibernate [2024/09/16 16:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 117: | Línea 117: | ||
< | < | ||
< | < | ||
- | < | + | < |
< | < | ||
Línea 245: | Línea 245: | ||
configuracion.setProperty(" | configuracion.setProperty(" | ||
configuracion.setProperty(" | configuracion.setProperty(" | ||
- | configuracion.setProperty(" | + | configuracion.setProperty(" |
configuracion.setProperty(" | configuracion.setProperty(" | ||
Línea 263: | Línea 263: | ||
< | < | ||
... | ... | ||
- | < | + | < |
</ | </ | ||
- | Si ya existe | + | Puedo utilizar //create// o //update//. //Create// crea la base de datos completa. //Update// la crea si no existe, y si ya existe simplemente modifica los cambios que haya en su estructura. |
+ | |||
+ | Si quiero crear las claves ajenas de forma correcta, me interesa que el motor de datos de la base de datos sea //InnoDB//. | ||
==== Pool de conexiones ==== | ==== Pool de conexiones ==== | ||
Cuando un programa trabaja con una bbdd se deben abrir y cerrar conexiones con ella, y si el programa permite conectar diversos clientes, nos encontramos con el problema de conectar y desconectar conexiones a la base de datos. Un //pool// de conexiones es un conjunto (pool) de conexiones ya conectadas a la base de datos que puedan ser reutilizadas entre distintas peticiones. | Cuando un programa trabaja con una bbdd se deben abrir y cerrar conexiones con ella, y si el programa permite conectar diversos clientes, nos encontramos con el problema de conectar y desconectar conexiones a la base de datos. Un //pool// de conexiones es un conjunto (pool) de conexiones ya conectadas a la base de datos que puedan ser reutilizadas entre distintas peticiones. | ||
Línea 616: | Línea 618: | ||
{{ youtube> | {{ youtube> | ||
- | \\ | + | > Operaciones CRUD con hibernate |
+ | |||
+ | ==== Consideraciones sobre mapeo de relaciones==== | ||
+ | Cuando realizamos relaciones bi-direccionales de las clases, desde Java podemos acceder a los elementos relacionados desde cualquier de los dos objetos de una relación. Para ello utilizaremos atributos únicos en el lado de '' | ||
+ | |||
+ | Aunque las relaciones sean bidireccionales, | ||
+ | |||
+ | ===Relaciones 1:N=== | ||
+ | En las relaciones '' | ||
+ | |||
+ | <code java> | ||
+ | @Entity | ||
+ | @Table(name = " | ||
+ | public class Arma { | ||
+ | . . . | ||
+ | private List< | ||
+ | . . . | ||
+ | @OneToMany(mappedBy = " | ||
+ | public List< | ||
+ | . . . | ||
+ | |||
+ | //Métodos utilitarios | ||
+ | // | ||
+ | public void addPersonaje(Personaje personaje){ | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | public void removePersonaje(Personaje personaje){ | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | //Añadir varios (también puedo tener un método de eliminar varios) | ||
+ | public void addPersonajes(Collection< | ||
+ | | ||
+ | personaje.setArma(this); | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | . . . | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | **Los métodos anteriores también se deben codificar en la clase // | ||
+ | |||
+ | Además en esta clase //padre//, cuando borramos un arma también se borrarán los personajes relacionados con dicho arma en la base de datos, para mantener la integridad de las claves ajenas (personaje.id_arma). Si queremos que al borrar un arma no se borren los personajes en cascada, primero podemos eliminar las relaciones del arma con los personajes, antes de borrar el arma. Podemos realizarlo con un método utilitario: | ||
+ | |||
+ | <code java> | ||
+ | . . . | ||
+ | public void removeAllPersonajes(){ | ||
+ | // | ||
+ | | ||
+ | persona.setArma(null); | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | . . . | ||
+ | </ | ||
+ | |||
+ | ===Relaciones N:M=== | ||
+ | En las relaciones @ManytoMany ambas clases funcionan como //padre// y también como //hijo//. También creamos //métodos utilitarios// | ||
+ | |||
+ | <code java> | ||
+ | @Entity | ||
+ | @Table(name = " | ||
+ | public class Arma { | ||
+ | . . . | ||
+ | private Set< | ||
+ | . . . | ||
+ | @ManyToMany(mappedBy = " | ||
+ | public Set< | ||
+ | . . . | ||
+ | |||
+ | //Métodos utilitarios | ||
+ | //Para añadir/ | ||
+ | public void addEnemigo(Enemigo enemigo){ | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | public void removeEnemigo(Enemigo enemigo){ | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | //Para añadir/ | ||
+ | public void addEnemigos(Collection< | ||
+ | | ||
+ | enemigo.getArmas().add(this); | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | |||
+ | public void removeEnemigos(Collection< | ||
+ | | ||
+ | enemigo.getArmas().remove(this); | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | |||
+ | //Eliminar las relaciones con este arma | ||
+ | public void removeAllEnemigos(Collection< | ||
+ | | ||
+ | enemigo.getArmas().remove(this); | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | . . . | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | **También debemos incluir los métodos en la clase // | ||
+ | |||
+ | Otro aspecto a tener en cuenta en las relaciones '' | ||
+ | |||
+ | Del mismo modo, si queremos crear el esquema de la base de datos a partir de las clases mapeadas, **solo usando colecciones tipo '' | ||
===== Proyectos de ejemplo ===== | ===== Proyectos de ejemplo ===== | ||
* [[https:// | * [[https:// |
apuntes/hibernate.1549204390.txt.gz · Última modificación: 2024/09/16 16:05 (editor externo)