Herramientas de usuario

Herramientas del sitio


apuntes:hibernate

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
apuntes:hibernate [2019/02/03 14:37] – [Consideraciones sobre mapeo de relaciones] fernandoapuntes:hibernate [2024/09/16 16:03] (actual) – editor externo 127.0.0.1
Línea 117: Línea 117:
     <property name="hibernate.connection.username">usuario</property>     <property name="hibernate.connection.username">usuario</property>
     <property name="hibernate.connection.password">contraseña</property>     <property name="hibernate.connection.password">contraseña</property>
-    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>+    <property name="hibernate.dialect">org.hibernate.dialect.MySQL55Dialect</property>
  
     <!--muestra las consultas por consola -->     <!--muestra las consultas por consola -->
Línea 245: Línea 245:
 configuracion.setProperty("hibernate.connection.username", "root"); configuracion.setProperty("hibernate.connection.username", "root");
 configuracion.setProperty("hibernate.connection.password", ""); configuracion.setProperty("hibernate.connection.password", "");
-configuracion.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");+configuracion.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL55Dialect");
 configuracion.setProperty("Hibernate.show_sql", "true"); configuracion.setProperty("Hibernate.show_sql", "true");
  
Línea 263: Línea 263:
 <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/basededatos?createDatabaseIfNotExist=true</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/basededatos?createDatabaseIfNotExist=true</property>
 ... ...
-<property name="hibernate.hbm2ddl.auto">create</property>+<property name="hibernate.hbm2ddl.auto">update</property>
 </code> </code>
  
-Si ya existe la base de datos, también puedo modificar su estructura, en caso de haber algún cambio en las anotaciones de las clases. Para ello uso la palabra ''update'' en lugar de ''create''.+Puedo utilizar //create// o //update//. //Create// crea la base de datos completa. //Update// la crea si no existey si ya existe simplemente modifica los cambios que haya en su estructura
 + 
 +Si quiero crear las claves ajenas de forma correctame 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>w1-Zm9DCmTY }} {{ youtube>w1-Zm9DCmTY }}
-\\+> Operaciones CRUD con hibernate 
 ==== Consideraciones sobre mapeo de relaciones==== ==== 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 ''@ManytoOne'' y colecciones (List, Set, Map) para el lado de ''@OneToMany'' o ''@ManyToMany''. 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 ''@ManytoOne'' y colecciones (List, Set, Map) para el lado de ''@OneToMany'' o ''@ManyToMany''.
  
-Aunque las relaciones sean bidireccionales, hibernate enfoca las relaciones desde una jerarquía //**padre-hijo**//Las modificaciones en la base de datos siempre se propagan desde el lado del Padre+Aunque las relaciones sean bidireccionales, hibernate enfoca las relaciones desde una jerarquía //**padre-hijo**//Para asegurarnos de mantener la relaciones de forma correcta en la base de datos, añadiremos a las clases mapeadas una serie de //métodos utilitarios//.
  
 ===Relaciones 1:N=== ===Relaciones 1:N===
-En las relaciones 1:N, la clase //padre// es la que contiene la relación ''@OneToMany'' y es útil que contenga algunos métodos utilitarios:+En las relaciones ''@OneToMany''''@ManyToOne'' es recomendable que contenga algunos métodos utilitarios para mantener las relaciones:
  
 <code java> <code java>
Línea 637: Línea 640:
      
   //Métodos utilitarios   //Métodos utilitarios
 +  //Añadir/Eliminar un personajes
   public void addPersonaje(Personaje personaje){   public void addPersonaje(Personaje personaje){
      personajes.add(personaje);      personajes.add(personaje);
Línea 644: Línea 648:
   public void removePersonaje(Personaje personaje){   public void removePersonaje(Personaje personaje){
      personaje.setArma(null);      personaje.setArma(null);
-     if(personajes.contains(personaje){ +     personajes.remove(personaje); 
-        personajes.remove(personaje);+  } 
 +   
 +  //Añadir varios (también puedo tener un método de eliminar varios) 
 +  public void addPersonajes(Collection<Personaje> personajes){ 
 +     for(Personaje personaje : personajes){ 
 +        personaje.setArma(this);
      }      }
 +     this.parsonajes.addAll(personajes);
   }   }
   . . .   . . .
 } }
 </code> </code>
 +
 +**Los métodos anteriores también se deben codificar en la clase //Personaje//.**
  
 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: 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:
Línea 661: Línea 673:
         persona.setArma(null);         persona.setArma(null);
      }      }
-     personajes.clear;   //Vacio la coleccion+     personajes.clear();   //Vacio la coleccion
   }   }
   . . .   . . .
Línea 667: Línea 679:
  
 ===Relaciones N:M=== ===Relaciones N:M===
-En las relaciones @ManytoMany ambas clases funcionan como //padre// y también como //hijo//, pero también identificamos una clase para propagar los cambiosEn este caso los métodos utilitarios están en la clase que contiene la anotación //mappedBy//:+En las relaciones @ManytoMany ambas clases funcionan como //padre// y también como //hijo//También creamos //métodos utilitarios// para matener la integridad de las relaciones en la base de datos.
  
 <code java> <code java>
Línea 681: Línea 693:
      
   //Métodos utilitarios   //Métodos utilitarios
 +  //Para añadir/eliminar uno
   public void addEnemigo(Enemigo enemigo){   public void addEnemigo(Enemigo enemigo){
 +     enemigo.getArmas().add(this);
      enemigos.add(enemigo);      enemigos.add(enemigo);
-     enemigos.setArma(this); 
   }   }
      
   public void removeEnemigo(Enemigo enemigo){   public void removeEnemigo(Enemigo enemigo){
-     enemigo.setArma(null); +     enemigo.getArmas.remove(this); 
-     if(enemigos.contains(enemigo){ +     enemigos.remove(enemigo); 
-        enemigos.remove(enemigo);+  } 
 +   
 +  //Para añadir/eliminar varios 
 +  public void addEnemigos(Collection<Enemigo> enemigos){ 
 +     for(Enemigo enemigo : enemigos){ 
 +        enemigo.getArmas().add(this); 
 +     } 
 +     this.enemigos.addAll(enemigos); 
 +  } 
 +   
 +  public void removeEnemigos(Collection<Enemigo> enemigos){ 
 +     for(Enemigo enemigo: enemigos){ 
 +        enemigo.getArmas().remove(this); 
 +     } 
 +     this.enemigos.removeAll(enemigos); 
 +  } 
 +   
 +  //Eliminar las relaciones con este arma 
 +  public void removeAllEnemigos(Collection<Enemigo> enemigos){ 
 +     for(Enemigo enemigo: enemigos){ 
 +        enemigo.getArmas().remove(this);
      }      }
 +     this.enemigos.clear();
   }   }
   . . .   . . .
Línea 696: Línea 730:
 </code> </code>
  
-Otro aspecto a tener en cuenta es que en las relaciones ''@ManyToMany'' el uso de colecciones tipo ''Set<>'' favorece el rendimiento respecto a colecciones de tipo ''List<>''. Hibernate necesita lanzar más consultas para las eliminaciones o inserciones usando una lista, frente a un conjunto.+**También debemos incluir los métodos en la clase //Enemigo//.**
  
-Del mismo modo, si queremos crear el esquema de la base de datos partir de las clases mapeadas, solo usando colecciones tipo ''Set'' se crean las claves primarias de la tabla de relación.+Otro aspecto tener en cuenta en las relaciones ''@ManyToMany'' es el uso de colecciones tipo ''Set<>'', ya que favorecen el rendimiento respecto a colecciones de tipo ''List<>''. Hibernate necesita lanzar más consultas para las eliminaciones o inserciones usando una lista, frente a un conjunto.
  
 +Del mismo modo, si queremos crear el esquema de la base de datos a partir de las clases mapeadas, **solo usando colecciones tipo ''Set'' se crean las claves primarias de la tabla de relación.**
 ===== Proyectos de ejemplo ===== ===== Proyectos de ejemplo =====
   * [[https://bitbucket.org/fvaldeon/accesodatosud3/src| Repositorio de bitbucket]] con ejemplos y los proyectos realizados en clase (Fernando)   * [[https://bitbucket.org/fvaldeon/accesodatosud3/src| Repositorio de bitbucket]] con ejemplos y los proyectos realizados en clase (Fernando)
apuntes/hibernate.1549204634.txt.gz · Última modificación: 2024/09/16 16:05 (editor externo)