unidades:06_objetos_validaciones:01_trabajando_objetos
no way to compare when less than two revisions
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:06_objetos_validaciones:01_trabajando_objetos [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Trabajando con Objetos ====== | ||
+ | Este tema va a ser un poco más teórico que los que hemos visto hasta ahora,pero por suerte no va a ser muy necesario excepto en casos muy concretos del uso de Hibernate. | ||
+ | Quizás no nos hayamos parado a pensar cómo funciona Hibernate internamente, | ||
+ | |||
+ | Durante todo el curso no se ha hecho mención alguna a que los objetos que persistimos con Hibernate tienen un estado. Aparentemente no tiene mucho sentido ya que no hay ninguna propiedad //estado// en nuestras clases.Sin embargo el siguiente diagrama muestra los estados un objeto al respecto de Hibernate: | ||
+ | {{ : | ||
+ | |||
+ | Veamos ahora en qué consisten cada uno de los 4 estados: | ||
+ | * **Transitorio** (Transient): | ||
+ | * **Persistido** (Persistent): | ||
+ | * **Despegado** (Detached): Este estado es similar al estado Transitorio sólo que se produce cuando cerramos la sesión mediante <javadoc h41> | ||
+ | * **Removido** (Removed): A este estado pasan los objetos que se han borrado de la base de datos mediante el método '' | ||
+ | |||
+ | ===== Métodos de Session ===== | ||
+ | En el tema [[unidades: | ||
+ | |||
+ | ==== Session.evict(Object objeto) ==== | ||
+ | El método <javadoc h41> | ||
+ | |||
+ | <code java 1> | ||
+ | Session session = sessionFactory.openSession(); | ||
+ | Profesor profesor =(Profesor)session.get(Profesor.class, | ||
+ | session.evict(profesor); | ||
+ | session.close(); | ||
+ | </ | ||
+ | ==== Session.merge(Object objeto) ==== | ||
+ | El método <javadoc h41> | ||
+ | |||
+ | Este método se suele usar cuando tenemos un objeto que no estaba // | ||
+ | |||
+ | Es importante destacar que el objeto que le pasamos como parámetro no tendrá el estado Persistido sino que es el objeto que nos devuelve el que estará en estado Persistido. | ||
+ | |||
+ | <code java 1> | ||
+ | Session session = sessionFactory.openSession(); | ||
+ | Profesor profesor = new Profesor(1001," | ||
+ | |||
+ | Profesor profesor2 = (Profesor) session.merge(profesor); | ||
+ | System.out.println(" | ||
+ | |||
+ | Profesor profesor3 = (Profesor) session.merge(profesor2); | ||
+ | System.out.println(" | ||
+ | |||
+ | session.close(); | ||
+ | </ | ||
+ | |||
+ | * En la línea 2 creamos el objeto '' | ||
+ | * La línea 4 hace que se retorne una nueva referencia a un objeto de la clase '' | ||
+ | * La línea 5 muestra si son iguales los objetos '' | ||
+ | * En la línea 7 volvemos a hacer un '' | ||
+ | * El resultado de la línea 8 ahora es '' | ||
+ | ==== Session.refresh(Object objeto) ==== | ||
+ | El método <javadoc h41> | ||
+ | |||
+ | Se suele usar para recargar el estado del objeto porque ha sido modificado en la base de datos por algún trigger o similar. | ||
+ | |||
+ | <code java 1> | ||
+ | Session session = sessionFactory.openSession(); | ||
+ | Profesor profesor = new Profesor(1001," | ||
+ | session.refresh(profesor); | ||
+ | session.close(); | ||
+ | </ | ||
+ | |||
+ | Si el objeto no existe en la base de datos se producirá la excepción | ||
+ | org.hibernate.UnresolvableObjectException: | ||
+ | |||
+ | ==== LockRequest.lock(Object objeto) ==== | ||
+ | El método <javadoc h41> | ||
+ | |||
+ | Veamos un ejemplo. | ||
+ | <code java 1> | ||
+ | Session session = sessionFactory.openSession(); | ||
+ | Profesor profesor =(Profesor)session.get(Profesor.class, | ||
+ | session.buildLockRequest(LockOptions.UPGRADE).lock(profesor); | ||
+ | session.close(); | ||
+ | </ | ||
+ | |||
+ | * En la línea 2 leemos el objeto | ||
+ | * En la línea 3 lo bloqueamos en la base de datos. | ||
+ | |||
+ | Las SQL que se generan son las siguientes: | ||
+ | select profesor0_.Id as Id3_1_, profesor0_.nombre as nombre3_1_, profesor0_.ape1 as ape3_3_1_, profesor0_.ape2 as ape4_3_1_, direccion1_.Id as Id1_0_, direccion1_.calle as calle1_0_, direccion1_.numero as numero1_0_, direccion1_.idMunicipio as idMunici4_1_0_, | ||
+ | select Id from Profesor where Id =? for update | ||
+ | | ||
+ | Vemos la segunda SQL que es un '' | ||
+ | |||
+ | ==== Session.replicate(Object objeto, | ||
+ | El método <javadoc h41> | ||
+ | |||
+ | ===== LazyInitializationException ===== | ||
+ | Veamos ahora un típico error que se puede dar en Hibernate, la excepción <javadoc h41> | ||
+ | |||
+ | En la anterior sesión hablamos del [[unidades: | ||
+ | |||
+ | Supongamos el siguiente código: | ||
+ | <code java 1> | ||
+ | Session session = sessionFactory.openSession(); | ||
+ | |||
+ | Profesor profesor = (Profesor) session.get(Profesor.class, | ||
+ | System.out.println(" | ||
+ | System.out.println(" | ||
+ | |||
+ | session.close(); | ||
+ | </ | ||
+ | |||
+ | * En la línea 3 se lee el objeto '' | ||
+ | * La línea 4 muestra el mensaje el objeto '' | ||
+ | * En la línea 5 se muestra el nombre del municipio donde vive el profesor. | ||
+ | |||
+ | Aparentemente tras la línea 3 ya no se deberían hacer accesos a la base de datos ya que ya hemos hecho el <javadoc h41> | ||
+ | |||
+ | Hibernate: select profesor0_.Id as Id3_1_, profesor0_.nombre as nombre3_1_, profesor0_.ape1 as ape3_3_1_, profesor0_.ape2 as ape4_3_1_, direccion1_.Id as Id1_0_, direccion1_.calle as calle1_0_, direccion1_.numero as numero1_0_, direccion1_.idMunicipio as idMunici4_1_0_, | ||
+ | Leido el profesor | ||
+ | Hibernate: select municipio0_.idMunicipio as idMunici1_2_0_, | ||
+ | Municipio=Llaurí | ||
+ | |||
+ | Tras leer el '' | ||
+ | <code java 1> | ||
+ | Session session = sessionFactory.openSession(); | ||
+ | |||
+ | Profesor profesor = (Profesor) session.get(Profesor.class, | ||
+ | System.out.println(" | ||
+ | |||
+ | session.close(); | ||
+ | |||
+ | System.out.println(" | ||
+ | </ | ||
+ | hemos modificado que el objeto '' | ||
+ | |||
+ | Exception in thread " | ||
+ | | ||
+ | <note tip> | ||
+ | Ésto de cerrar la sesión y seguir trabajando nos puede parecer una tontería de código pero en una aplicación web, con varias capas y con multitud de frameworks, podemos acabar con código en el que pase ésto sin que nos demos cuenta. | ||
+ | </ | ||
+ | |||
+ | ===== NonUniqueObjectException | ||
+ | Veamos ahora otro típico error que se puede dar en Hibernate, la excepción <javadoc h41> | ||
+ | |||
+ | Veamos el siguiente código: | ||
+ | <code java 1> | ||
+ | Session session = sessionFactory.openSession(); | ||
+ | session.beginTransaction(); | ||
+ | |||
+ | Profesor profesor = new Profesor(1001, | ||
+ | Profesor profesor2 = (Profesor) session.get(Profesor.class, | ||
+ | |||
+ | profesor.setNombre(" | ||
+ | session.update(profesor); | ||
+ | |||
+ | session.getTransaction().commit(); | ||
+ | session.close(); | ||
+ | </ | ||
+ | |||
+ | En la línea 4 se crea el objeto '' | ||
+ | Exception in thread " | ||
+ | | ||
+ | ¿Cuál ha sido el problema? Volvamos a explicar | ||
+ | |||
+ | * En la línea 4 se crea el objeto '' | ||
+ | * En la línea 5 se crea mediante el método <javadoc h41> | ||
+ | |||
+ | ¿Qué ocurre en la línea 8? | ||
+ | Que mediante el método '' | ||
+ | |||
+ | <note tip> | ||
+ | Ésto de tener más de un objeto para la misma fila nos puede parecer una tontería de código pero en una aplicación web, con varias capas y con multitud de frameworks, podemos acabar con código en el que pase ésto sin que nos demos cuenta. | ||
+ | </ | ||
+ | |||
+ | ===== Referencias ===== | ||
+ | * [[http:// |
unidades/06_objetos_validaciones/01_trabajando_objetos.txt · Última modificación: 2023/04/07 21:26 por 127.0.0.1