Home

Documentación de referencia de Hibernate

image

Contents

1. lt class name Person gt lt set name cats batch size 3 gt lt set gt lt class gt Con un batch size de 3 Hibernate cargar las colecciones 3 3 3 1 en cuatro sELEcTS Una vez m s el valor del atributo depende del n mero esperado de colecciones sin inicializar en una Session en particular La recuperaci n de colecciones en lotes es particularmente til si tiene un rbol anidado de items por ejemplo el t pico patr n de cuenta de materiales Sin embargo un conjunto anidado o una ruta materializada podr a ser una mejor opci n para rboles que sean de lectura en la mayor a de los casos 20 1 6 Utilizaci n de la recuperaci n por subselecci n Si una colecci n perezosa o proxy monovaluado tiene que ser recuperado Hibernate los carga atodos volviendo a ejecutar la consulta original en una subselecci n Esto funciona de la misma forma que la recuperaci n en lotes sin carga fragmentaria 20 1 7 Perfiles de recuperaci n Otra manera de modificar la estrategia de recuperaci n para cargar objetos asociados es por medio de algo llamado un perfil de recuperaci n el cual es una configuraci n nombrada asociada con la org hibernate SessionFactory pero habilitada por nombre en la org hibernate Session Una vez habilitada en una org hibernate Session el perfil de recuperaci n estar en efecto para esa org hibernate Session hasta que se deshabilite expl citamente 272 P
2. 151 9 1 5 Tabla por clase concreta ooococcococonoccconccnconononnnnnncnnncn cnn nnnnan cra nan cc nn rra 152 9 1 6 Tabla por clase concreta utilizando polimorfismo impl cito 153 9 1 7 Mezcla de polimorfismo impl cito con otros mapeos de herencia 154 9 2 LIMITACIONES sssaaa lotes clio llas Dri dto 155 10 Trabajo con objetos 20 00 nn reese eres cnn nannnnnnnnnnn nn nnnannnnns 157 10 1 Estados de objeto de Hibernate oooooccccconnccccncnccccnnnnnccnnnnnnccnnnnnncnnnnnnncrnnn caninos 157 10 2 Haciendo los Objetos persistentes ooonoconnncciccccccnnncnnccnnnnnncnnnnnnnrrnnnnnncnnnn canon 157 10 3 Cargando UN Objeto ooooocccccnccccconcccccnnnnconononnnncnnnancnnononnnnannrnncnnnnnnnanannrancnncnnns 159 10 4 Consultas cios iii ele 160 10 4 1 Ejecuci n de consultas ooocococonoccccnccnconcnnnnannnncancnncnnnnanancrnn cano nnnnnnancnnn 160 10 4 2 Filtraci n de colecciones ooooonoccccnnccccnnnononnccnnnncnnnnonnnncannan conc nnnnananananes 164 10 4 3 Consultas de criterios siisii ainan a aa cra rca EEEa E 165 10 4 4 Consultas en SQL nativo ocoooconoccccnccnnoncnnnnanccncnncnnnnnnnnncncnnnnn nc nn nnnnancan 165 10 5 Modificaci n de objetos persistentes oococninccnnconncocccnnnccnnnoncnnconcancn nono nnananncnnos 166 10 6 Modificaci n de Objetos separados ooooccccccncccnconccoconnnncnnnnonnnncnnnan cono nnnnncnnnanos 166 10 7 Detecci n autom tica de estado
3. 250 Personalice SQL para crear actualizar y borrar lt id gt lt property name name not null true gt lt sql insert gt INSERT INTO PERSON NAME ID VALUES UPPER lt sql insert gt lt sql update gt UPDATE PERSON SET NAME UPPER WHERE ID lt sql update gt lt sql delete gt DELETE FROM PERSON WHERE ID lt sql delete gt lt class El SQL se ejecuta directamente en su base de datos asi que usted es libre de utilizar cualquier dialecto que desee Esto reducir la portabilidad de su mapeo si utiliza una base de datos especifica de SQL Los procedimientos almacenados se encuentran soportados si el atributo callable est configurado lt class name Person gt lt id name id gt lt generator class increment gt lt id gt lt property name name not null true gt lt sql insert callable true gt call createPerson lt sql insert gt lt sql delete callable true gt call deletePerson lt sql delete gt lt sql update callable true gt call updatePerson lt sql update gt lt class gt El orden de los par metros posicionales es vital ya que se deben encontrar en la misma secuencia en que Hibernate los espera Puede ver el orden esperado habilitando el registro de depuraci n para el nivel org hibernate persister entity Con este nivel habilitado Hibernate imprimir el SQL est tico que se utiliza para crear actualizar borrar etc
4. base 0 1 gt column_name required the name of the column holding the collection index values base optional defaults to 0 the value of the index column that corresponds to the first element of the list or array lt map key column column_name formula any SOL expression 0090 type type_name node fattribute name length N gt column optional the name of the column holding the collection index values 6 formula optional a SQL formula used to evaluate the key of the map O type required the type of the map keys lt map key many to many column column_name formula any SOL expression 00 class ClassName column optional the name of the foreign key column for the collection index values formula optional a SQ formula used to evaluate the foreign key of the map key class required the entity class used as the map key Si su tabla no tiene una columna indice y todav a desea utilizar List como tipo de propiedad puede mapear la propiedad como un lt bag gt de Hibernate Un bag bolsa no retiene su orden al ser recuperado de la base de datos pero puede ser ordenado o clasificado de manera opcional 115 Cap tulo 6 Mapeos de colecci n 6 2 4 Colecciones de valores y asociaciones muchos a muchos Cualquier colecci n de valores o asociaci n muchos a muchos requiere una tabla de colecci n dedicada con una columna o columnas de clave for n
5. lt hibernate mapping package org hibernate tutorial domain gt lt class name Person table PERSON gt lt id name id column PERSON_ID gt lt generator class native gt lt id gt lt property name age gt lt property name firstname gt lt property name lastname gt lt class gt lt hibernate mapping 5 Finalmente a ada el nuevo mapeo a la configuraci n de Hibernate lt mapping resource events Event hbm xml gt lt mapping resource events Person hbm xml gt Vamos a crear una asociaci n entre estas dos entidades Las personas pueden participar en los eventos y los eventos cuentan con participantes Las cuestiones de dise o con las que tenemos que tratar son direccionalidad multiplicidad y comportamiento de la colecci n 1 2 2 Una asociaci n unidireccional basada en Set Al agregar una colecci n de eventos a la clase Person puede navegar f cilmente a los eventos de una persona en particular sin ejecutar una petici n expl cita llamando a Person getEvents En Hibernate las asociaciones multi valores se representan por medio de uno de los contratos del marco de colecciones Java aqu escogimos un java util Set ya que la colecci n no contendr elementos duplicados y el orden no es relevante para nuestros ejemplos public class Person private Set events new HashSet public Set getEvents return events public void setEvents Set events this events eve
6. lt param name property gt employee lt param gt lt generator gt lt id gt lt one to one name employee class Employee constrained true gt lt class gt A una instancia reci n guardada de Person se le asigna el mismo valor de clave principal que se le asign a la instancia Employee referida por la propiedad employee de esa Person Opcionalmente una clave for nea con una restricci n de unicidad desde Employee a Person se puede expresar como lt many to one name person class Person column PERSON_ID unique true gt Esta asociaci n puede hacerse bidireccional agregando lo siguiente al mapeo de Person lt one to one name employee class Employee property ref person gt 5 1 14 Natural id lt natural id mutable true false gt lt property gt lt many to one gt lt natural id gt Aunque recomendamos el uso de claves delegadas como claves principales debe tratar de identificar claves naturales para todas las entidades Una clave natural es una propiedad o combinaci n de propiedades que es nica y no nula Tambi n es inmutable Mapea las propiedades de la clave natural dentro del elemento lt natural id gt Hibernate generar las restricciones de nulabilidad y de clave nica necesarias y su mapeo ser m s auto documentado Le recomendamos bastante que implemente equals Y hashCode para comparar las propiedades de clave natural de la entidad
7. or String hqlUpdate update Customer set name newName where name oldName int updatedEntities s createQuery hqlUpdate setString newName newName setString oldName oldName executeUpdate Ex commit session close Para mantenerse de acuerdo con la especificaci n de EJB3 las declaraciones uppaTE de HQL por defecto no afectan la versi n o los valores de la propiedad sello de fecha para las entidades afectadas Sin embargo puede obligar a Hibernate a poner en cero apropiadamente los valores de las propiedades versi n O sello de fecha por medio de la utilizaci n de una actualizaci n con versi n Esto se logra agregando la palabra clave VERSIONED despu s de la palabra clave UPDATE Session session sessionFactory openSession Transaction tx session beginTransaction j String hqlVersionedUpdate update versioned Customer set name newName where name oldName int updatedEntities s createQuery hqlUpdate setString newName newName setString oldName oldName executeUpdate Ex commit i session close Observe que los tipos de versiones personalizados org hibernate usertype UserVersionType no estan permitidos en conjunto con una declaraci n update versioned 3 Para ejecutar un DELETE HQL utilice el mismo m todo Query executeUpdate Session session sessionFactory openSession Transaction tx session
8. 102 Mapeo de una clase m s de una vez lt property name priority gt lt type name com mycompany usertypes DefaultValuelntegerType gt lt param name default gt 0 lt param gt lt type gt lt property gt Ahora el UserType puede recuperar el valor del par metro denominado defau1t del objeto Properties que se le pasa Si utiliza cierto UserType muy frecuentemente puede ser til el definir un nombre m s corto para este Puede hacer esto utilizando el elemento lt t ypedef gt Los typedefs asignan un nombre a un tipo personalizado y tambi n pueden contener una lista de valores predeterminados de par metros si el tipo se encuentra parametrizado lt typedef class com mycompany usertypes DefaultValuelntegerType name default_zero gt lt param name default gt 0 lt param gt lt typedef gt lt property name priority type default_zero gt Tambi n es posible sobrescribir los par metros provistos en un typedef sobre una base de caso por caso utilizando par metros de tipo en el mapeo de la propiedad Aunque el amplio espectro de tipos incorporados y de soporte para los componentes de Hibernate significa que necesitar usar un tipo personalizado muy raramente se considera como una buena pr ctica el utilizar tipos personalizados para clases no entidades que aparezcan frecuentemente en su aplicaci n Por ejemplo una clase MonetaryAmount es una buena candidata para un CompositeUserType incl
9. Clases persistentes Las clases presistentes son clases en una aplicaci n que implementan las entidades del problema empresarial por ejemplo Customer y Order en una aplicaci n de comercio electr nico No se considera que todas las instancias de una clase persistente est n en estado persistente Por ejemplo una instancia puede ser transitoria o separada Hibernate funciona mejor si estas clases siguen algunas reglas simples tambi n conocidas como el modelo de programaci n POJO Plain Old Java Object Sin embargo ninguna de estas reglas son requerimientos r gidos De hecho Hibernate3 asume muy poco acerca de la naturaleza de sus objetos persistentes Puede expresar un modelo de dominio en otras formas por ejemplo utilizando rboles de instancias de Map 4 1 Ejemplo simple de POJO La mayor a de aplicaciones Java requieren una clase persistente que represente a los felinos Por ejemplo package eg import java util Set import java util Date public class Cat private Long id identifier private Date birthdate private Color color private char sex private float weight private int litterld private Cat mother private Set kittens new HashSet private void setId Long id this id id public Long getId return id void setBirthdate Date date birthdate date public Date getBirthdate return birthdate void setWeight float weight this weight weight public
10. Muchos elementos de mapeo tambi n aceptan un elemento lt column gt hijo Esto es particularmente til para mapear tipos de multi columna lt property name name type my customtypes Name gt lt column name last not null true index bar_idx length 30 gt lt column name first not null true index bar_idx length 20 gt lt column name initial gt lt property gt El atributo default le permite especificar un valor por defecto para una columna Usted le debe asignar el mismo valor a la propiedad mapeada antes de guardar una nueva instancia de la clase mapeada lt property name credits type integer insert false gt lt column name credits default 10 gt lt property gt lt version name version type integer insert false gt lt column name version default 0 gt lt property gt El atributo sq1 type permite al usuario sobrescribir el mapeo por defecto de tipo Hibernate a tipo de datos SQL lt property name balance type float gt lt column name balance sql type decimal 13 3 gt lt property gt El atributo check le permite especificar una comprobaci n de restricci n lt property name foo type integer gt lt column name foo check foo gt MON lt property gt lt class name Foo table foos check bar lt 100 0 gt lt property name bar type float gt 289 Cap tulo 21 Manual del conju lt class gt
11. lt hibernate mapping gt 23 3 C digo Hibernate La siguiente clase demuestra algunos de los tipos de cosas que podemos hacer con estas clases utilizando Hibernate package eg import java util ArrayList import java util Calendar import java util Iterator import java util List import org hibernate HibernateException import org hibernate Query import org hibernate Session import org hibernate SessionFactory import org hibernate Transaction import org hibernate cfg Configuration import org hibernate tool hbm2ddl SchemaExport public class BlogMain private SessionFactory _sessions public void configure throws HibernateException _sessions new Configuration addClass Blog class addClass BlogItem class buildSessionFactory public void exportTables throws HibernateException Configuration cfg new Configuration addClass Blog class addClass BlogItem class new SchemaExport cfg create true true public Blog createBlog String name throws HibernateException Blog blog new Blog blog setName name blog setItems new ArrayList Session session _sessions openSession Transaction tx null try tx session beginTransaction session persist blog 304 C digo Hibernate Ex commit O catch HibernateException he if tx null tx rollback throw he finally session close return blog public B
12. lt many to one name product insert false update false not null true column productId gt lt class gt lt class name Product gt lt synchronize table Lineltem gt lt id name productId length 10 gt lt generator class assigned gt a lt property name description not null true length 200 gt lt property name price length 3 gt lt property name numberAvailable gt lt property name numberOrdered gt lt formula gt select sum li quantity from Lineltem li where li productId productId lt formula gt lt property gt lt class gt 317 Cap tulo 24 Ejemplo mapeos 24 4 3 Muchos a muchos con atributo compartido de clave compuesta lt class name User table User gt lt composite id gt lt key property name name gt lt key property name org gt lt composite id gt lt set name groups table UserGroup gt lt key gt lt column name userName gt lt column name org gt lt key gt lt many to many class Group gt lt column name groupName gt lt formula gt org lt formula gt lt many to many gt lt set gt lt class gt lt class name Group table Group gt lt composite id gt lt key property name name gt lt key property name org gt lt composite id gt lt property name description gt lt set name users table UserGroup inverse true gt lt key gt lt column na
13. Event theEvent new Event theEvent setTitle title theEvent setDate theDate session save theEvent session getTransaction commit En createAndStoreEvent creamos un nuevo objeto Event y se lo entregamos a Hibernate En ese momento Hibernate se encarga de SQL y ejecuta un INSERT en la base de datos A org hibernate Session is designed to represent a single unit of work a single atomic piece of work to be performed For now we will keep things simple and assume a one to one granularity between a Hibernate org hibernate Session and a database transaction To shield our code from the actual underlying transaction system we use the Hibernate org hibernate Transaction API In this particular case we are using JDBC based transactional semantics but it could also run with JTA Qu hace sessionFactory getCurrentSession Primero la puede llamar tantas veces como desee y en donde quiera una vez consiga SU org hibernate SessionFactory El m todo getCurrentSession siempre retorna la unidad de trabajo actual Recuerda que cambiamos la opci n de la configuraci n de este mecanismo a thread en src main resources hibernate cfg xm1 Por lo tanto el contexto de una unidad de trabajo actual se encuentra vinculada al hilo de Java actual que ejecuta nuestra aplicaci n Importante Hibernate ofrece tres m todos de rastreo de sesi n actual El m todo basado en hilos no est dirigido al uso de producci n
14. Hibernate no genera DDL con disparadores Es para los esquemas heredados s lamente lt id name id type long column person_id gt lt generator class select gt lt param name key gt socialSecurityNumber lt param gt lt generator gt lt id gt En el ejemplo anterior hay una propiedad nica llamada socialSecurityNumber Esta est definida por la clase como una clave natural y una clave sustituta llamada person_id cuyo valor es generado por un disparador 5 1 5 Generadores mejorados del identificador Desde el lanzamiento 3 2 3 hay 2 nuevos generadores los cuales representan una nueva reflexi n sobre dos aspectos diferentes de la generaci n del identificador El primer aspecto es que tan port til es la base de datos el segudno es la optimizaci n La optimizaci n significa que no tiene que preguntarle a la base de datos por toda petici n de un nuevo valor identificador Estos dos nuevos generadores tienen el prop sito de tomar el lugar de algunos de los generadores nombrados que describimos anteriormente empezando por 3 3 x Sin embargo est n inclu dos en los lanzamientos actuales y puede ser referenciados por FQN El primero de estos nuevos generadores es org hibernate id enhanced SequenceStyleGenerator el cual tiene el prop sito primero de ser el reemplazo para el generador sequence y segundo de ser un generador de portabilidad mejor que native Esto se debe a que native generalmente escoge entre id
15. Las propiedades de la base de datos se pueden especificar como propiedades del sistema con p lt property gt e en hibernate properties en un archivo de propiedades nombrado con properties 291 Cap tulo 21 Manual del conju Las propiedades necesarias son las siguientes Tabla 21 3 Propiedades de Conexi n del SchemaExport Nombre de la Propiedad Descripci n hibernate connection driver_class Clase del controlador jdbc hibernate connection url url de jdbc hibernate connection username usuario de la base de datos hibernate connection password contrasena del usuario hibernate dialect dialecto 21 1 4 Utilizaci n de Ant Puede llamar a Schema lt target name schemaexport gt lt taskdef name schemaexport Export desde su script de construcci n de Ant classname org hibernate tool hbm2dd1 SchemaExportTask classpathref class path gt lt schemaexport properties hibernate properties quiet no text no drop no delimiter output schema export sql gt lt fileset dir src gt lt fileset gt lt schemaexport gt lt target gt lt include name hbm xml gt 21 1 5 Actualizaciones incrementales de esquema La herramienta SchemaUpdate actualizar un esquema existente con cambios incrementales El SchemaUpdate depende de la API de metadatos de JDBC de modo que no funcionar con todos los controladores JDBC java
16. O saveO0rUpdate y siempre que recupere un objeto utilizando 1oad get list iterate O scroll ese objeto se agrega al cach interno de la Session Cuando luego se llame a flush el estado de ese objeto ser sincronizado con la base de datos Si no quiere que ocurra esta sincronizaci n o si est procesando un n mero enorme de objetos y necesita gestionar la memoria eficientemente puede utilizar el m todo evict para quitar el objeto y sus colecciones del cach de primer nivel ScrollableResult cats sess createQuery from Cat as cat scroll a huge result set while cats next Cat cat Cat cats get 0 doSomethingWithACat cat sess evict cat 278 El Cach de Consultas La Session tambi n proporciona un m todo contains para determinar si una instancia pertenece al cach de la sesi n Para expulsar todos los objetos del cach de sesi n llame a Session clear Para el cach de segundo nivel hay m todos definidos en SessionFactory para explusar el estado en cach de una instancia clase entera instancia de colecci n o rol entero de colecci n sessionFactory evict Cat class catId evict a particular Cat sessionFactory evict Cat class evict all Cats SessionMactory evictCol lecticn Cat kittens catid fevict a particular collection of kittens sessionFactory evictCollection Cat kittens evict all kitten collections El CacheMode controla
17. fooBean has getName and getSize List toos site Las colecciones son paginables usando la interfaz Query con un filtro Query q s createFilter collection the trivial filter q setMaxResults PAGE_SIZE q setFirstResult PAGE_SIZE pageNumber List page q list Los elementos de colecci n se pueden ordenar o agrupar usando un filtro de consulta Collection orderedCollection s filter collection order by this amount Collection counts s filter collection select this type count this group by this type Puede hallar el tama o de una colecci n sin inicializarla Integer session createQuery select count from iterate next intValue 15 17 Componentes Los componentes se pueden utilizar de la misma manera en que se pueden utilizar los tipos de valores simples en consultas HQL Pueden aparecer en la cl usula select as select p name from Person p select p name first from Person p en donde el nombre de la Persona es un componente Los componentes tambi n se pueden utilizar en la cl usula where from Person p where p name name from Person p where p name first firstName 231 Cap tulo 15 HQL El lenguaje Los componentes tambi n se pueden utilizar en la cl usula where from Person p order by p name from Person p order by p name first Otro uso com n de los componentes se encuentra en row value constructors 15 18 Sintaxis del co
18. lt class cache class org hibernate auction Bid usage read only gt lt collection cache collection org hibernate auction Item bids usage read write gt lt session factory gt lt hibernate configuration gt La ventaja de este enfoque es la externalizaci n de los nombres de los archivos de mapeo a la configuraci n El hibernate cfg xml1 tambi n es m s pr ctico una vez que haya afinado el cach de Hibernate Puede escoger ya sea hibernate properties O hibernate cfg xml Ambos son equivalentes excepto por los beneficios de utilizar la sintaxis XML que mencionados anteriormente Con la configuraci n XML iniciar Hibernate es tan simple como SessionFactory sf new Configuration configure buildSessionFactory Puede seleccionar un fichero de configuraci n XML diferente utilizando SessionFactory sf new Configuration configure catdb cfg xml buildSessionFactory 3 8 Integracion con Servidores de Aplicaciones J2EE Hibernate tiene los siguientes puntos de integraci n con la infraestructura J2EE e Fuentes de datos administrados por el contenedor Hibernate puede utilizar conexiones JDBC administradas por el contenedor y provistas a trav s de JNDI Usualmente UN TransactionManager compatible con JTA y un ResourceManager se ocupan de 48 Configuraci n de la estrategia de transacci n la administraci n de transacciones CMT especialmente del manejo de transacciones distri
19. oooooooccccccccccnononococonnnncnnnnonnanccnnnn cono nnnnancnncanos 168 10 8 Borrado de objetos persistentes oocoonncccccnocccccononcnncnnnnnnnconnnnnnconnnnnncnnnanancnnns 169 10 9 Replicaci n de objetos entre dos almacenamientos de datos diferentes 169 10 10 Limpieza flushing de la sesi n ooonncnnnconnccccnnconcnnnnnncaccnnnoncnnnnnncncrnncnncnnnnnns 170 10 11 Persistencia transitiva seieren A NEE KAEA ERNA 171 10 12 Utilizaci n de metadatos ooooooooncccccncoccnnnnonccccnnnnncnnnnanancnnnnnnnnnnnnancrnn cn ncnnnnnns 173 11 Read only entities oooioconin ic A 175 11 1 Making persistent entities read only coooooccccconccccononoccnononaccnonnnancnonnnaccnonnnnninnns 175 11 1 1 Entities of immutable classes ooociccnncnnncononcccccnncnncnnnonncncnnnnn nn nn nnnnannnnn 176 11 1 2 Loading persistent entities as read only oooooonnncinnnncicnconcccconcnnccnnnnnnnn 176 11 1 3 Loading read only entities from an HQL query criteria e eee 177 11 1 4 Making a persistent entity read only cece te eeeeeeeeeeeeee na eeeeeenaeeeeeeaa 178 11 2 Read only affect on property type cceceeeceeeaeeeeeeeeeeeeeeeaeaaeeneeeeeeeeeaeaaaaeeeees 179 11 2 1 Simple properties 2 0 0 0 cece cece cece ennn et ee tere sees ee aaacaa te eeeeeeeeaaaaaaeeeeeeees 180 11 2 2 Unidirectional ASSOCIATIONS 2 00 00 ee eect cece ee ee eee teeeeeeeeeeeaaaaeeneeeeeeees 181 11 2 3 Bidirectional ASSOCIA
20. y el tiempo promedio que necesita una consulta Tenga en cuenta que el n mero de milisegundos est sujeto a una aproximaci n en Java Hibernate est vinculado a la precisi n de la MVJ en algunas plataformas esto podr a tener incluso una exactitud de 10 segundos Se usan getters simples para acceder a la m trica global por ejemplo no vinculadas en particular a una entidad colecci n regi n de cach etc Puede acceder a las m tricas de una entidad colecci n regi n de cach en particular a trav s de su nombre y a trav s de su representaci n HQL o SQL para las consultas Por favor refi rase al Javadoc de la API de Statistics EntityStatistics CollectionStatistics SecondLevelCacheStatistics y QueryStatistics para obtener m s informaci n El siguiente c digo es un ejemplo sencillo Statistics stats HibernateUtil sessionFactory getStatistics double queryCacheHitCount stats getQueryCacheHitCount double queryCacheMissCount stats getQueryCacheMissCount double queryCacheHitRatio queryCacheHitCount queryCacheHitCount queryCacheMissCount log info Query Hit ratio queryCacheHitRatio EntityStatistics entityStats stats getEntityStatistics Cat class getName long changes entityStats getInsertCount entityStats getUpdateCount entityStats getDeleteCount log info Cat class getName changed changes times Para trabajar sobre todas las entidades colecc
21. 0ccccceceeeeeneeeeeeeeeeeeeeaaeaeeeeeeeeeeeeaaaaeeeeeeeeeeeaaa 265 20 1 1 Trabajo con asociaciones perezOSaS coooccccccnnccccnonnccnnnnnncnnnonnncnnnnnnninos 266 20 1 2 Afinaci n de las estrategias de recuperaci n eseese 267 20 1 3 Proxies de asociaciones de UN s lo extremo oooocooocccccccccccnnnnncncinnnncnnnns 268 20 1 4 Inicializaci n de Colecciones y proxies oooooococccccccnccccnnnonncnconnnnccnnnnnnanos 270 20 1 5 Utilizaci n de recuperaci n de lotes ooococcnncncncoccccccncnnconcnononncncnancnncnnns 271 20 1 6 Utilizaci n de la recuperaci n por SubselecciOn ooooccccncncccoconcccccnncnccnnns 272 20 1 7 Perfiles de recuperaci n ooooooccccccccccocononoccnnnnnnnononnnncnnnnncnnnnonnnncnnnancnnns 272 20 1 8 Utilizaci n de la recuperaci n perezosa de propiedades oooooooccccccccccc 274 20 2 El Cach de Segundo Nivel oooconocccccccnccncncnocnccnconconcnnnnnncncnnnnnnnnnnnanancnncancnnns 275 viii 20 2 1 Mapeos de cach ooooooocccccccccconononoconnnncnnonnnnnnnncnncn nn cnn nan nr nn r nn cnn nn 276 20 2 2 Estrategia S lo lECTUFA deis in leia 276 20 2 3 Estrategia lectura escritura read write oooooonocnnnnonocicnnnncccnnnnncccnnnnnncns 277 20 2 4 Estrategia lectura escritura NO estricta oooooonncccnccconnciccccconacinonancnncncnnnn 277 20 2 5 Estrategia transaccional oooccoconncccccnncccccnnnnnnccnnnnnnnnnnn nan cn nn nn nn cn nana 277 20 2 6 Compatibilidad de proveedor d
22. La cl usula group by ni la cl usula order by pueden contener expresiones aritm ticas Hibernate tampocoo expande una entidad agrupada as que no puede escribir group by cat si todas las propiedades de cat son no agregadas Tiene que enumerar todas la propiedades no agregadas expl citamente 15 13 Subconsultas Para bases de datos que soportan subconsultas Hibernate soporta subconsultas dentro de consultas Una subconsulta se debe encerrar entre par ntesis frecuentemente por una llamada a una funci n de agregaci n SQL Incluso se permiten subconsultas correlacionadas subconsultas que se refieren a un alias en la consulta exterior 226 Ejemplos de HQL from Cat as fatcat where fatcat weight aN select avg cat weight from DomesticCat cat from DomesticCat as cat where cat name some select name nickName from Name as name from Cat as cat where not exists from Cat as mate where mate mate cat from DomesticCat as cat where cat name not in select name nickName from Name as name select cat id select max kit weight from cat kitten kit from Cat as Cat Note que las subconsultas HQL pueden ocurrir s lamente en las cl usulas select o where Note that subqueries can also utilize row value constructor syntax See Secci n 15 18 Sintaxis del constructor de valores por fila for more information 15 14 Ejemplos de HQL Las consultas de Hibernate pueden ser bastante potentes y complejas D
23. Session session2 HibernateUtil getSessionFactory getCurrentSession session2 beginTransaction session2 update aPerson Reattachment of aPerson session2 getTransaction commit 17 Cap tulo 1 Tutorial La llamada a update hace que un objeto separado sea persistente de nuevo enlaz ndolo a una nueva unidad de trabajo as que cualquier modificaci n que le realiz mientras estaba separado se puede guardar en la base de datos Esto incluye cualquier modificaci n adiciones o eliminaciones que le hizo a una colecci n de ese objeto entidad Esto no se utiliza mucho en nuestro ejemplo pero es un concepto importante que puede incorporar en su propia aplicaci n Complete este ejercicio agregando una nueva acci n al m todo main de EventManager y ll mela desde la l nea de comandos Si necesita los identificadores de una persona y de un evento el m todo save los retorna pueda que necesite modificar algunos de los m todos anteriores para retornar ese identificador else if args 0 equals addpersontoevent Long eventld mgr createAndStoreEvent My Event new Date Long personld mgr createAndStorePerson Foo Bar mgr addPersonToEvent personId eventla System out printin Added person personId to event eventld Esto fue un ejemplo de una asociaci n entre dos clases igualmente importantes dos entidades Como se mencion anteriormente hay otras clases y tipos en un mod
24. el cliente y sus rdenes 273 Cap tulo 20 Mejoramiento del Session session session enableFetchProfile customer with orders name matches from mapping Customer customer Customer session get Customer class customerld Actualmente solo se soportan los perfiles de recuperaci n de estilo unido pero se planear soportar estilos adicionales Consulte HHH 3414 http opensource atlassian com projects hibernate browse HHH 3414 para obtener mayores detalles 20 1 8 Utilizaci n de la recuperaci n perezosa de propiedades Hibernate3 soporta la recuperaci n perezosa de propiedades individuales Esta t cnica de optimizaci n tambi n es conocida como grupos de recuperaci n fetch groups Por favor note que ste es principalmente un aspecto de marketing ya que en la pr ctica optimizar las lecturas de filas es mucho m s importante que la optimizaci n de lectura de columnas Sin embargo cargar s lo algunas propiedades de una clase podr a ser til en casos extremos Por ejemplo cuando las tablas heredadas tienen cientos de columnas y el modelo de datos no puede ser mejorado Para habilitar la carga perezosa de propiedades establezca el atributo 1azy en sus mapeos de propiedades lt class name Document gt lt id name id gt lt generator class native gt lt id gt lt property name name not null true length 50 gt lt property name summary not null true length 200 lazy
25. en un futuro cercano 327 328 Referencias POEAA Patrones de la arquitectura de aplicaciones empresariales 0 321 12742 0 por Martin Fowler Copyright O 2003 Pearson Education Inc Addison Wesley Publishing Company JPwH Persistencia de Java con Hibernate Segunda edici n de Hibernate en acci n 1 932394 88 5 htip www manning com bauer2 por Christian Bauer y Gavin King Copyright O 2007 Manning Publications Co Manning Publications Co 329 330
26. inverse end gt lt bag name categories table CATEGORY_ITEM inverse true gt lt key column ITEM_ID gt lt many to many class Category column CATEGORY_ID gt lt bag gt lt class gt Los cambios realizados s lamente al extremo inverso de la asociaci n no son persistidos Esto significa que Hibernate tiene dos representaciones en memoria para cada asociaci n bidireccional un enlace de A a B y otro enlace de B a A Esto es m s f cil de entender si piensa en el modelo de objetos de Java y c mo creamos una relaci n muchos a muchos en Java category getItems add item The category now knows about the relationship item getCategories add category The item now knows about the relationship session persist item The relationship won t be saved session persist category The relationship will be saved El lado no inverso se utiliza para guardar la representaci n en memoria a la base de datos Puede definir una asociaci n bidireccional uno a muchos mapeando una asociaci n uno a muchos a la misma columna o columnas de tabla como una asociaci n muchos a uno y declarando el extremo multivaluado inverse true lt class name Parent gt lt id name id column parent_id gt 121 Cap tulo 6 Mapeos de colecci n lt set name children inverse true gt lt key column parent_id gt lt one to many class Child gt lt set gt lt class gt lt class name
27. kitName addOrder Order asc catName addOrder Order asc kitName List iy Tambi n puede usar Property forName para expresar proyecciones List results session createCriteria Cat class setProjection Property forName name add Property forName color eq Color BLACK List List results session createCriteria Cat class setProjection Projections projectionList add Projections rowCount as catCountByColor 238 Consultas y subconsultas separadas add Property forName weight avg as avgWeight add Property forName weight max as maxWeight Fadd Ie ropenuy orName Mcolon group las color add rder Order desc catCountByColor addOrder Order desc avgWeight odio 16 8 Consultas y subconsultas separadas La clase DetachedCriteria le permite crear una consulta fuera del mbito de una sesi n y luego ejecutarla usando una Session arbitraria DetachedCriteria query DetachedCriteria forClass Cat class add Property forName sex eq F Session session Transaction txn session beginTransaction List results query getExecutableCriteria session setMaxResults 100 list txn commit session close Tambi n puede utilizar una DetachedCriteria para expresar una subconsulta Las instancias de Criterion involucrando subconsultas se pueden obtener por medio de Subqueries O Property Deta
28. lt one to many class ClassName not found ignorelexception 0090 entity name EntityName node element name embed xml true false is O class requerido El nombre de la clase asociada 118 Mapeos de colecci n avanzados 6 not founa opcional por defecto es exception Especifica c mo ser n manejados los identificadores en cach que referencien filas perdidas ignore tratar una fila perdida como una asociaci n nula O entity name opcional El nombre de entidad de la clase asociada como una alternativa para class El elemento lt one to many gt no necesita declarar ninguna columna Ni es necesario especificar el nombre de tab1e en ning n sitio Aviso Si la columna de la clave for nea de una asociaci n lt one to many gt se declara NOT NULL debe declarar el mapeo de lt key gt not null true o utilizar una asociaci n bidireccional con el mapeo de colecci n marcado inverse true Vea la discusi n sobre asociaciones bidireccionales m s adelante en este cap tulo para obtener mayor informaci n El siguiente ejemplo muestra un mapeo de entidades Part por nombre en donde partName es una propiedad persistente de Part Observe el uso de un ndice basado en f rmula lt map name parts cascade al1 gt lt key column productId not null true gt lt map key formula partName gt lt one to many class Part gt lt map gt 6 3 Mapeos de coleccion avanzados 6 3 1 Co
29. private static final class CustomMapInstantiator extends org hibernate tuple DynamicMapInstantitor override the generateMap method to return our custom map protected final Map generateMap return new CustomMap 60 EntityNameResolvers 4 6 EntityNameResolvers La interfaz org hibernate EntityNameResolver es un contrato para resolver el nombre de la entidad de una instancia de entidad dada La interfaz define un solo m todo resolveEntityName el cual se le pasa la instancia entidad y se espera que retorne el nombre de entidad apropriado se permite nulo e indicar a que el resolvedor no sabe c mo resolver el nombre de la entidad de la instancia de entidad dada Generalmente hablando un org hibernate EntityNameResolver ser m s til en el caso de modelos din micos Un ejemplo puede ser el usar interfaces con proxis como su modelo de dominio La suite de prueba de hibernate tiene un ejemplo de este estilo exacto de uso bajo el org hibernate test dynamicentity tuplizer2 Aqu est algo del c digo de ese paquete para su ilustraci n ek A very trivial JDK Proxy InvocationHandler implementation where we proxy an interface as the domain model and simply store persistent state in an internal Map This is an extremely trivial example meant only for illustration af public final class DataProxyHandler implements InvocationHandler private String entityName private HashMap data new HashMap
30. Consultas escalares La consulta SQL m s b sica es para obtener a una lista de escalares valores sess createSQLQuery SELECT FROM CATS list sess createSQLQuery SELECT ID NAME BIRTHDATE FROM CATS list Estas retornar n una lista de objetos arrays Object con valores escalares para cada columna en la tabla CATS Hibernate utilizar ResultSetMetadata para deducir el orden real y los tipos de los valores escalares retornados Para evitar los gastos generales de la utilizaci n de Result SetMetadata O simplemente para ser m s expl cito en lo que se devuelve se puede utilizar addScalar sess createSQlQuery SELECT FROM CATS addScalar ID Hibernate LONG addScalar NAME Hibernate STRING addScalar BIRTHDATE Hibernate DATE Se especifica esta consulta e la cadena de consulta SQL e las columnas y tipos que se devuelven Esto retornar objetos arrays pero no utilizar ResultSetMetdata sino que obtendr expl citamente las columnas de IDENTIFICACION NOMBRE y FECHA DE NACIMIENTO 241 Cap tulo 17 SQL Nativo respectivamente como Larga Cadena y Corta del grupo de resultados subyacente Esto tambi n significa que s lamente estas tres columnas ser n retornadass aunque la consulta este utilizando y pueda devolver m s de las tres columnas enumeradas Es posible dejar afuera la informaci n de tipo para todos o algunos de los escalares sess createSQLQuery SELECT FROM CA
31. Este mapeo no est concebido para la utilizaci n con entidades que tienen claves principales naturales mutable opcional por defecto es false Por defecto se asume que las propiedades de identificadores naturales son inmutables constantes 89 Cap tulo 5 Mapeo O R B sico 5 1 15 Componente y componente din mico El elemento lt component gt mapea propiedades de un objeto hijo a columnas de la tabla de la clase padre Los componentes pueden a su vez declarar sus propias propiedades componentes o colecciones Vea a continuaci n los componentes lt component name propertyName class className insert true false update true false access field property ClassName lazy true false optimistic lock truelfalse 0000000 unique true false node element name lt property gt lt many to one Y lt component gt Oo 000 9090 name El nombre de la propiedad class opcional por defecto es el tipo de la propiedad determinado por reflecci n El nombre de la clase del componente hijo insert Las columnas mapeadas aparacen en INSERTs SQL update Las columnas mapeadas aparacen en UPDATES SQL access opcional por defecto es property La estrategia que Hibernate utiliza para acceder al valor de la propiedad lazy opcional por defecto es false Especifica que este componente debe ser recuperado perezosamente cuando se acceda a la variabl
32. Esto es til cuando hay necesidad de ordenar o limitar en la base de datos antes de retornar grupos de resultados complejos grandes y elimina muchas instancias en donde se tendr an que realizar m ltiples consultas y unir en memoria los resultados por medio de java Sin esta funcionalidad primero todos los cats sin una pareja tendr an que cargarse en una petici n Una segunda petici n tendr a que recuperar los cats gatos con las parejas cuyos nombres empiecen por good ordenado de acuerdo a la edad de las parejas Tercero en memoria ser a necesario unir las listas manualmente 16 5 Recuperaci n din mica de asociaciones Puede especificar la sem ntica de recuperaci n de asociaciones en tiempo de ejecuci n usando setFetchMode List cats sess createCriteria Cat class add Restrictions like name Fritz3 setFetchMode mate FetchMode EAGER setFetchMode kittens FetchMode EAGER Ls This query will fetch both mate and kittens by outer join See Secci n 20 1 Estrategias de recuperaci n for more information 16 6 Consultas ejemplo La clase org hibernate criterion Example le permite construir un criterio de consulta a partir de una instancia dada Cat cat new Cat cat setSex F cat setColor Color BLACK List results session createCriteria Cat class add Example create cat alise e Las propiedades de versi n los identificadores y las asociaciones se ignoran Por
33. La siguiente tabla resume estos atributos opcionales Tabla 21 1 Resumen Atributo Valores Interpretaci n length n mero longitud de columna precisi n decimal precision n mero precisi n decimal de columna scale n mero escala decimal de columna not null true false especifica que la columna debe ser sin nulos unique true false especifica que la columna debe tener una restricci n de unicidad index index_name especifica el nombre de un ndice multicolumna unique key unique_key_name especifica el nombre de una restricci n de unicidad multicolumna foreign key foreign_key_name especifica el nombre de la restricci n de clave for nea generada por una asociaci n para un elemento de mapeo lt one to one gt lt many to one gt lt key gt O lt many to many gt Observe que SchemaExport no considerar los lados inverse true sql type default check SQL column type expresi n SQL expresi n SQL sobrescribe el tipo de columna por defecto s lamente el atributo del elemento lt column gt especifica un valor predeterminado para la columna crea una restricci n de comprobaci n SQL en columna o tabla El elemento lt comment gt le permite especificar un comentario para el esquema generado lt class name Customer table CurCust gt lt comment gt Current customers only lt comment gt lt class gt lt property name balance gt lt colu
34. SessionFactory getCurrentSession Inicialmente este asumi la utilizaci n de las transacciones JTA en donde la transacci n sta definia tanto el contexto como el campo de acci n de una sesi n actual Dada la madurez de n merosas implementaciones JTA TransactionManager aut nomas existentes la mayor a si no es que todas las aplicaciones deber an utilizar la administraci n de transacciones JTA en el caso de que se deplieguen o no en un contenedor J2EE Con base en esto las sesiones contextuales basadas en sta es todo lo que usted necesita utilizar Sin embargo desde la versi n 3 1 el procesamiento detr s de SessionFactory getCurrentSession ahora es conectable Para ese fin se ha a adido una nueva interfaz de extensi n org hibernate context CurrentSessionContext y un nuevo par metro de configuraci n hibernate current_session_context_class para permitir la conexi n del campo de acci n y el contexto de definici n de las sesiones actuales Refi rase a los Javadocs para la interfaz org hibernate context CurrentSessionContext para poder ver una discusi n detallada de su contrato Define un m todo nico currentSession por medio del cual la implementaci n es responsable de rastrear la sesi n contextual actual Tal como viene empacada Hibernate incluye tres implementaciones de esta interfaz e org hibernate context JTASessionContext una transacci n JTA rastrea y asume las sesiones actuales Aqu el pro
35. Usualmente las aplicaciones de Hibernate necesitaban refrescar los objetos que contenian cualquier propiedad para la cual la base de datos generar valores Sin embargo el marcar propiedades como generadas deja que la aplicaci n delegue esta responsabilidad a Hibernate Cuando Hibernate emite un INSERT or UPDATE SQL para una entidad la cual ha definido propiedades generadas inmediatamente emite un select para recuperar los valores generados Las propiedades marcadas como generadas tienen que ser adem s no insertables y no actualizables S lamente las versiones sellos de fecha y propiedades simples se pueden marcar como generadas never por defecto el valor dado de la propiedad no es generado dentro de la base de datos 107 Cap tulo 5 Mapeo O R B sico insert el valor dado de la propiedad es generado en insert pero no es regenerado en las actualizaciones posteriores Las propiedades como fecha creada created date se encuentran dentro de esta categor a Aunque las propiedades versi n y sello de fecha se pueden marcar como generadas esta opci n no se encuentra disponible always el valor de la propiedad es generado tanto en insert como en update 5 7 Expresiones de lectura y escritura de columnas Hibernate allows you to customize the SQL it uses to read and write the values of columns mapped to simple properties For example if your database provides a set of data encryption functions you can invoke them for in
36. commit return result Here we are using a Hibernate Query Language HQL query to load all existing Event objects from the database Hibernate will generate the appropriate SQL send it to the database and populate Event objects with the data You can create more complex queries with HQL See Capitulo 15 HQL El lenguaje de consulta de Hibernate for more information Ahora podemos llamar nuestra nueva funcionalidad de nuevo usando el plugin de ejecuci n Maven mvn exec java Dexec mainClass org hibernate tutorial EventManager Dexec args list 1 2 Part 2 Mapeo de asociaciones Hasta ahora hemos mapeado una clase de entidad persistente a una tabla aislada Vamos a construir sobre esto y agregaremos algunas asociaciones de clase Vamos a agregar personas a la aplicaci n y vamos a almacenar una lista de eventos en las que participan 1 2 1 Mapeo de la clase Person El primer corte de la clase Person se ve as package org hibernate tutorial domain public class Person private Long id private int age private String firstname private String lastname public Person Accessor methods for all properties private setter for id Guarde esto en un archivo llamado src main java org hibernate tutorial domain Person java Luego cree el nuevo archivo de mapeo como src main resources org hibernate tutorial domain Person hbm xml 14 Una asociaci n unidireccional basada en Set
37. en una instancia separada de esa clase Si necesita compartir instancias de oyentes entre tipos de oyentes debe usar el enfoque de registraci n program tica Por qu implementar una interfaz y definir el tipo espec fico durante la configuraci n Una implementaci n de escucha podr a implementar m ltiples interfaces de escucha de eventos Teniendo el tipo definido adicionalmente durante la registraci n hace m s f cil activar o desactivar escuchas personalizados durante la configuraci n 13 3 Seguridad declarativa de Hibernate Usualmente la seguridad declarativa en aplicaciones Hibernate se administra en una capa de fachada de sesi n Hibernate3 permite que ciertas acciones se permitan por medio de JACC y las autoriza por medio de JAAS Esta es una funcionalidad opcional constru da encima de la arquitectura de eventos Primero tiene que configurar los oyentes de eventos apropiados para habilitar la utilizaci n de autorizaci n JAAS lt listener type pre delete class org hibernate secure JACCPreDeleteEventlistener gt lt listener type pre update class org hibernate secure JACCPreUpdateEventListener gt lt listener type pre insert class org hibernate secure JACCPreInsertEventListener gt 204 Seguridad declarativa de Hibernate lt listener type pre load class org hibernate secure JACCPreLoadEventListener gt Note que lt listener type class gt eS la abreviatura para lt event t
38. estaban al comienzo de la transacci n Esto significa que el estado de la base de datos y los objetos empreariales quedan fuera de sincron a Usualmente esto no es un problema pues las excepciones no son recuperables y tendr que volver a comenzar despu s de deshacer de todos modos e The Session caches every object that is in a persistent state watched and checked for dirty state by Hibernate If you keep it open for a long time or simply load too much data it will grow endlessly until you get an OutOfMemoryException One solution is to call clear and evict to manage the Session cache but you should consider a Stored Procedure if you need mass data operations Some solutions are shown in Cap tulo 14 Procesamiento por lotes Keeping a Session open for the duration of a user session also means a higher probability of stale data 12 2 Demarcaci n de la transacci n de la base de datos Los l mites de las transacciones de la base de datos o el sistema son siempre necesarios Ninguna comunicaci n con la base de datos puede darse fuera de una transacci n de la base de datos 189 Cap tulo 12 Transacciones y esto parece confundir a muchos desarrolladores acostumbrados al modo auto commit Siempre use l mites de transacci n claros incluso para las operaciones de s lo lectura Dependiendo del nivel de aislamiento y las capacidades de la base de datos esto podr a requerirse o no pero no hay inconvenientes si siem
39. eventTitle length 50 gt lt br gt out println Date e g 24 12 2009 lt input name eventDate length 10 gt lt br gt out println lt input type submit name action value store gt out printin lt form e El m todo listEvents utiliza Hibernate Session vinculado al hilo actual para ejecutar una petici n private void listEvents PrintWriter out SimpleDateFormat dateFormatter List result HibernateUtil getSessionFactory getCurrentSession createCriteria Event class list if result size A cut printin lt h2 gt Events in database lt h2 207 out println lt table border 1 g out printin lt txr A cut printin Asta gt Event title lt th aiy cut printlin lt th 24 Despliegue y prueba gt Event date lt th Ea Quire Palin Sea aay Iterator it result iterator while it hasNext Event event Event it next Out printin lt tr aay Out printin lt td gt event getTitle lt td aay Cut prine lm lt td gt dateFormatter format event getDate lt td SS e nia e era D out println lt table Finalmente la acci n store se despacha al m todo createAndStoreEvent el cual tambi n utiliza la Session del hilo actual protected void createAndStoreEvent String title Date theDate Event theEvent new Event theEvent setTitle title theEvent setDate theDate HibernateUtil getSessionF
40. gt lt one to many class Child gt lt set gt Sin embargo esta no es la soluci n recomendada El caso subyacente de este comportamiento es que el enlace la clave for nea parent_id de p a c no se considera parte del estado del objeto child y por lo tanto no se crea en el INSERT De modo que la soluci n es hacer que el enlace sea parte del mapeo del child lt many to one name parent column parent_id not null true gt Tambi n necesita agregar la propiedad parent a la clase child Ahora que la entidad child est administrando el estado del enlace le decimos a la colecci n que no actualice el enlace Usamos el atributo inverse para hacer esto lt set name children inverse true gt lt key column parent_id gt lt one to many class Child gt 296 Ciclo de vida en cascada lt set El siguiente c digo se podr a utilizar para agregar un nuevo Child Parent p Parent session load Parent class pid Child c pew Child c setParent p p getChildren add c session save c session flush S lo se emitir a un INSERT de SQL Tambi n podr a crear un m todo addchild de Parent public void adachild Child c c setParent this children add c El c digo para agregar un child se ve as Parent p Parent session load Parent class pid Child c new Child p adathildlel session save c session flush 22 3 Ciclo de vida en cas
41. insert true false property ref propertyNameFromAssociatedClass access field property ClassName unique true false not null true false optimistic lock truelfalse lazy proxy no proxy false not found ignorelexception entity name EntityName 0500600909006000000000068 formula arbitrary SOL expression node element name fattribute name element fattribute embed xml true false index index_name unique_key unique_key_id foreign key foreign_key_name name El nombre de la propiedad column opcional El nombre de la columna de la clave foranea Esto tambi n se puede especificar por medio de uno o varios elementos anidados lt column gt class opcional por defecto es el tipo de la propiedad determinado por reflecci n El nombre de la clase asociada cascade opcional especifica qu operaciones deben ir en cascada desde el objeto padre hasta el objeto asociado fetch opcional por defecto es select Escoge entre la recuperaci n de uni n exterior outer join o la recuperaci n por selecci n secuencial update insert opcional por defecto es true especifica que las columnas mapeadas deben ser inclu das en las declaraciones SQL UPDATE y o INSERT El establecer ambas como false permite una asociaci n puramente derivada cuyo valor es inicializado desde alguna otra propiedad que mapea a la misma columna o columnas por un disparador o por otra aplicaci n property ref opcional El nombr
42. long column cat_id gt lt generator class hilo gt lt param name table gt hi_value lt param gt lt param name column gt next_value lt param gt lt param name max_lo gt 100 lt param gt 74 lt generator gt iat lt id name id type long column cat_id gt lt generator class seghilo gt lt param name sequence gt hi_value lt param gt lt param name max_lo gt 100 lt param gt lt generator gt lt fid gt Desafortunadamente no puede utilizar hilo cuando le provea su propia connection a Hibernate Cuando Hibernate esta utilizando una fuente de datos del servidor de aplicaciones para obtener conexiones alistadas con JTA usted tiene que configurar el hibernate transaction manager_lookup_class 5 1 4 3 Algoritmo UUID El UUID contiene la direcci n IP el tiempo de iniciaci n de la MVJ con una precisi n de un cuarto de segundo el tiempo de sistema y un valor de contador nico en la MVJ No es posible obtener una direcci n MAC o una direcci n de memoria desde el c digo Java as que esto es la mejor opci n sin tener que utilizar JNI 5 1 4 4 Columnas de identidad y secuencias Para las bases de datos que soportan columnas de identidad DB2 MySQL Sybase MS SQL puede utilizar generaci n de claves identity Para las bases de datos que soportan las secuencias DB2 Oracle PostgreSQL Interbase McKoi SAP DB puede utilizar la generaci n de claves del estilo s
43. lt hibernate mapping gt catalog opcional Sobrescribe el nombre del cat logo especificado por el elemento ra z lt hibernate mapping gt 95 Cap tulo 5 Mapeo O R B sico o Por fetch opcional por defecto es join Si se establece como join por defecto Hibernate utilizar una uni n interior inner join para recuperar un lt join gt definido por una clase o sus superclases Utilizar una uni n externa outer join para un lt join gt definido por una subclase Si se establece como select entonces Hibernate utilizar una selecci n secuencial para un lt join gt definido en una subclase Esto se publicar s lamente si una fila representa una instancia de la subclase Las uniones interiores todav a ser n utilizadas para recuperar un lt join gt definido por la clase y sus superclases inverse opcional por defecto es false De activarse Hibernate no tratar de insertar o actualizar las propiedades definidas por esta uni n optional opcional por defecto es false De activarse Hibernate insertar una fila s lo si las propiedades definidas por esta uni n son no nulas Siempre utilizar una uni n externa para recuperar las propiedades ejemplo la informaci n domiciliaria de una persona se puede mapear a una tabla separada preservando a la vez la sem ntica de tipo de valor para todas las propiedades lt cla Con Rec ss name Person table PERSON gt lt id name id column PER
44. lt return property gt en combinaci n junto con la sintaxis para inyecci n Esto le permite a los usuarios escoger c mo quieren referirse a la columna y a las propiedades Si su mapeo tiene un discriminador usted tiene que utilizar lt return discriminator gt para especificar la columna discriminadora 17 2 2 Utilizaci n de procedimientos para consultas Hibernate 3 brinda soporte para consultas por medio de procedimientos almacenados y funciones La mayor a de la siguiente documentaci n es igual para ambos La funci n procedimiento almacenado tiene que retornar un grupo de resultados como el primer par metro de salida para poder trabajar con Hibernate A continuaci n hay un ejemplo de tal funci n almacenada en Oracle 9 y posteriores CREATE OR REPLACE FUNCTION selectAllEmployments RETURN SYS_REFCURSOR AS sticursor SYS OREF CURSOR BEGIN OPEN st _ cursor FOR SELECT EMPLOYEE EMPLOYER STARTDATE ENDDATE REGIONCODE EID VALUE CURRENCY FROM EMPLOYMENT RETURN st CUrsar END Para utilizar esta consulta en Hibernate u d necesita mapearla por medio de una consulta nombrada lt sql query name selectAllEmployees_SP callable true gt lt return alias emp class Employment gt lt return property name employee column EMPLOYEE gt lt return property name employer column EMPLOYER gt lt return property name startDate column STARTDATE gt lt return property name endDate column ENDDATE gt lt r
45. n de base de datos abierta y un cursor para esta funcionalidad Utilice setMaxResult setFirstResult si necesita la funcionalidad de paginaci n fuera de l nea 10 4 1 7 Externalizaci n de consultas con nombre Tambi n puede definir consultas con nombre en el documento de mapeo Recuerde utilizar una secci n CDATA si su consulta contiene caracteres que puedan ser interpretados como etiquetado lt query name ByNameAndMaximumWeight gt lt CDATA from eg DomesticCat as cat where cat name and cat weight gt lt query Ns o El ligado de par metros y de ejecuci n se realiza program ticamente Query q sess getNamedQuery ByNameAndMaximumWeight q setString 0 name q setInt 1 minWeight List cats ae sico El c digo real del programa es independiente del lenguaje de consulta utilizado Tambi n puede definir consultas SQL nativas en metadatos o migrar consultas existentes a Hibernate coloc ndolas en archivos de mapeo Observe adem s que una declaraci n de consulta dentro de un elemento lt hibernate mapping gt necesita de un nombre nico global para la consulta mientras que una declaraci n de consulta dentro de un elemento lt class gt se hace nica autom ticamente al agregar el nombre completamente calificado de la clase Por ejemplo eg Cat ByNameAndMaximumWeight 10 4 2 Filtraci n de colecciones Un filtro de colecci n es un tipo especial de consulta que puede ser aplicado a una
46. neas que referencian las filas que hacen falta ignore tratar una fila perdida como una asociaci n nula entity name opcional El nombre de entidad de la clase asociada formula opcional una expresi n SQL que define el valor para una clave for nea computada Setting a value of the cascade attribute to any meaningful value other than none will propagate certain operations to the associated object The meaningful values are divided into three categories First basic operations which include persist merge delete save update evict replicate lock and refresh second special values delete orphan and third all comma separated combinations of operation names cascade persist merge evict Or cascade all delete orphan See Secci n 10 11 Persistencia transitiva for a full explanation Note that single valued many to one and one to one associations do not support orphan delete Este es un ejemplo de una declaraci n t pica muchos a uno lt many to one name product class Product column PRODUCT_ID gt El atributo property ref se debe utilizar s lamente para el mapeo de datos heredados donde una clave for nea referencia una clave nica de la tabla asociada distinta de la clave principal Este es un modelo relacional complicado y confuso Por ejemplo si la clase Product tuviera un n mero nico serial que no es la clave principal el atributo unique controla la generaci n de DDL de Hibernate con
47. oooonoocciccnnnccnnnnccccancnncnnc nono nnnn nr nn cnn cnn cnn 291 2151 3 Propiedades miii tas 291 211 4 Utilizaci n de Antariiiiddaidas 292 21 1 5 Actualizaciones incrementales de esquema occccconcccccnnncccccnnnnccncnnnnccnnns 292 21 1 6 Utilizaci n de Ant para actualizaciones incrementales de esquema 293 21 1 7 Validaci n de Esquema 0oooccccccccccccnocnccccnncnnnnnnnanancnnncnnonnnnananccnncannnnnnnns 293 21 1 8 Utilizaci n de Ant para la validaci n de esquema 0ooooooccccccccincnnnocncnnnnnos 294 22 Ejemplo Padre Hijo eesis eta 295 22 1 Nota sobre las COleCciones oooooocccoccconncccononcnncnconannnnnncnnnnnnnnnncnnnncnnnnnonnncnnnannns 295 22 2 Uno a muchos bidireccional ooocccccocnnncccoconnnnnononnnnnnnonnnnnncnnnnnnnronnnnnnninnnnnnnos 295 22 3 Ciclo de vida en Cascada oooccccconnccccnononnncnnnononononnnnnnnnannnnnnnnnnnnnnnannnnnnnannnnnnnns 297 22 4 Cascadas y unsaved value 0 eee ce cece ee eenee cece eeee tees aaeaeeeeeeeeeeeeaaaaaaeeeeeeeeeaeaaaaaes 299 22 5 CONCIUSI N vrs died iniciada 299 23 Ejemplo Aplicaci n de Weblog cooocococccococcconocononononononononononononononononinininoos 301 23 1 Clases Persistentes oooocooonncccccooococcnononnnnnnonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnncnnnns 301 23 2 Mapeos de Hibernate o oooooonccccconnnonoconnnnncnonnnnnnnnnnnnnnnnnn nn rn rn r rn rra 302 23 3 C digo Hibernate sissien actas lalala aaa 304 24 Ejemplo MapeO
48. pero es til para la resoluci n de problemas 46 Implementaci n de una NamingStrategy Al desarrollar aplicaciones con Hibernate casi siempre debe trabajar con debug habilitado para la categoria org hibernate SQL O alternativamente la propiedad hibernate show_sql habilitada 3 6 Implementaci n de Una namingstrategy La interfaz org hibernate cfg NamingStrategy le permite especificar un est ndar de nombrado para objetos de la base de datos y los elementos del esquema Puede proveer reglas para generar autom ticamente identificadores de la base de datos a partir de identificadores JDBC o para procesar nombres l gicos de columnas y tablas dadas en el archivo de mapeo en nombres f sicos de columnas y tablas Esta funcionalidad ayuda a reducir la verborragia del documento de mapeo eliminando ruidos repetitivos por ejemplo prefijos TBL_ Hibernate utiliza una estrategia por defecto bastante m nima Puede especificar una estrategia diferente llamando a Configuration setNamingStrategy antes de agregar los mapeos SessionFactory sf new Configuration setNamingStrategy ImprovedNamingStrategy INSTANCE addFile Item hbm xml addFile Bid hbm xml buildSessionFactory org hibernate cfg ImprovedNamingStrategy es una estrategia incorporada que puede ser un punto de partida til para algunas aplicaciones 3 7 Archivo de configuraci n XML Un enfoque alternativo de configuraci n es especifi
49. 3 4 Propiedades de JDBC y Conexiones de Hibernate Nombre de la propiedad hibernate jdbc fetch_size hibernate jdbc batch_size hibernate jdbc batch_versioned_data Prop sito Un valor distinto de cero que determina el tama o de recuperaci n de JDBC llama a Statement setFetchSize Un valor distinto de cero habilita que Hibernate utilice las actualizaciones en lote de JDBC2 ej valores recomendados entre 5 y 30 Set this property to true if your JDBC driver returns correct row counts from executeBatch lt is usually safe to turn this 38 Par metros de configuraci n opcionales Nombre de la propiedad Prop sito option on Hibernate will then use batched DML for automatically versioned data Defaults to false e g true false hibernate jdbc factory_class hibernate jdoc use_scrollable_resultset hibernate jdoc use_streams_for_binary hibernate jdoc use_get_generated_keys hibernate connection provider_class Selecciona un org hibernate jdbc Batcher personalizado La mayoria de las aplicaciones no necesitar n esta propiedad de configuraci n eg classname of BatcherFactory Habilita a Hibernate para utilizar los grupos de resultados deslizables de JDBC2 Esta propiedad s lamente es necesaria cuando se utilizan conexiones JDBC provistas por el usuario En el caso contrario Hibernate utiliza los metadatos de conexi n e g true false Utiliza flujos streams al es
50. 5 4 Borrado de un s lo tiro Borrar los elementos de una colecci n uno por uno a veces puede ser extremadamente ineficiente Hibernate sabe que no debe hacer eso en el caso de una colecci n nueva vac a si ha llamado a list clear por ejemplo En este caso Hibernate publicar un s lo DELETE Suponga que agrega un solo elemento a una colecci n de tama o veinte y luego quitamos dos elementos Hibernate publicar una declaraci n INSERT y dos declaraciones DELETE a menos que la colecci n sea un bag Esto ciertamente es deseable Sin embargo sup nga que quitamos dieciocho elementos dejando dos y luego a adimos tres elementos nuevos Hay dos formas posibles de proceder e borrar dieciocho filas una a una y luego insertar tres filas quitar toda la colecci n en un s lo DELETE de SQL e insertar todos los cinco elementos actuales uno por uno Hibernate no sabe que la segunda opci n es probablemente la m s r pida Probablemente no ser a deseable que Hibernate fuese tan intuitivo ya que tal comportamiento podr a confundir a disparadores de la base de datos etc Afortunadamente puede forzar este comportamiento por ejemplo la segunda estrategia en cualquier momento descartando por ejemplo desreferenciando la colecci n original y retornando una colecci n nuevamente instanciada con todos los elementos actuales 283 Cap tulo 20 Mejoramiento del El borrado de un s lo tiro
51. Address addressId bigint not null primary key 7 3 2 Many to one Una asociaci n unidireccional muchos a uno en una tabla de uni n es com n cuando la asociaci n es opcional Por ejemplo lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt join table PersonAddress optional true gt lt key column personId unique true gt lt many to one name address column addressId not null true gt lt join gt lt class gt lt class name Address gt lt id name id column addressld gt lt generator class native gt lt a gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personld bigint not null primary key addressId bigint not null create table Address addressId bigint not null primary key 132 Uno a uno 7 3 3 Uno a uno Una asociaci n unidireccional uno a uno en una tabla de uni n es extremadamente inusual pero es posible lt class name Person gt lt id name id column personld gt lt generator class native gt lt a gt lt join table PersonAddress optional true gt lt key column personld unique true gt lt many to one name address column addressId not null true unique true gt lt JO in gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt l
52. Child gt lt id name id column child_id gt lt many to one name parent class Parent column parent_id not null true gt lt class gt Mapear un extremo de una asociaci n con inverse true no afecta la operaci n de cascadas ay que stos son conceptos ortogonales 6 3 3 Asociaciones bidireccionales con colecciones indexadas Requiere especial atenci n una asociaci n bidireccional en donde un extremo est representado como una lt list gt O lt map gt Si hay una propiedad de la clase hija que mapee a la columna indice puede utilizar inverse true en el mapeo de la colecci n lt class name Parent gt lt id name id column parent_id gt lt map name children inverse true gt lt key column parent_id gt lt map key column name type string gt lt one to many class Child gt lt map gt lt class gt lt class name Child gt lt id name id column child_id gt lt property name name not null true gt lt many to one name parent class Parent column parent_id not null true gt lt class gt Si no existe tal propiedad en la clase hija no podemos considerar la asociaci n como verdaderamente bidireccional Es decir hay informaci n en un extremo de la asociaci n que no est disponible en el otro extremo En este caso no puede mapear la colecci n con inverse true En cambio puede usar el siguiente mapeo 122 Asociaciones terna
53. JDBC subyacente StatelessSession session sessionFactory openStatelessSession Transaction tx session beginTransaction j ScrollableResults customers session getNamedQuery GetCustomers scroll ScrollMode FORWARD_ONLY while customers next Customer customer Customer customers get 0 customer updateStuff session update customer tx commit session close En este c digo de ejemplo las instancias customer retornadas por la petici n se separan inmediatamente Nunca se asocian con ningun contexto de persistencia Las operaciones insert update Y delete definidas por la interfaz StatelessSession son consideradas como operaciones directas a nivel de filas de la base de datos Esto resulta en una ejecuci n inmediata de Un INSERT UPDATE SQL O DELETE respectivamente Tienen una sem ntica diferente a la de las operaciones save saveOrUpdate Y delete definidas por la interfaz Session H 14 4 Operaciones de estilo DML Como se discuti anteriormente el mapeo objeto relacional transparente se refiere a la administraci n del estado de objetos El estado del objeto est disponible en la memoria Esto significa que el manipular datos directamente en la base de datos utilizando DML del ingl s Data Manipulation Language las declaraciones INSERT UPDATE DELETE no afectar n el estado en la memoria Sin embargo Hibernate brinda m todos para la eje
54. Java puede que no tenga lo que usted espera o necesita Este es el caso de la propiedad date Hibernate no puede saber is la propiedad la cual es de java util Date debe mapear a una columna date timestamp O time de SQL Por medio de un convertidor timestamp mapeamos la propiedad y mantenemos la informaci n completa sobre la hora y fecha Sugerencia Hibernate realiza esta determinaci n de tipo de mapeo usando reflection cuando se procesan los archivos de mapeo Esto puede tomar tiempo y recursos as que el rendimiento al arrancar es importante entonces debe considerar el definir expl citamente el tipo a usar Guarde este archivo de mapeo como src main resources org hibernate tutorial domain Event hbm xml 1 1 4 Configuracion de Hibernate En este momento debe tener la clase persistente y su archivo de mapeo Ahora debe configurar Hibernate Primero vamos a configurar HSQLDB para que ejecute en modo de servidor O Vamos a utilizar el plugin de ejecuci n Maven para lanzar el servidor HSQLDB ejecutando mvn exec java Dexec mainClass org hsqldb Server Dexec args database 0 file target data tutorial Lo ver iniciando y vinculandose a un enchufe TCP IP all es donde nuestra aplicaci n se conectar m s adelante Si quiere dar inicio con una base de datos fresca durante este tutorial apague HSQLDB borre todos los archivos en el directorio target data e inicie HSQLDB de nuevo Hibernate se conectar a l
55. La columna discriminidora contiene valores de marca que le dicen a la capa de persistencia qu subclase instanciar para una fila en particular Se puede utilizar un conjunto restringido de tipos string character integer byte short boolean yes_no true_false lt discriminator column discriminator_column type discriminator_type O force true false insert true false La formula arbitrary sql expression gt column opcional por defecto es class el nombre de la columna discriminadora type opcional por defecto es string un nombre que indica el tipo Hibernate force opcional por defecto es false fuerza a Hibernate para especificar los valores discriminadores permitidos incluso cuando se recuperan todas las instancias de la clase ra z insert opcional por defecto es true establecido como false si su columna discriminadora tambi n es parte de un identificador mapeado compuesto Lle dice a Hibernate que no incluya la columna en los SQLs INSERT formula opcional una expresi n SQL arbitraria que se ejecuta cuando se tenga que evaluar un tipo Permite la discriminaci n con base en el contenido Los valores reales de la columna discriminadora est n especificados por el atributo discriminator value de los elementos lt class gt Y lt subclass gt El atributo force es s lamente til si la tabla contiene filas con valores discriminadores extra que no est n mapeados a una
56. Luego creamos una clase que representa el evento que queremos almacenar en la base de datos es una clase JavaBean simple con algunas propiedades package org hibernate tutorial domain import java util Date public class Event private Long id private String title private Date date public Event public Long getId return id private void setId Long id this d id public Date getDate return date Cap tulo 1 Tutorial public void setDate Date date this date date public String getTitle return title public void setTitle String title this title title Esta clase utiliza convenciones de nombrado est ndares de JavaBean para los m todos de propiedades getter y setter as como tambi n visibilidad privada para los campos Se recomienda este dise o pero no se exige Hibernate tambi n puede acceder a los campos directamente los m todos de acceso benefician la robustez de la refactorizaci n La propiedad id tiene un valor identificador nico para un evento en particular Todas las clases de entidad persistentes necesitar n tal propiedad identificadora si queremos utilizar el grupo completo de funcionalidades de Hibernate tambi n algunas clases dependientes menos importantes De hecho la mayor a de las aplicaciones en especial las aplicaciones web necesitan distinguir los objetos por identificador as que usted debe tomar esto como una funcionalidad m s que una limit
57. Para metro iia 246 17 2 Consultas SQL Nombradas ooccccccccococononcconcnnconononnnncnnnnnnn a iaaa 246 17 2 1 Utilizaci n de la propiedad return para especificar expl citamente los nombres de columnas allaS occcooooncccccnoncccnonnnnccnnnnnnccnononncnnnnnnncnnnnnnncnnnnnancnnns 248 17 2 2 Utilizaci n de procedimientos para consultas ooocnocnnnconoccccnncnccnnnnnncnnnnn 249 17 3 Personalice SQL para crear actualizar y borrar ooononnnoconncccinnnnconnnonncncnnncnnnnnns 250 17 4 Personalice SQL para cargar c oocooccccccncoccnnnnonnnccnnnoncnnnnnnnncrnnnnnnnnnnanancrnnnnnnnnnnnns 252 18 Filtra i n de datos ionlae eaaa aaa a A Aa a a D OK aAa AREE 255 18 1 FilttOS Ge IDG Male irc a ia 255 19 Mapeo XAML cc iiococooiicciiccon cian cir e CUA Ae dd ete nee 259 19 1 Trabajo con datos XML oooccccncocococccocccnnoncnnnnoncnncnnnononnnnnanccancnnnnnnnananccnnnnnnnnns 259 19 1 1 Especificaci n de los mapeos de XML y de clase en conjunto 259 19 1 2 Especificaci n de s lo un mapeo XML cceeeeeeeeeeeeeeeeeeeeeeeaaeaeenees 260 19 2 Mapeo de metadatos XML oooooccccconcccconnnoccnonnnnconnnnnarcnnnnnnrrnonnnncrnnnnnncrnnn nan 260 19 3 Manipulaci n de datos XML cceceeeeeeeeeeeeeeeeeeeeeeeeeaaeaeeeeeeeeeeeeaaaaeeneeeeeeees 262 20 Mejoramiento del rendimiento o oooccccnnnnccccnonccnccnononononononn nono nnnn cnn nn nnn cn nnnnannnnns 265 20 1 Estrategias de recuperaci n
58. SessionFactory en JNDI Puede hacer esto ya sea en un bloque inicializador static como aquel en HibernateUtil o bien puede desplegar Hibernate como un servicio administrado Hibernate se distribuye con org hibernate jmx HibernateService para desplegar en un servidor de aplicaciones con capacidades JMX como JBoss AS El despliegue y la configurac n reales son espec ficos del vendedor He aqu un ejemplo de jboss service xml para JBoss 4 0 x lt xml version 1 0 gt SSeS lt mbean code org hibernate jmx HibernateService name jboss jca service HibernateFactory name HibernateFactory gt gla nespllecel Seas gt lt depends gt jboss jca service RARDeployer lt depends gt lt depends 51 Cap tulo 3 Configuraci n gt jboss jca service LocalTxCM name HsqlDS lt depends gt lt Bind the Hibernate service to JNDI gt lt attribute name JndiName gt java hibernate SessionFactory lt attribute gt lt Dataso rce settings gt lt attribute name Datasource gt java HsqlDS lt attribute gt lt attribute name Dialect gt org hibernate dialect HSQLDialect lt attribute gt lt i Transaction integration gt lt attribute name TransactionStrategy gt org hibernate transaction JTATransactionFactory lt attribute gt lt attribute name TransactionManagerLookupStrategy gt org hibernate transaction JBossTransactionManagerL lt attribute name FlushBeforeCompletionEnab
59. SwarmCache org hibernate cache SwarmCacheProwvBlder s cl ster ip invalidaci n multicast en cl ster JBoss org hibernate cache TreeCacheProvieler si si requiere Cache 1 x cl ster ip replicaci n sincronizaci n multicast de reloj transaccional JBoss org hibernate cache jbc JBossCache gionFactosl si requiere Cache 2 cl ster ip replicaci n sincronizaci n multicast o de reloj transaccional invalidaci n 20 2 1 Mapeos de cach El elemento lt cache gt de un mapeo de clase o colecci n tiene la siguiente forma lt cache usage transactional read write nonstrict read write read only region RegionName 0090 include all non lazy gt O usage especifica la estrategia de cach transactional read write nonstrict read write O read only 6 region opcional por defecto es el nombre del rol de la clase o colecci n especifica el nombre de la regi n de cach de segundo nivel include opcional por defecto es all non lazy especifica que las propiedades de la entidad mapeadas con lazy true no se pueden poner en cach cuando se habilita la recuperaci n perezoza a nivel de atributos Opcionalmente puede especificar los elementos lt class cache gt Y lt collection cache gt en hibernate cfg xml El atributo usage especifica una estrategia de concurrencia al cach 20 2 2 Estrategia s lo lectura Si su aplicaci n necesita leer pero no modificar las instanci
60. User u User s createQuery from User u where u name userName setString userName userName uniqueResult Map permissions u getPermissions j tx commit s close Integer accessLevel Integer permissions get accounts Error Ya que la colecci n de permisos no fue inicializada cuando se cerr la Session la colecci n no ser capaz de cargar su estado Hibernate no soporta la inicializaci n perezosa de objetos separados La soluci n es mover el c digo que lee de la colecci n a justo antes de que se guarde la transacci n Opcionalmente puede utilizar una colecci n no perezosa o asociaci n especificando lazy false para el mapeo de asociaci n Sin embargo el prop sito de la inicializaci n 266 Afinaci n de las estrategias de recuperaci n perezosa es que se utilice para casi todas las colecciones y asociaciones Si define demasiadas asociaciones no perezosas en su modelo de objetos Hibernate recuperar la base de datos entera en toda transacci n Por otro lado puede utilizar la recuperaci n por uni n la cual no es perezosa por naturaleza en lugar de la recuperaci n por selecci n en una transacci n en particular Veremos ahora c mo personalizar la estrategia de recuperaci n En Hibernate3 los mecanismos para elegir una estrategia de recuperaci n son id nticas para las de las asociaciones monovaluadas y las colecciones 20 1 2 Afinaci n de las estrategias de recupe
61. a de clases en un archivo de mapeo y nombrarlo como la superclase persistente Por ejemplo cat hbm xml Dog hbm xml O si utiliza herencia Animal hbm xml 5 1 3 Clase Puede declarar una clase persistente utilizando el elemento class Por ejemplo lt class name ClassName table tableName discriminator value discriminator_value mutable true false schema owner catalog catalog proxy ProxyInterface dynamic update true false dynamic insert true false 860000000050 select before update truelfalse 68 Clase o 0 0 0 polymorphism implicit explicit where arbitrary sql where condition batch size N O persister PersisterClass B optimistic lock none version dirtylall lazy true false entity name EntityName check arbitrary sql check condition rowid rowid subselect SQL expression abstract truelfalse node element name name opcional El nombre completamente calificado de la clase Java persistente o interfaz Si se omite este atributo se asume que el mapeo es para una entidad que no es POJO table opcional por defecto es el nombre de la clase no calificado El nombre de su tabla en la base de datos discriminator value opcional predeterminado al nombre de la clase Un valor que distingue subclases individuales usado para el comportamiento polim rfico Los valores aceptables incluyen null y not null mutable opcional
62. a uno El siguiente es un ejemplo de una asociaci n bidireccional uno a muchos en una tabla de uni n El inverse true puede ir en cualquier lado de la asociaci n en la colecci n o en la uni n lt class name Person gt lt id name id column personld gt lt generator class native gt lt id gt lt set name addresses table PersonAddress gt lt key column personld gt lt many to many column addressld unique true class Address gt 136 uno a uno lt set gt lt class gt lt class name Address gt lt id name id column addressld gt lt generator class native gt lt a gt lt join table PersonAddress inverse true optional true gt lt key column addressId gt lt many to one name person column personld not null true gt lt Join gt class gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null create table Address addressId bigint not null primary key 7 5 2 uno a uno addressId bigint not null primary key Una asociaci n bidireccional uno a uno en una tabla de uni n es extremadamente inusual pero es posible lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt join table PersonAddress optional true gt lt key column personld unique true gt lt many to one name address column addre
63. base de datos la ltima almacena los datos actualizados Todas las otras simplemente leen datos por ejemplo en un di logo de estilo asistente abarcando muchos ciclos petici n respuesta Esto es m s f cil de implementar de lo que suena especialmente si usa las funcionalidades de Hibernate e Versionado autom tico Hibernate puede realizar un control autom tico de concurrencia optimista por usted Puede detectar autom ticamente si ha ocurrido una modificaci n simult nea durante el tiempo para pensar del usuario Chequee esto al final de la conversaci n 187 Cap tulo 12 Transacciones y Objetos separados Si decide usar el patr n sesi n por petici n todas las instancias cargadas estar n en estado separado durante el tiempo para pensar del usuario Hibernate le permite volver a unir los objetos y hacer persistentes las modificaciones El patr n se llama sesi n por petici n con objetos separados Se usa el versionado autom tico para aislar las modificaciones simult neas e Sesi n extendida o larga La Session de Hibernate puede ser desconectada de la conexi n JDBC subyacente despu s de que haya guardado la transacci n de la base de datos y haya reconectado cuando ocurra una nueva petici n del cliente Este patr n se conoce como sesi n por conversaci n y hace la re uni n innecesaria Para aislar las modificaciones simult neas se usa el versionado autom tico y usualmente no se permite que se limpie
64. base de datos intentando utilizar esta opci n con cualquier generador de tipo en memoria provocar una excepci n durante el an lisis sint ctico Note que para los prop sitos de esta discusi n los generadores en la base de datos son considerados org hibernate id SequenceGenerator y sus subclases y cualquier implementador de org hibernate id PostInsertIdentifierGenerator La excepci n m s 211 Cap tulo 14 Procesamiento po importante aqui es org hibernate id TableHiLoGenerator la cual no se puede utilizar ya que no expone una manera selectiva de obtener sus valores e Para las propiedades mapeadas como version O timestamp la declaraci n insert le da dos opciones Puede especificar la propiedad en la lista de propiedades en tal caso su valor se toma de las expresiones de selecci n correspondientes o se omite de la lista de propiedades en tal caso se utiliza el seed value definido por el org hibernate type VersionType Un ejemplo de la ejecuci n de la declaraci n INSERT de HQL Session session sessionFactory openSession Transaction tx session beginTransaction String hqlInsert insert into DelinquentAccount id name select c id c name from Customer c where int createdEntities s createQuery hqlinsert executeUpdate tx commit session close 212 HQL El lenguaje de consulta de Hibernate Hibernate utiliza un lenguaje de consulta potente HQL que se p
65. calendar holidays national day person birthDay and person nationality calendar calendar select item from Item item Order order where order items order deliveredItemIndices 0 item and order id 11 select item from Item item Order order where order items maxindex order items item and order id 11 La expresi n dentro de puede incluso ser una expresi n aritm tica select item from Item item Order order where order items size order items 1 item HQL tambi n proporciona la funci n incorporada index para los elementos de una asociaci n uno a muchos o una colecci n de valores select item index item from Order order join order items item where index item lt 5 224 La cl usula order by Se pueden utilizar las funciones SQL escalares soportadas por la base de datos subyacente from DomesticCat cat where upper cat name like FRIS Considere qu tan larga y menos le ble ser a la siguiente consulta en SQL select cust from Product prod Store store inner join store customers cust where prod name widget and store location name in Melbourne Sydney and prod all elements cust currentOrder lineltems Ayuda algo como SELECT cust name cust address cust phone cust id cust current_order FROM customers cust stores store Tocatronsi Loc store customers sc product prod WHERE prod name widget AND store loc_id loc id AND loc name IN Melbour
66. colecci n persistente o array La cadena de consulta puede referirse a this lo que quiere decir el elemento de la colecci n actual Collection blackKittens session createFilter pk getKittens where this color setParameter Color BLACK Hibernate custom ColorUserType class last 164 Consultas de criterios La colecci n devuelta es considerada un bag y es una copia de la colecci n dada La colecci n original no es modificada Esto es lo opuesto a lo que implica el nombre filtro pero es consistente con el comportamiento esperado Observe que los filtros no requieren una cl usula from aunque pueden tener una si se necesita Los filtros no est n limitados a devolver los elementos de colecci n por s mismos Collection blackKittenMates session createFilter pk getKittens select this mate where this color eg Color BLACK intValue lus Incluso una consulta de filtro vacio es util por ejemplo para cargar un subconjunto de elementos en una colecci n enorme Collection tenKittens session createFilter mother getKittens setFirstResult 0 setMaxResults 10 Ls 10 4 3 Consultas de criterios HQL es extremadamente potente pero algunos desarrolladores prefieren construir consultas din micamente utilizando una API orientada a objetos en vez de construir cadenas de consulta Hibernate brinda una API intuitiva de consulta Criteria para estos casos Criteria crit session createCri
67. concurrente Le concierne al desarrollador capturar y manejar esta excepci n Las opciones comunes son la oportunidad del usuario de fusionar los cambios o de recomenzar el proceso empresarial sin datos desactualizados La Session se desconecta de cualquier conexi n JDBC subyacente a la espera de una interacci n del usuario Este enfoque es el m s eficiente en t rminos de acceso a la base de datos La aplicaci n no necesita por s misma tratar con el chequeo de versiones ni re unir instancias separadas ni tiene que recargar instancias en cada transacci n de la base de datos foo is an instance loaded earlier by the old session Transaction t session beginTransaction Obtain a new JDBC connection start transaction foo setProperty bar session flush Only for last transaction in conversation t commit Also return JDBC connection session close Only for last transaction in conversation El objeto foo sabe en qu session fue cargado El dar inicio a una nueva base de datos en una sesi n vieja obtiene una nueva conexi n y reanuda la sesi n El guardar una transacci n de la base de datos desconecta una sesi n de la conexion JDBC y devuelve la conexi n al pool Despu s de la reconexi n para poder forzar una verificaci n de versi n sobre datos que usted no est actalizando puede llamar a Session lock CON LockMode READ en cualquier objeto que pueda haber sido actualizado por otra transacci n No ne
68. de b squeda real para una SessionFactory en una clase de ayuda como HibernateUtil getSessionFactory Note que dicha clase tambi n es una manera pr ctica de iniciar Hibernate vea el cap tulo 1 3 8 3 Administraci n de contexto de Sesi n Actual con JTA The easiest way to handle Sessions and transactions is Hibernate s automatic current Session management For a discussion of contextual sessions see Secci n 2 5 Sesiones contextuales Using the jta session context if there is no Hibernate session associated with the current JTA transaction one will be started and associated with that JTA transaction the first time you call sessionFactory getCurrentSession The sessions retrieved via getCurrentSession in the jta context are set to automatically flush before the transaction completes close after the transaction completes and aggressively release JDBC connections after each statement This allows the sessions to be managed by the life cycle of the JTA transaction to which it is associated keeping user code clean of such management concerns Your code can either use JTA programmatically through UserTransaction or recommended for portable code use the Hibernate Transaction API to set transaction boundaries If you run in an EJB container declarative transaction demarcation with CMT is preferred 3 8 4 Despliegue JMX La l nea cfg buildSessionFactory todav a se tiene que ejecutar en alg n sitio para obtener una
69. defecto las propiedades valuadas como nulas se excluyen 236 Proyecciones agregaci n y agrupamiento Puede modificar la aplicaci n del Example Example example Example create cat excludeZeroes exclude zero valued properties excludeProperty color exclude the property named color ignoreCase perform case insensitive string comparisons enableLike use like for string comparisons List results session createCriteria Cat class add example Sci Puede incluso usar ejemplos para colocar criterios sobre objetos asociados List results session createCriteria Cat class add Example create cat CreateCriteria mate add Example create cat getMate SE 16 7 Proyecciones agregaci n y agrupamiento La clase org hibernate criterion Projections es una f brica de instancias de Projection Puede aplicar una proyecci n a una consulta llamando a setProjection List results session createCriteria Cat class setProjection Projections rowCount add Restrictions eq color Color BLACK alist List results session createCriteria Cat class setProjection Projections projectionList add Projections rowCount ada add Projections max weight add Projections avg weight Projections groupProperty color Poles cea No es necesario ning n agrupamiento por expl cito en una consulta por criterios Ciertos tipos de proyecci
70. el mismo set Mire el sitio web de Hibernate para obetener una discusi n m s profunda de este tema Note tambi n que ste no es problema de Hibernate sino que simplemente se tiene que implementar la identidad y la igualdad de los objetos Java 12 1 4 Temas com nes No use los antipatrones sesi n por sesi n de usuario o sesi n por aplicaci n hay excepciones raras a esta regla Algunos de los siguientes temas tambi n podr an aparecer con los patrones recomendados as que aseg rese de que entiende las implicaciones antes de tomar una decisi n de dise o e Una Session no es segura entre hilos Las cosas que funcionan de manera simult nea como las peticiones HTTP beans de sesi n o workers de Swing provocar n condiciones de competencia si una instancia de Session se comparte Si guarda su Session de Hibernate en su HttpSession se discute m s adelante debe considerar el sincronizar el acceso a su sesi n HTTP De otro modo un usuario que hace click lo suficientemente r pido puede llegar a usar la misma Session en dos hilos ejecut ndose simult neamente e Una excepci n lanzada por Hibernate significa que tiene que deshacer su transacci n de la base de datos y cerrar la Session inmediatamente se discute en m s detalle m s adelante en este cap tulo Si su Session est vinculada a la aplicaci n tiene que parar la aplicaci n Deshacer la transacci n de la base de datos no pone a sus objetos de vuelta al estado en que
71. emailAddress Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction 19 Cap tulo 1 Tutorial Person aPerson Person session load Person class personld adding to the emailAddress collection might trigger a lazy load of the collection aPerson getEmailAddresses add emailAddress session getTransaction commit Esta vez no utilizamos una petici n de buqueda fetch para dar inicio a la colecci n Monitoree su registro SQL e intente de optimizar esto con una recuperaci n temprana 1 2 5 Asociaciones bidireccionales A continuacion vamos a mapear una asociaci n bidireccional Vamos a hacer que la asociaci n entre persona y evento funcione desde ambos lados en Java El esquema de la base de datos no cambia as que todav a tendremos una multiplicidad muchos a muchos O Primero agregue una colecci n de participantes a la clase Event private Set participants new HashSet public Set getParticipants return participants public void setParticipants Set participants this participants participants Ahora mapee este lado de la asociaci n en Event hbm xml lt set name participants table PERSON_EVENT inverse true gt lt key column EVENT_ID gt lt many to many column PERSON_ID class events Person gt lt set Estos son mapeos normales de set en ambos documentos de mapeo Note que los nombres de las co
72. en tiempo de compilaci n Este mecanismo es m s potente que las anotaciones XDoclet y es mejor soportado por herramientas e IDEs IntelliJ IDEA por ejemplo soporta auto completaci n adem s de resalte de sintaxis de las anotaciones JDK 5 0 La nueva revisi n de la especificaci n de EJB JSR 220 utiliza anotaciones JDK 5 0 como el mecanismo principal de metadatos para beans de entidad Hibernate3 implementa el Ent it yManager del JSR 220 la API de persistencia El soporte para metadatos de mapeo est disponible por medio del paquete Anotaciones de 106 Propiedades generadas Hibernate como una descarga separada Tanto los metadatos de EJB3 JSR 220 como de Hibernate3 se encuentran soportados Este es un ejemplo de una clase POJO anotada como un bean de entidad EJB Entity access AccessType FIELD public class Customer implements Serializable Id Long id String firstName String lastName Date birthday Transient Integer age Embedded private Address homeAddress OneToMany cascade CascadeType ALL JoinColumn name CUSTOMER_ID Set lt Order gt orders Getter setter and business methods Nota El soporte para las anotaciones JDK 5 0 y JSR 220 todav a se encuentra en progreso Para obtener m s informaci n consulte al m dulo de anotaciones de Hibernate 5 6 Propiedades generadas Las propiedades generadas son propiedades cuyos valores son generados por la base de datos
73. es una soluci n completa de mapeo objeto relacional que no s lo proteje al desarrollador de los detalles del sistema de administraci n de la base datos subyacente sino que adem s ofrece administraci n de estado de objetos Contrario a la administraci n de declaraciones SQL en capas comunes de persistencia JDBC SQL esta es una vista natural orientada a objetos de la persistencia en aplicaciones Java En otras palabras los desarrolladores de aplicaciones de Hibernate siempre deben pensar en el estado de sus objetos y no necesariamente en la ejecuci n de declaraciones SQL Hibernate se ocupa de esto y es s lamente relevante para el desarrollador de la aplicaci n al afinar el rendimiento del sistema 10 1 Estados de objeto de Hibernate Hibernate define y soporta los siguientes estados de objeto e Transitorio un objeto es transitorio si ha sido reci n instanciado utilizando el operador new y no est asociado a una Session de Hibernate No tiene una representaci n persistente en la base de datos y no se le ha asignado un valor identificador Las instancias transitorias ser n destru das por el recolector de basura si la aplicaci n no mantiene m s una referencia Utiliza la Session de Hibernate para hacer un objeto persistente y deja que Hibernate se ocupe de las declaraciones SQL que necesitan ejecutarse para esta transici n Persistente una instancia persistente tiene una representaci n en la base de datos y un valor ident
74. hibernate cfg Configuration pub lic class HibernateUtil private static final SessionFactory sessionFactory buildSessionFactory j private static SessionFactory buildSessionFactory try Create the SessionFactory from hibernate cfg xml return new Configuration configure buildSessionFactory catch Throwable ex Make sure you log the exception as it might be swallowed System err println Initial SessionFactory creation failed ex throw new ExceptionInInitializerError ex 10 Carga y almacenamiento de objetos public static SessionFactory getSessionFactory return sessionFactory Guarde este c digo como src main java org hibernate tutorial util HibernateUtil java Esta clase no s lamente produce la referencia org hibernate SessionFactory global en su inicializador est tico sino que tambi n esconde el hecho de que utiliza un singleton est tico Tambi n puede que busque la referencia org hibernate SessionFactory desde JNDI en un servidor de aplicaciones en cualquier otro lugar Si usted le da un nombre a org hibernate SessionFactory en su archivo de configuraci n de hecho Hibernate tratara de vincularlo a JNDI bajo ese nombre despu s de que ha sido construido Otra mejor opci n es utilizar el despliegue JMX y dejar que el contenedor con capacidad JMX instancie y vincule un HibernateService a JNDI M s adelante discutiremos estas opciones avanzadas Ahora necesita
75. in gt lt property name connection pool_size gt 1 lt property gt ISO dale citys gt lt property name dialect gt org hibernate dialect HSQLDialect lt property gt lt Enable Hibernate s automatic session context management gt lt property name current_session_context_class gt thread lt property gt lt Disable the second level cache gt lt property name cache provider_class gt org hibernate cache NoCacheProvider lt property gt ECHO all executed SOL to stdout gt lt property name show_sql gt true lt property gt Construcci n con Maven lt A DOP ANO re create the database schema ON SEartUp gt lt property name hbm2ddl auto gt update lt property gt lt mapping resource org hibernate tutorial domain Event hbm xml gt lt session factory gt lt hibernate configuration Configure la SessionFactory de Hibernate SessionFactory es una fabrica global responsable de una base de datos en particular Si usted tiene varias bases de datos para un inicio mas facil utilice varias configuraciones lt session factory gt en varios archivos de configuraci n Los primeros cuatro elementos property contienen la configuraci n necesaria para la conexi n JDBC El elemento property dialecto especifica la variante SQL en particular que Hibernate genera Sugerencia Lay In most cases Hibernate is able to properly determine which dialect to use See for
76. interfaz Sin embargo no podr utilizar proxies para recuperaci n perezosa de asociaciones lo cual limitar sus opciones para afinar el rendimiento Tambi n debe evitar el declarar m todos public final en las clases no finales Si quiere utilizar una clase con un m todo public final debe deshabilitar expl citamente el uso de proxies estableciendo lazy false 4 1 4 Declare m todos de acceso y de modificaci n para los campos persistentes opcional Cat declara m todos de acceso para todos sus campos persistentes Muchas otras herramientas ORM persisten directamente variables de instancia Es mejor proporcionar una indirecci n entre el esquema relacional y las estructuras de datos internos de la clase Por defecto Hibernate persiste las propiedades del estilo JavaBeans y reconoce los nombres de m todo de la forma 55 Cap tulo 4 Clases persistentes getFoo isFoo Y setFoo De ser necesario puede cambiarse al acceso directo a campos para propiedades espec ficas No es necesario declarar p blicas las propiedades Hibernate puede persistir una propiedad con un par get Set protected O private 4 2 Implementaci n de herencia Una subclase tambi n tiene que cumplir con la primera y la segunda regla Hereda su propiedad identificadora de la superclase cat Por ejemplo package eg public class DomesticCat extends Cat private String name public String getName return name protected void setN
77. key gt 7 4 2 Uno a uno Una asociaci n bidireccional uno a uno en una clave for nea es com n lt class name Person gt lt id name id column personld gt lt generator class native gt lt id gt lt many to one name address column addressId unique true not null true gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt one to one name person property ref address gt lt class gt 135 Cap tulo 7 Mapeos de asociaci n create table Person personId bigint not null primary key addressId bigint not null unique create table Address addressId bigint not null primary key Una asociaci n bidireccional uno a uno en una clave primaria utiliza el generador de id especial lt class name Person gt lt id name id column personld gt lt generator class native gt lt id gt lt one to one name address gt lt class gt lt class name Address gt lt id name id column personld gt lt generator class foreign gt lt param name property gt person lt param gt lt generator gt lt id gt lt one to one name person constrained true gt elass gt create table Person personld bigint not null primary key create table Address personId bigint not null primary key 7 5 Asociaciones bidireccionales con tablas de uni n 7 5 1 uno a muchos muchos
78. la manera en que interact a una sesi n en particular con el cach de segundo nivel CacheMode NORMAL lee items desde y escribe items hacia el cach del segundo nivel CacheMode GET lee items del cach del segundo nivel No escribe al cach de segundo nivel excepto cuando actualiza datos CacheMode PUT escribe items al cach de segundo nivel No lee del cach de segundo nivel CacheMode REFRESH escribe items al cach de segundo nivel No lee del cach de segundo nivel salt ndose el efecto de hibernate cache use_minimal_puts forzando la actualizaci n del cach de segundo nivel para todos los tems le dos de la base de datos Para navegar por los contenidos de una regi n de cach de segundo nivel o de consultas use la API de Statistics Map cacheEntries sessionFactory getStatistics getSecondLevelCacheStatistics regionName getEntries Necesitara habilitar las estadisticas y opcionalmente forzar a Hibernate para que guarde las entradas del cach en un formato mas facil de entender para humanos hibernate generate_statistics true hibernate cache use_structured_entries true 20 4 El Cach de Consultas Los conjuntos de resultados de peticiones tambi n pueden ponerse en cach Esto s lamente es til para consultas que se ejecutan frecuentemente con los mismos par metros 279 Cap tulo 20 Mejoramiento del 20 4 1 Habilitaci n del cach de peticiones El pon
79. las instancias reales de entidad retornadas por la consulta est n ya en la sesi n o en el cach de segundo nivel Si todav a no est n en cach iterate ser m s lento que list y podr a requerir muchas llamadas a la base de datos para una consulta simple usualmente 7 para la selecci n inicial que s lamente retorna identificadores y n selecciones adicionales para inicializar las instancias reales fetch ids Iterator iter sess createQuery from eg Qux q order by q likeliness iterate while iter hasNext Qux qux Qux iter next fetch the object something we couldnt express in the query if qux calculateComplicatedAlgorithm delete the current instance iter remove dont need to process the rest break 10 4 1 2 Consultas que devuelven tuplas Las consultas de Hibernate a veces retornan tuplas de objetos Cada tupla se retorna como un array Iterator kittensAndMothers sess createQuery select kitten mother from Cat kitten join kitten mother mother LS iterator while kittensAndMothers hasNext Object tuple Object kittensAndMothers next Cat kitten Cat tuple 0 Cat mother Cat tuple 1 161 Cap tulo 10 Trabajo con objetos 10 4 1 3 Resultados escalares Las consultas pueden especificar una propiedad de una clase en la cl usula select Pueden incluso llamar a funciones de agregaci n SQL Las propiedades o agregaciones son con
80. longer read only call Session setReadOnly entityOrProxy false Importante When a read only entity or proxy is changed so it is no longer read only Hibernate assumes that the current state of the read only entity is consistent with its database representation If this is not true then any non flushed changes made before or while the entity was read only will be ignored To throw away non flushed changes and make the persistent entity consistent with its database representation call session refresh entity To flush changes made before or while the entity was read only and make the database representation consistent with the current state of the persistent entity evict the read only entity so it is detached session evict entity make the detached entity with the non flushed changes persistent session update entity now entity is no longer read only and its changes can be flushed 5 Trash 11 2 Read only affect on property type The following table summarizes how different property types are affected by making an entity read only Tabla 11 1 Affect of read only entity on property types Property Association Type Changes flushed to DB Simple no 179 Cap tulo 11 Read only entities Property Association Type Changes flushed to DB Secci n 11 2 1 Simple properties Unidirectional one to one no Unidirectional many to one no Secci n 11 2 2 1 Unidirec
81. los mapeos XML deben declarar el tipo de documento que se muestra El DTD en s se puede encontrar en la URL mencionada anteriormente en el directorio hibernate x x x src org hibernate 0 n hibernate3 jar Hibernate siempre buscar el DTD primero en la ruta de clase Si el DTD realiza b squedas utilizando una conexi n de Internet verifique que su declaraci n DTD frente al contenido de su ruta de clase 5 1 1 1 EntityResolver Hibernate tratar primero de resolver los DTDs en su ruta de clase La manera en que lo hace es registrando una implementaci n org xml sax EntityResolver personalizada con el SAXReader que utiliza para leer los archivos xml Este EntityResolver personalizado reconoce dos diferentes espacios de nombre del identificador del sistema Unhibernate namespace Se reconoce cuando el resolvedor se encuentra con un identificador de sistema que inicia por http hibernate sourceforge net El resolvedor intenta 66 Mapeo de Hibernate resolver estas entidades por medio del cargador de clases el cual carg las clases de Hibernate Un user namespace Se reconoce cuando el resolvedor se encuentra con un identificador del sistema utilizando un protocolo URL classpath El resolvedor intentar resolver estas entidades por medio de 1 el cargador de clase del contexto del hilo actual y 2 el cargador de clase el cual carg las clases de Hibernate Este es un ejemplo de la utilizaci n de los
82. mapa o conjunto En la implementaci n actual la estrategia de generaci n de identificador nat ive no se encuentra soportada para identificadores de colecciones lt idbag gt 6 4 Ejemplos de colecci n Esta secci n cubre los ejemplos de colecci n La siguiente clase tiene una colecci n de instancias Child package eg import java util Set public class Parent private long id private Set children public long getId return id private void setId long id this id id 124 Ejemplos de colecci n private Set getChildren return children private void setChildren Set children this children children Si cada hijo tiene como mucho un padre el mapeo m s natural es una asociaci n uno a muchos lt hibernate mapping gt lt class name Parent gt lt id name id gt lt generator class sequence gt as lt set name children gt lt key column parent_id gt lt one to many class Child gt lt set gt lt class gt lt class name Child gt lt id name id gt lt generator class sequence gt ARE lt property name name gt lt class gt lt hibernate mapping gt Esto mapea a las siguientes definiciones de tabla create table parent id bigint not null primary key create table child id bigint not null primary key name varchar 255 parent_id bigint alter table child add constraint childfk0 parent_id references parent Si el padre es req
83. medio de las t cnicas descritas anteriormente Tabla 3 3 Propiedades de Configuraci n de Hibernate Nombre de la propiedad Prop sito hibernate dialect El nombre de clase de un org hibernate dialect Dialect de Hibernate el cual le permite que genere un 36 Par metros de configuraci n opcionales Nombre de la propiedad hibernate show_sql hibernate format_sq hibernate default_schema Prop sito SQL optimizado para una base de datos relacional en particular e g full classname of Dialect En la mayor a de los casos Hibernate podr de hecho seleccionar la implementaci n org hibernate dialect Dialect Correcta con base en los JDBC metadata que el controlador JDBC retorna Escribe todas las declaraciones SQL a la consola Esta es una alternativa para establecer la categoria de registro org hibernate SOL a debug e g true false Imprime el SQL en el registro y la consola e g true false Califica los nombres de tabla sin calificar con el esquema espacio de tabla dado en el SQL generado e g SCHEMA_NAME hibernate default_catalog hibernate session_factory_name hibernate max_fetch_depth hibernate default_batch_fetch_size Califica los nombres de tabla sin calificar con el cat logo dado en el SQL generado e g CATALOG_NAME Automaticamente se vinculara el org hibernate SessionFactory a este nombre en JNDI despu s de que se ha creado e g jndi com
84. non null because it was persisted when the previous transaction was committed tx commit session close 11 2 2 2 Unidirectional one to many and many to many Hibernate treats unidirectional one to many and many to many associations owned by a read only entity the same as when owned by an entity that is not read only Hibernate dirty checks unidirectional one to many and many to many associations The collection can contain entities that are read only as well as entities that are not read only Entities can be added and removed from the collection changes are flushed to the database If automatic versioning is used Hibernate will update the version due to changes in the collection if they dirty the owning entity 182 Bidirectional associations 11 2 3 Bidirectional associations 11 2 3 1 Bidirectional one to one If a read only entity owns a bidirectional one to one association e Hibernate does not dirty check the association updates that change the association reference to null or to refer to a different entity will not be flushed to the database e If automatic versioning is used Hibernate will not increment the version due to local changes to the association O When the owner is not read only Hibernate treats an association with a read only entity the same as when the association is with an entity that is not read only 11 2 3 2 Bidirectional one to many many to one A read only entit
85. on the capability of the underlying database However an insidious implication of this approach comes about when targtetting some databases which support identity generation and some which do not identity generation relies on the SQL definition of an IDENTITY or auto increment column to manage the identifier value it is what is known as a post insert generation strategy becauase the insert must actually happen before we can know the identifier value Because Hibernate relies on this identifier value to uniquely reference entities within a persistence context it must then issue the insert immediately when the users requests the entitiy be associated with the session like via save e g regardless of current transactional semantics Nota Hibernate was changed slightly once the implication of this was better understood so that the insert is delayed in cases where that is feasible The underlying issue is that the actual semanctics of the application itself changes in these cases Starting with version 3 2 3 Hibernate comes with a set of enhanced http in relation to 2082 lace identifier generators targetting portability in a much different way Nota There are specifically 2 bundled enhancedgenerators 326 Funciones de la base de datos e org hibernate id enhanced SequenceStyleGenerator org hibernate id enhanced TableGenerator The idea behind these generators is to port the actual semantics of the identifer value gen
86. opci n 113 Cap tulo 6 Mapeos de colecci n mutable opcional por defectos es true Un valor false especifica que los elementos de la colecci n nunca cambian En algunos casos esto permite una peque a optimizaci n de rendimiento 6 2 1 Claves for neas de colecci n Las instancias de colecci n se distinguen en la base de datos por la clave for nea de la entidad que posee la colecci n Se hace referencia a esta clave for nea como la columna clave de colecci n o columnas de la tabla de colecci n El elemento lt key gt mapea la columna clave de la colecci n Puede haber una restricci n de nulabilidad sobre la columna de clave for nea Para la mayor a de las colecciones esto es impl cito Para asociaciones unidireccionales uno a muchos la columna de clave for nea es nulable por defecto de modo que puede que necesite especificar not null true lt key column productSerialNumber not null true gt H T CASCADE La restricci n de clave for nea puede utilizar ON DELE lt key column productSerialNumber on delete cascade gt Vea el cap tulo anterior para obtener una definici n completa del elemento lt key gt 6 2 2 Elementos de collecci n Las colecciones pueden contener casi cualquier tipo de Hibernate incluyendo los tipos b sicos personalizados componentes y referencias a otras entidades Esta es una diferencia importante Un objeto en una colecci n pu
87. para mapeos de bag as que tenga cuidado de c mo formular sus consultas en este caso Finalmente observe que full join fetch y right join fetch no son significativos Si est utilizando una recuperaci n perezosa a nivel de propiedad con instrumentaci n de c digo byte es posible forzar a Hibernate a traer las propiedades perezosas inmediatamente utilizando fetch all properties from Document fetch all properties order by name 215 Cap tulo 15 HQL El lenguaje from Document doc fetch all properties where lower doc name like Scats 15 4 Formas de sintaxis unida HQL soporta dos formas de uni n de asociaci n implicit y explicit Las consultas que se mostraron en la secci n anterior todas utilizan la forma explicit en donde la palabra clave join se utiliza expl citamente en la cla sula from Esta es la forma recomendada La forma implicit no utiliza la palabra clave join Las asociaciones se desreferencian utilizando la notaci n punto Uniones imp1icit pueden aparecer en cualquiera de las cl usulas HQL La uni n implicit causa uniones internas inner joins en la declaraci n SQL que resulta from Cat as cat where cat mate name like s 15 5 Referencia a la propiedad identificadora Hay dos maneras de referirse a la propiedad identificadora de una entidad La propiedad especial en min sculas id se puede utilizar para referenciar la propiedad identificadora de una entidad dado que la entidad n
88. podemos continuar mapeando la propiedad identificadora nica a la clave primaria de la tabla Ya que no queremos preocuparnos por el manejo de este identificador configuramos la estrategia de generaci n del identificador de Hibernate para una columna clave primaria sustituta lt hibernate mapping package org hibernate tutorial domain gt lt class name Event table EVENTS gt lt id name id column EVENT_ID gt lt generator class native gt lt id gt lt class gt Cap tulo 1 Tutorial lt hibernate mapping gt El elemento id es la declaraci n de la propiedad identificadora El atributo de mapeo name id declara el nombre de la propiedad JavaBean y le dice a Hibernate que utilice los m todos get Id y setId para acceder a la propiedad El atributo columna le dice a Hibernate qu columna de la tabla EVENTs tiene el valor de la llave principal El elemento anidado generator especifica la estrategia de generaci n del identificador tambi n conocidos como c mo se generan los valores del identificador En este caso escogimos native el cual ofrece un nivel de qu tan port til es dependiendo del dialecto configurado de la base de datos Hibernate soporta identificadores generados por la base de datos globalmente nicos as como asignados por la aplicaci n La generaci n del valor del identificador tambi n es uno de los muchos puntos de extensi n de Hibernate y puede conectar su p
89. por defecto es true Especifica que las instancias de la clase no son mutables schema opcional Sobrescribe el nombre del esquema especificado por el elemento ra z lt hibernate mapping gt catalog opcional Sobrescribe el nombre del cat logo especificado por el elemento ra z lt hibernate mapping gt proxy opcional Especifica una interfaz a utilizar para los proxies de inicializaci n perezosa Puede especificar el nombre mismo de la clase dynamic update opcional por defecto es false Especifica que el SQL uPDATE debe ser generado en tiempo de ejecuci n y puede contener s lamente aquellas columnas cuyos valores hayan cambiado dynamic insert opcional por defecto es false Especifica que el SQL INSERT debe ser generado en tiempo de ejecuci n y debe contener s lamente aquellas columnas cuyos valores no son nulos select before update opcional por defecto es false Especifica que Hibernate nunca debe realizar un UPDATE SQL a menos de que se tenga certeza de que realmente se haya modificado un objeto S lo cuando un objeto transitorio ha sido asociado con una sesi n nueva utilizando update Hibernate realizar una SQL seLEcT extra para determinar si realmente se necesita un UPDATE polymorphism opcional por defecto es implicit Determina si se utiliza polimorfismo de consulta impl cito o expl cito where opcional especifica una condici n SQL wHERE arbitraria para utilizarla en la recuperaci n
90. puede que el dialecto soporte la secuencia e value_column opcional por defecto es next_val solo es relevante para estructuras de tablas es el nombre de la columna en la tabla la cual se usa para mantener el valor optimizer optional defaults to none See Secci n 5 1 6 Optimizaci n del generador del identificador El segundo de estos nuevos generadores es org hibernate id enhanced TableGenerator el cual tiene el prop sito primero de reemplazar el generador table auqnue de hecho funciona como org hibernate id MultipleHiLoPerTableGenerator y segundo como una re implementaci n de org hibernate id MultipleHiLoPerTableGenerator que utiliza la noci n de los optimizadores enchufables Esencialmente este generador define una tabla capaz de mantener un n mero de valores de incremento diferentes de manera simult nea usando m ltiples filas tecleadas claramente Este generador tiene un n mero de par metros de configuraci n table_name opcional por defecto es hibernate_sequences el nombre de la tabla a utilizar value_column_name opcional por defecto es next_va1 el nombre de la columna en la tabla que se utiliza para mantener el valor segment_column_name opcional por defecto eS sequence_name el nombre de la columna en la tabla que se utiliza para mantener la llave segmento Este es el valor que identifica que valor de incremento utilizar e segment_value opcional por defecto es defau
91. que todos los tipo clases provistos por el JDK tienen una sem ntica de tipo valor en Java mientras que los tipos definidos por el usuario se pueden mapear con sem ntica de tipo valor o de entidad La desici n corre por cuenta del desarrollador de la aplicaci n Una clase entidad en un modelo de dominio son las referencias compartidas a una sola instancia de esa clase mientras que la composici n o agregaci n usualmente se traducen a un tipo de valor Volveremos a revisar ambos conceptos a lo largo de este manual de referencia EL desaf o es mapear el sistema de tipos de Java la definici n de entidades y tipos de valor de los desarrolladores al sistema de tipos de SQL la base de datos El puente entre ambos sistemas lo brinda Hibernate Para las entidades utilizamos lt class gt lt subclass gt etc Para los tipos de valor utilizamos lt property gt lt component gt etc usualmente con un atributo type El valor de este atributo es el nombre de un tipo de mapeo de Hibernate Hibernate proporciona un rango de mapeos para tipos de valores del JDK est ndar Puede escribir sus propios mapeos de tipo e implementar sus estrategias de conversi n personalizadas 100 Tipos de valores b sicos Todos los tipos incorporados de Hibernate soportan la sem ntica de nulos a excepci n de las colecciones 5 2 2 Tipos de valores b sicos Los tipos de mapeo b sicos incorporados se pueden categorizar as integer long shor
92. response getWriter SUC parme ine em gt lt head gt lt title gt Event Manager lt title gt lt head gt lt body a Handle actions if store equals request getParameter action String eventTitle request getParameter eventTitle String eventDate request getParameter eventDate if equals eventTitle equals eventDate cut printio lt p Si gt Please enter event title and date lt i gt lt b air else createAndStoreEvent eventTitle dateFormatter parse eventDate Cut PELMELE gt lt il gt Added event lt i gt lt b 207 23 Cap tulo 1 Tutorial Print page printEventForm out listEvents out dateFormatter Write HTML footer out println lt body gt lt html 7 bie cla O out close Dado que este estilo de codificaci n con una mezcla de Java y HTML no escalar a en una aplicaci n m s compleja tenga en cuenta que s lo estamos ilustrando los conceptos b sicos de Hibernate en este tutorial El c digo imprime una cabecera y un pie de p gina HTML Dentro de esta p gina se imprime una forma HTML para entrada de eventos y se imprime una lista de todos los eventos en la base de datos El primer m todo es trivial y su salida se realiza nicamente en HTML private void printEventForm PrintWriter out cut princi Une gt Add new event lt h2 aNg Ours primi ln lt form SENG out println Title lt input name
93. save e si el objeto est versionado por un lt version gt O lt timestamp gt y el valor de la propiedad de versi n es el mismo valor asignado a un objeto reci n instanciado gu rdelo llamando a save de otra manera actualice el objeto llamando a update y merge es muy diferente e si existe una instancia persistente con el mismo identificador asignado actualmente con la sesi n copie el estado del objeto dado en la instancia persistente 168 Borrado de objetos persistentes si no existe ninguna instancia persistente asociada a la sesi n actualmente intente cargarla desde la base de datos o cree una nueva instancia persistente e la instancia persistente es devuelta e la instancia dada no se asocia a la sesi n permanece separada 10 8 Borrado de objetos persistentes Session delete borrar el estado de un objeto de la base de datos Sin embargo su aplicaci n puede tener todav a una referencia a un objeto borrado Lo mejor es pensar en delete al hacer transitoria una instancia persistente Sess delete cat Puede borrar objetos en el orden que quiera sin riesgo de violaciones de restricci n de clave for nea A n es posible violar una restricci n NOT NULL sobre una columna de clave for nea borrando objetos en un orden err neo por ejemplo si borra el padre pero olvida borrar los hijos 10 9 Replicaci n de objetos entre dos almacenamientos de datos diferentes A veces es til pode
94. scalar column age type long gt SELECT p NAME AS name p AGE AS age FROM PERSON p WHERE p NAME LIKE HiberS lt sql query gt Puede externalizar el grupo de resultados mapeando informaci n en un elemento lt resultset gt el cual le permitir reutilizarlos a trav s de consultas nombradas o por medio de la API setResultSetMapping lt resultset name personAddress gt lt return alias person class eg Person gt lt return join alias address property person mailingAddress gt lt resultset gt lt sql query name personsWith resultset ref personAddress gt SELECT person NAME AS person name person AGE AS person age person SEX AS person sex address STREET AS address street address CITY AS address city address STATE AS address state address ZIP AS address zip FROM PERSON person JOIN ADDRESS address ON person ID address PERSON_ID AND address TYPE MAILING WHERE person NAME LIKE namePattern lt sql query gt 247 Cap tulo 17 SQL Nativo Opcionalmente puede utilizar el grupo de resultados mapeando la informaci n en sus archivos hbm directamente en c digo java List cats sess createSQLQuery select cat kitten from cats cat cats kitten where kitten mother cat id setResultSetMapping catAndKitten List 17 2 1 Utilizaci n de la propiedad return para especificar expl citamente los nombres de columnas alias Con lt return propert y gt usted p
95. sea una asociaci n monovaluada o una colecci n con cascade a11 marca la asociaci n como una relaci n del estilo padre hijo en donde guardar actualizar borrar save update delete el padre causa el guardar actualizar borrar del hijo o hijos Adem s una mera referencia a un hijo desde un padre persistente har que se guarde actualice el hijo Sin embargo esta met fora se encuentra incompleta Un hijo que deje de ser referenciado por su padre no es borrado autom ticamente excepto en el caso de una asociaci n lt one to many gt mapeada con cascade delete orphan La sem ntica precisa de las operaciones en cascada para una relaci n padre hijo es la siguiente e Si un padre pasa a persist se pasan todos los hijos a persist e Si un padre pasa a merge se pasan todos los hijos a merge e Si se pasa un padre a save update O saveOrUpdate todos los hijos pasan a saveOrUpdate e Si un hijo transitorio o separado se vuelve referenciado por un padre persistente le es pasado a saveOrUpdate e Si se borra un padre se pasan todos los hijos a delete e Si un hijo deja de ser referenciado por un padre persistente no ocurre nada especial la aplicaci n debe borrar expl citamente el hijo de ser necesario a menos que cascade delete orphan en cuyo caso se borra el hijo hu rfano 172 Utilizaci n de metadatos Finalmente note que las operaciones en cascadas se pueden aplicar a un grafo de objeto
96. si usted utiliza un generador de identificador ident iy Tambi n puede realizar este tipo de trabajo en un proceso en donde la interacci n con el cach de segundo nivel se encuentre completamente desactivado hibernate cache use_second_level_cache false Sin embargo esto no es absolutamente necesario ya que podemos establecer explicitamente el CacheMode para descativar la interacci n con el cach de segundo nivel 14 1 Inserciones de lotes Al hacer persistentes los objetos nuevos es necesario que realice flush y luego clear en la sesi n regularmente para controlar el tama o del cach de primer nivel Session session sessionFactory openSession Transaction tx session beginTransaction j 207 Cap tulo 14 Procesamiento po EOL MANE O ESOO O OO Customer customer new Customer DE session save customer if i 20 0 20 same as the JDBC batch size flush a batch of inserts and release memory session flush session clear tx commit session close 14 2 Actualizaciones de lotes Para recuperar y actualizar datos se aplican las mismas ideas Adem s necesita utilizar scro11 para sacar ventaja de los cursores del lado del servidor en consultas que retornen muchas filas de datos Session session sessionFactory openSession Transaction tx session beginTransaction ScrollableResults customers session getNamedQuery GetCustomers setCacheMode C
97. subclass gt Por ejemplo lt union subclass name ClassName table tablename proxy ProxyInterface 00006 lazy true false dynamic update true false dynamic insert true false schema schema catalog catalog extends SuperclassName 94 Join abstract truelfalse persister ClassName subselect SQL expression entity name EntityName node element name gt GRAINS sooo Ve lt union subclass o 00 0 name El nombre de clase completamente calificado de la subclase table El nombre de tabla de la subclase proxy opcional Especifica una clase o interfaz que se debe utilizar para proxies de inicializaci n perezosa lazy opcional por defecto es true El establecer lazy false desactiva el uso de la recuperaci n perezosa No se necesita una columna o una columna clave discriminadora para esta estrategia de mapeo For information about inheritance mappings see Cap tulo 9 Mapeo de herencias 5 1 20 Join Al utilizar el elemento lt join gt es posible mapear las propiedades de una clase a varias tablas que tengan una relaci n uno a uno Por ejemplo lt join table tablename schema owner catalog catalog fetch join select inverse true false 0000008 optional truelfalse gt key m2 gt lt property gt 2 7610 table El nombre de la tabla unida schema opcional Sobrescribe el nombre del esquema especificado por el elemento raiz
98. sus instancias separadas es la primera operaci n que se ejecuta The application should individually update detached instances that are reachable from the given detached instance only if it wants their state to be updated This can be automated using transitive persistence See Secci n 10 11 Persistencia transitiva for more information El m todo lock tambi n le permite a una aplicaci n reasociar un objeto con una sesi n nueva Sin embargo la instancia separada no puede haber sido modificada just reassociate sess lock fritz LockMode NONE do a version check then reassociate sess lock izi LockMode READ do a version check using SELECT FOR UPDATE then reassociate sess lock pk LockMode UPGRADE Note que lock se puede utilizar con varios LockModes Consulte la documentaci n de la API y el cap tulo sobre el manejo de transacciones para obtener mayor informaci n La re uni n no es el nico caso de uso para lock Other models for long units of work are discussed in Secci n 12 3 Control de concurrencia optimista 167 Cap tulo 10 Trabajo con objetos 10 7 Detecci n autom tica de estado Los usuarios de Hibernate han pedido un m todo de prop sito general que bien guarde una instancia transitoria generando un identificador nuevo o bien actualice re na las instancias separadas asociadas con su identificador actual El m todo save0rUpdate implementa esta funcion
99. uni n cruzada cross join from Formula Parameter from Formula as form Parameter as param Se considera como una buena pr ctica el nombrar los alias de consulta utilizando una inicial en min sculas consistente con los est ndares de nombrado de Java para las variables locales por ejemplo domesticCat 15 3 Asociaciones y uniones joins Tambi n puede asignar alias a entidades asociadas o a elementos de una colecci n de valores utilizando una join Por ejemplo from Cat as cat inner join cat mate as mate left outer join cat kittens as kitten from Cat as cat left join cat mate kittens as kittens from Formula form full join form parameter param Los tipos de uniones soportadas se tomaron prestados de ANSI SQL inner join e left outer join right outer join full join no es Util usualmente Las construcciones inner join left outer join Y right outer join se pueden abreviar from Cat as cat join cat mate as mate left join cat kittens as kitten Puede proveer condiciones extras de uni n utilizando la palabra clave with de HQL 214 Asociaciones y uniones joins from Cat as cat left join cat kittens as kitten with kitten bodyWeight gt ORO A fetch join allows associations or collections of values to be initialized along with their parent objects using a single select This is particularly useful in the case of a collection It effectively overrides the outer join and lazy declaration
100. words its a series of operations we wish to carry out against the database together Basically it is a transaction though fulfilling a unit of work will often span multiple physical database transactions see Secci n 12 1 2 Conversaciones largas So really we are talking about a more abstract notion of a transaction The term business transaction is also sometimes used in lieu of unit of work Primero no use el antipatr n sesi n por operaci n no abra y cierre una Session para cada llamada simple a la base de datos en un solo hilo Lo mismo aplica para las transacciones de base de datos Las llamadas a la base de datos en una aplicaci n se hacen usando una secuencia planeada estas se agrupan dentro de unidades de trabajo at micas Esto tambi n significa que el auto commit despu s de cada una de las declaraciones SQL es in til en una aplicaci n ya que este modo est pensado para trabajo ad hoc de consola SQL Hibernate deshabilita o espera que el servidor de aplicaciones lo haga el modo auto commit inmediatamente Las transacciones de las bases de datos nunca son opcionales Toda comunicaci n con una base de datos tiene que ocurrir dentro de una transacci n El comportamiento auto commit para leer datos se debe evitar ya que hay muy poca probabilidad de que las transacciones peque as funcionen mejor que una unidad de trabajo definida claramente La ltima es mucho m s sostenible y extensible El patr n m s com n en una
101. 51 Cap tulo 9 Mapeo de herencias lt id gt lt discriminator column PAYMENT_TYPE type string gt lt property name amount column AMOUNT gt lt subclass name CreditCardPayment discriminator value CREDIT gt lt join table CREDIT_PAYMENT gt lt property name creditCardType column CCTYPE gt lt join gt lt subclass gt lt subclass name CashPayment discriminator value CASH gt lt subclass gt lt subclass name ChequePayment discriminator value CHEQUE gt lt subclass gt lt class gt Para cualquiera de estas estrategias de mapeo una asociaci n polim rfica a la clase ra z Payment es mapeada usando lt many to one gt lt many to one name payment column PAYMENT_ID class Payment gt 9 1 5 Tabla por clase concreta Hay dos maneras de mapear la tabla por estrategia de clase concreta La primera es utilizar lt union subclass gt lt class name Payment gt lt id name id type long column PAYMENT_ID gt lt generator class sequence gt lt id gt lt property name amount column AMOUNT gt lt union subclass name CreditCardPayment table CREDIT_PAYMENT gt lt property name creditCardType column CCTYPE gt lt union subclass gt lt union subclass name CashPayment table CASH_PAYMENT gt lt union subclass gt lt union subclass name ChequePayment table CHEQUE_PAYMENT gt lt union subclass gt lt class gt Ha
102. 67 Cap tulo 5 Mapeo O R B sico 00080 O default lazy truelfalse auto import truelfalse 000 package package name schema opcional El nombre de un esquema de la base de datos catalog opcional El nombre de un cat logo de la base de datos default cascade opcional por defecto es none Un estilo de cascada por defecto default access opcional por defecto es property La estrategia que Hibernate debe utilizar para acceder a todas las propiedades Puede ser una implementaci n personalizada de PropertyAccessor default lazy opcional por defecto es true El valor por defecto para los atributos lazy no especificados de mapeos de clase y de colecci n auto import opcional por defecto es true Especifica si podemos utilizar nombres de clases no calificados de clases en este mapeo en el lenguaje de consulta package opcional Especifica un prefijo de paquete que se debe utilizar para los nombres de clase no calificados en el documento de mapeo Si tiene dos clases persistentes con el mismo nombre sin calificar debe establecer auto import false Se presentar una excepci n si usted intenta asignar dos clases al mismo nombre importado El elemento hibernate mapping le permite anidar varios mapeos lt class gt persistentes como se mostr anteriormente Sin embargo es una buena pr ctica y algunas herramientas esperan que mapee s lamente una clase persistente o a una s la jerarqu
103. 9 Versi n OPCIONAl sasssa ana ii lc i 80 5 1 10 Timestamp OpciONal sessen EA T 81 SLT Propiedad earrainn E A E a 82 S112 Many AMO iii a a ES 84 SO A E ee eanaaatees 87 E AN A aE EEE E 89 5 1 15 Componente y componente dIN MICO ooocccccncoccconocnccncnncnncnnnnnnancnancnnnnnns 90 9 1 16 Propiedades viii land ca cade 91 5 1 17 SUDC ASO uri uti licita 92 9 118 JOINCO SUDCIASS lt A Ae 93 9 1 19 Uni n SUDC ASS ici tye Seueees ceded cciedielec iodides todas ieee 94 A JOM a ties sencieaicncsaeadedacealincyueieg salen vas cacetvagsancseees ATS 95 eZ IOV notaba 96 5 1 22 Los elementos columna y f rmula ooooococnccccnnncncnnnonncnncnnnnconononnancnnnancnnns 97 D123 IMPO esse POE E a 98 A ANY sz ccatobecdis avtscivinceadpoleteais eee fie div Aad ci ene eed 98 52 TIPOS de FIDCIM ALG ira a ibas ieee 100 5 2 1 Entidades y Valores ooocccooonccccononoccccnonoccnnnnnncncnnnnncnnnnnnncncnnnnncncnnnaninnnns 100 5 2 2 Tipos de valores b sicos 0oococccccocccccooncccconconononnnncnncnnnnnnnnnnananccnnnnncnnnnnns 101 5 2 3 Tipos de valor personalizados ooooccccoonccccononoccccnnnnccnonnnnconononnccnononacinnns 102 5 3 Mapeo de una clase M s de UNA VEZ coococccccccncoccnnnnnncnncnnnnnnnnnnnnancnnnnnnnnnnnnnannen 103 5 4 Identificadores SQL en comillas oooccconnnccccncoonnncocnnconnncnnonococncnnonncnnnncnannnos 104 5 5 Alternativas de MetadatoS coocccoccconcconnconnnonnonnnonnonnnonnnonnnnnnonononnnonn
104. Auditable Puede implementar el Interceptor directamente o extender el EmptyInterceptor package org hibernate test import java io Serializable import java util Date import java util Iterator import org hibernate EmptyInterceptor import org hibernate Transaction import org hibernate type Type public class AuditInterceptor extends EmptyInterceptor private int updates private int creates private int loads public void onDelete Object entity Serializable id Object state String propertyNames Type types do nothing public boolean onFlushDirty Object entity Serializable id Object currentState Object previousState String propertyNames Type types if entity instanceof Auditable updates for int i 0 i lt propertyNames length i if lastUpdateTimestamp equals propertyNames i 201 Cap tulo 13 Interceptores y currentState i new Date return true return false public boolean onLoad Object entity Serializable id Object state String propertyNames Type types if entity instanceof Auditable loads return false public boolean onSave Object entity Serializable id Object state String propertyNames Type types if entity instanceof Auditable ereatesi for int i 0 i lt propertyNames length i if createTimestamp equals propertyNames i state i new Dat
105. HIBERNATE Persistencia relacional para Java idiom tico 1 Documentaci n de referencia de Hibernate 3 5 6 Final por Gavin King Christian Bauer Max Rydahl Andersen Emmanuel Bernard y Steve Ebersole and thanks to James Cobb Graphic Design Cheyenne Weaver Graphic Design y Bernardo Antonio Buffa Colom amp x00e9 Prefaci ennn a a ee eai xi Ae TUTOM Al icono tidad daa 1 1 1 Parte 1 La primera aplicaci n Hibernate ooooocooncccccnccncnnnonnccccnnnnncnnnnancnccnnnnncnnns 1 TAT Configuraci n Lia dati egal 1 1 1 2 La primera C ase cic cc ccccctecscccctesscedctecsacaesens conato aman canadian cen hada a 3 1 1 3 El archivo de mapot oct iaa 4 1 1 4 Configuraci n de Hibernate ooooooonocccccccnccncnnnnonccnnnncnncnnnnanancnnnnn nc nn nnnnannan 7 1 1 5 Construcci n CON MAVEN coocoocccnccnnoncnnnnnnnnnnnncnnonnnnannnncnncnnnnnnnanancrnnnnnnnnnnnns 9 1 1 6 nicio Y ayydam es iii idad 10 1 1 7 Carga y almacenamiento de objetos ooococcnncncnconcccccnncnccnnnonanaconnnncnnn conan 11 1 2 Part 2 Mapeo de asociaciones cccooocccccnonoccconnnaccnonnnnncnnnnnncnnnnnnncncnonancncnnnanannns 14 1 2 1 Mapeo de la clase Person ooooooccccccnconccnnnoncnccnnnnncnnnnnnnncnnnnnnnnnnnnnancnnnancinns 14 1 2 2 Una asociaci n unidireccional basada en Set oooicicinicicoconocaconcnnccnnnnnnn 15 1 2 3 Trabajo de la asociaci n ooooooccicccnccccconncnconconcnnnnnnnancnnnancnnnnnnnanancnancnnnnnns 16 1 2 4 Colecci n de Val
106. INT not null firstName VARCHAR 255 initial CHAR 1 lastName VARCHAR 255 taxfileNumber VARCHAR 255 primary key id 310 Autor Obra alter table employment_periods add constraint employment_periodsFKO foreign key employer_id references employers alter table employment_periods add constraint employment_periodsFK1 foreign key employee_id references employees create sequence employee_id_seq create sequence employment_id_seq create sequence employer_id_seq 24 2 Autor Obra Considere el siguiente modelo de las relaciones entre Work Author y Person En el ejemplo representamos la relaci n entre work y Author como una asociaci n muchos a muchos y la relaci n entre Author y Person como una asociaci n uno a uno Otra posibilidad ser a que Author extendiera Person id id long id long title String alias String name String getidd long d getld long setldi _id long setldi_id long setldi_id long getAuthors Set getWorksd Set getNameb String setAuthorstemployees Set setWorkslemployers Set setNamel_name String getTitled String getPerson Person setTitleltitle String setPersoniperson Persom getAlias String setAliasCalias String tempo float getGenred String setGenrel_genre String getTempod float setTempoltempo float getText int setText textiint El siguiente documento de mapeo represe
107. Las clases persistentes aqu representan un weblog y un item publicado en un weblog Van a ser modelados como una relaci n padre hijo est ndar pero usaremos un bag ordenado en lugar de un conjunto package eg import java util List public class Blog private Long _id private String _name private List _items public Long getId return _id public List getitems 1 return _items public String getName return _name public void setId Long longl id longl public void setlitems List list _items list public void setName String string _name string package eg import java text DateFormat import java util Calendar public class Blogltem private Long _id private Calendar _datetime private String _text private String title private Blog _blog public Blog getBlog return _blog 301 Cap tulo 23 Ejemplo Aplicac public Calendar getDatetime return _datetime public Long getld return _id public String getText return _text public String getTitle return _title public void setBlog Blog blog blog blog public void setDatetime Calendar calendar _datetime calendar public void setId Long longl id longi public void setText String string _text string public void setTitle String string title string 23 2 Mapeos de Hibernate Los mapeos XML ahora debe
108. Name like lastName Es til combinar esta funcionalidad con la operaci n replicate de Hibernate para implementar la importaci n exportaci n de datos basada en XML 263 264 Mejoramiento del rendimiento 20 1 Estrategias de recuperaci n Hibernate utiliza una estrategia de recuperaci n para recuperar los objetos asociados cuando la aplicaci n necesita navegar la asociaci n Las estrategias de recuperaci n se pueden declarar en los metadatos de mapeo O R o se pueden sobrescribir por medio de una HQL particular o una petici n Criteria Hibernate3 define las siguientes estrategias de recuperaci n e Recuperaci n por uni n join fetching Hibernate recupera la instancia asociada o la colecci n en el mismo SELECT utilizando un OUTER JOIN e Recuperaci n por selecci n select fetching se utiliza un segundo SELECT para recuperar la entidad o colecci n asocidas A menos que deshabilite expl citamente la recuperaci n perezosa especificando lazy false la segunda selecci n s lo ser ejecutada cuando acceda a la asociaci n e Recuperaci n por subselecci n subselect fetching se utiliza un segundo SELECT para recuperar las colecciones asociadas de todas las entidades recuperadas en una consulta o recuperaci n previa A menos de que deshabilite expl citamente la recuperaci n perezosa especificando lazy false esta segunda selecci n s lo se ejecutar cuando acced
109. PersonAddress personld bigint not null addressId bigint not null personld addressId create table Address addressId bigint not null primary key primary key 138 Mapeos de asociaci n m s complejos 7 6 Mapeos de asociaci n m s complejos Uniones de asociaci n m s complejas son extremadamente raras Hibernate maneja situaciones m s complejas utilizando fragmentos SQL incluidos en el documento de mapeo Por ejemplo si una tabla con datos hist ricos de informaci n de cuenta define las columnas accountNumber ffectiveEndDate Y effectiveStartDate se mapear an as lt properties name currentAccountKey gt lt property name accountNumber type string not null true gt lt property name currentAccount type boolean gt lt formula gt case when effectiveEndDate is null then 1 else 0 end lt formula gt lt property gt lt properties gt lt property name effectiveEndDate type date gt lt property name effectiveStateDate type date not null true gt Entonces puede mapear una asociaci n a la instancia actual la que tiene effectiveEndDat nulo utilizando lt many to one name currentAccountInfo property ref currentAccountKey class AccountInfo gt lt column name accountNumber gt lt formula gt 1 lt formula gt lt many to one gt En un ejemplo m s complejo imag nese que la asociaci n entre Employee Y Organization Se mantienen en una tabla Em
110. Region frontpages ESO Si quiere forzar que el cach de peticiones actualice una de sus regiones olv dese de cualquier resultado en cach que se encuentre all puede utilizar org hibernate Query setCacheMode CacheMode REFRESH Junto con la regi n que ha definido para la petici n dada Hibernate forzar selectivamente los resultados en cach en esa regi n en particular que se va a actualizar Esto es particularmente til en casos donde los datos subyacentes pueden haber sido actualizados por medio de un proceso separado y esta es una alternativa m s eficiente que la expulsi n en masa de una regi n por medio de org hibernate SessionFactory evictQueries 20 5 Comprensi n del rendimiento de Colecciones En las secciones anteriores hemos abordado las colecciones y sus aplicaciones En esta secci n exploramos algunos puntos en relaci n con las colecciones en tiempo de ejecuci n 20 5 1 Taxonom a Hibernate define tres tipos b sicos de colecciones colecciones de valores Asociaciones uno a muchos Aociaciones muchos a muchos Esta clasificaci n distingue las varias tablas y relaciones de clave for nea pero no nos dice absolutamente todo lo que necesitamos saber sobre el modelo relacional Para entender completamente la estructura relacional y las caracter sticas de rendimiento debemos considerar la estructura de la clave primaria que Hibernate utiliza para actualizar o borrar filas de colecc
111. S Var iOS ccc essen reece ee eater ee aaee eres ania eeeeaaaeeeeeaaeeeeeeaaeeees 309 24 1 Empleador Empleado ooooccccccccccononoccccnncnccnnnonnancnnnnncnnononnanannrnnnnnnnnnnanancnnnnncnnns 309 24 2 AUTOM ODE ssiecosiseverercadseneceassenevvaaduncrsdaesdaciaassacesbausadccasduaccsdbysuaccasiudectaseaetiaess 311 24 3 Cliente Orden Producto ccoooocccccononnccnnconnncnononnnnnnonnnnnnncnnnnnnncnnnnnnnrnnnnnnnrnnonnneos 313 24 4 Mapeos varios de ejemplo oooccccconnccccnnncccnnnnnnccnonnnnccnnnnnnccnnnnanccnnnnancnnnnnancnnns 315 HIBERNATE Persistencia rela 24 4 1 Asociaci n uno a uno Tipificada oooooooocccinncncccoccnncnconnnncn nono nnnnnnnnancnnna 315 24 4 2 Ejemplo de clave compuesta ccccoooncccccnnnoccconnnaccnononaccconnnnccnonnnnccnnnnnnccnns 315 24 4 3 Muchos a muchos con atributo compartido de clave compuesta 318 24 4 4 Discriminaci n basada en contenido cccccoooccccconoccnnnnnncnnnnnancnnnonancnnns 318 24 4 5 Asociaciones sobre claves alternativas oooooncccnconcccnnnnnnccnnnnnnccnnnnnnnons 319 25 Pr cticas recomendadas ooooocnccnccoccccconococonononononononnconnnnnnnnnnnnancnnnnnnnnnnnnnanennnnnos 321 26 Consideraciones de la portabilidad de la base de datos ooooooccccccocccncnnnnos 325 26 1 Aspectos b sicos de la portabilidad ooonnoonnnnncncinnnncicnccnccnccncancnnnnonennnancnncnnns 325 26 2 26 3 26 4 26 5 26 6 Ref
112. SON_ID els lt join table ADDRESS gt lt key column ADDRESS_ID gt lt property name address gt lt property name zip gt lt property name country gt lt join frecuencia esta funcionalidad s lamente es til para los modelos de datos heredados omendamos menos tablas que clases y un modelo de dominio m s detallado Sin embargo es til para cambiar entre estrategias de mapeo de herencias en una misma jerarqu a como se expl 5 1 Has que ica m s adelante 21 Key ta ahora hemos visto el elemento lt key gt unas cuantas veces Aparece en cualquier sitio en el elemento padre de mapeo defina una uni n a una nueva tabla que referencie la clave principal de la tabla original Tambi n define la clave for nea en la tabla unida lt key column columnname on delete noaction cascade property ref propertyName 00090 not null truel false 96 Los elementos columna y f rmula O O O 868 8 86 update true false 6 unique true false column opcional El nombre de la columna de la clave foranea Esto tambi n se puede especificar por medio de uno o varios elementos anidados lt column gt on delete opcional por defecto es noact ion Especifica si la restricci n de clave for nea tiene el borrado en cascada activado a nivel de base de datos property ref opcional Especifica que la clave for nea referencia columnas que no son la clave principal de la tabla ori
113. TIONS 000 ee cee niiin iik ee AEA NRA ERAN 183 12 Transacciones Y concurrencia 2 0 0 cece ee ttee eee e eee ee senna ee eeaaaeeeeeaaeeeeeeaaeeees 185 12 1 mbitos de sesi n y de transacci n ccccccccccscssescssescscsecstsesecsteasessneetensens 185 vi 12 1 1 Unidad de trabajo coiconi cia oia eens 186 12 1 2 Conversaciones largaS oooocccccncccoconococcnncnncnnnonnnncnnnnncn aa abaa 187 12 1 3 Consideraci n de la identidad del objeto oooonoiccnnnnnicnconicccinnnnccnnnnnnnnn 188 12 1 4 TEMAS COM NES 2000 ea 189 12 2 Demarcaci n de la transacci n de la base de datos ooocccccconncccccnccccnnnonccncinns 189 12 2 1 Entorno no adMinisStradO oooonccccconnccnnnnnoccnnnnnncnnnnnnncnnnnnnnccnnnnnnccnn anna 190 12 2 2 Utilizaci n de JTA cdas ia it ini iria 192 12 2 3 Manejo de excepciones coooooccccnonocccononaccnononnccnonnnncnnnnnnncnnnnnnncncnnnancnnns 193 12 2 4 Tiempo de espera de la transacci n ococcnncccnconnccccnnnoncnnnnnnnaccnnnancnnnnnns 194 12 3 Control de concurrencia optimista oooooccdnnnnnnnconncoccnnnnccnnnonnnnconcancn nn nn nnanannnano 195 12 3 1 Chequeo de versiones de la aplicaci n ooonidicnnnnnonconnccccnnnnncnnnonncnnnnn 195 12 3 2 Sesi n extendida y versionado autom tico ooocooocococnccnccnconcnnnnancnnnancnnns 196 12 3 3 Objetos separados y versionado autom tico ccooooococncinccnconcnnnnancnnnancnnns 197 12 3 4 Personalizaci n del versionado autom ti
114. TS addScalar ID Hibernate LONG addScalar NAME addScalar BIRTHDATE Esto es esencialmente la misma consulta que antes pero ahora se utiliza ResultSetMetaData para determinar el tipo de NOMBRE y FECHA DE NACIMIENTO mientras que el tipo de IDENTIFICACION se especifica explicitamente El dialecto controla la manera en que los java sql Types retornados de ResultSetMetaData se mapean a los tipos de Hibernate Si un tipo en especial no se encuentra mapeado o no resulta en el tipo esperado es posible personalizarlo por medio de llamadas a registerHibernateType en el dialecto 17 1 2 Consultas de entidades Todas las consultas anteriores eran sobre los valores escalraes devueltos basicamente devolviendo los valores crudos desde el grupo resultado Lo siguiente muestra como obtener los objetos entidades desde una consulta sql nativa por medio de addEntity sess createSQLQuery SELECT FROM CATS addEntity Cat class sess createSQLQuery SELECT ID NAME BIRTHDATE FROM CATS addEntity Cat class Se especifica esta consulta e la cadena de consulta SQL e la entidad devuelta por la consulta Asumiendo que Cat es mapeado como una clase con las columnas IDENTIFICACION NOMBRE y FECHA DE NACIMIENTO las consultas anteriores devolver n una Lista en donde cada elemento es una entidad Cat Si la entidad es mapeada con una many to one a otra entidad tambien se necesita que devuelva esto cuando realice una consulta nat
115. Trabajo con objetos DomesticCat fritz new DomesticCat fritz setColor Color GINGER fritz setSex M fritz setName Fritz Long generatedId Long sess save fritz Si Cat tiene un identificador generado el identificador es generado y asignado al cat cuando se llama a save Si Cat tiene un identificador assigned o una clave compuesta el identificador debe ser asignado a la instancia de cat antes de llamar a save Tambi n puede utilizar persist en vez de save con la sem ntica definida en el borrador de EJB3 e persist hace que una instancia transitoria sea persistente Sin embargo no garantiza que el valor identificador sea asignado a la instancia persistente inmediatamente la tarea puede tener lugar durante el vaciado persist tambi n garantiza que no ejecutar una declaraci n INSERT si se llama por fuera de los l mites de una transacci n Esto es til en conversaciones largas con un contexto extendido sesi n persistencia save s garantiza el retorno de un identificador Si se tiene que ejecutar un INSERT para obtener el identificador por ejemplo generador identidad no secuencia este INSERT tiene lugar inmediatamente sin importar si se encuentra dentro o fuera de una transacci n Esto es problem tico en una conversaci n larga con un contexto extendido sesi n persistencia Opcionalmente puede asignar el identificador utilizando una versi n sobrecargada de save Dom
116. a JNDI simplemente que ambos utilizan el mismo registro Si desea tener la SessionFactory vinculada a un espacio de nombres de JNDI especifique un nombre por ejemplo java hibernate SessionFactory utilizando la propiedad hibernate session_factory_name Si se omite esta propiedad la SessionFactory no ser vinculada a JNDI Esto es particularmente til en entornos con una implementaci n JNDI de s lo lectura por defecto por ejemplo en Tomcat Al vincular la SessionFactory a JNDI Hibernate utilizar los valores de hibernate jndi url hibernate jndi class para instanciar un contexto inicial Si stos no se especifican se utilizar el InitialContext por defecto Hibernate colocar autom ticamente la SessionFactory en JNDI despu s de que llame a cfg buildSessionFactory Esto significa que tendr al menos esta llamada en alg n c digo 50 Administraci n de contexto de Sesi n Actual con JTA de inicio o clase de utilidad en su aplicaci n a menos de que utilice el despliegue JMX con el HibernateService esto se discute m s adelante en mayor detalle Si utiliza una SessionFactory JNDI un EJB or cualquier otra clase puede llegar a obtener el SessionFactory Utilizando una b squeda JNDI Le recomendamos que vincule el SessionFactory a JNDI en un entorno administrado y que de otra manera use un singleton static Para proteger su c digo de aplicaci n de estos detalles tambi n le recomendamos que esconda el c digo
117. a a la asociaci n e Recuperaci n en lote una estrategia de optimizaci n para la recuperaci n por selecci n Hibernate recupera un lote de instancias de entidad o colecciones en un solo SELECT especificando una lista de claves principales o de claves for neas Hibernate tambi n distingue entre e Recuperaci n inmediata una asociaci n colecci n o atributo se recupera inmediatamente cuando se carga el due o e Recuperaci n perezosa de colecciones una colecci n se recupera cuando la aplicaci n invoca una operaci n sobre esa colecci n Este es el valor predeterminado para las colecciones e Recuperaci n de colecci n extra perezoza se accede a elementos individuales desde la base de datos cuando se necesita Hibernate intenta no recuperar toda la colecci n en la memoria a menos de que sea absolutamente necesario Esto es apropiado para colecciones muy grandes e Recuperaci n por proxy una asociaci n monovaluada se recupera cuando se invoca un m todo que no sea el getter del identificador sobre el objeto asociado 265 Cap tulo 20 Mejoramiento del e Recuperaci n no proxy una asociaci n monovaluada se recupera cuando se accede a la variable de la instancia Comparado con la recuperaci n por proxy este enfoque es menos perezozo la asociaci n se recupera cuando se accede s lamente al identificador Tambi n es m s transparente ya que para la aplicaci n no hay proxies visib
118. a base de datos de parte de su aplicaci n as que necesita saber c mo obtener conexiones Para este tutorial vamos a utilizar un pool de conexiones aut nomo opuesto a javax sql DataSource Hibernate viene con soporte para dos pools de conexiones JDBC de c digo abierto de terceros c3p0 https sourceforge net projects c3p0 y proxool http Cap tulo 1 Tutorial proxool sourceforge net Sin embargo vamos a utilizar el pool de conexiones incluido de Hibernate para este tutorial Para la configuraci n de Hibernate podemos utilizar un archivo hibernate properties simple un archivo hibernate cfg xml un poco m s sofisticado o incluso una configuraci n completamente program tica La mayor a de los usuarios prefieren el archivo de configuraci n XML lt xml version 1 0 encoding utf 8 gt lt DOCTYPE hibernate configuration PUBLIC _ Hibernate Hibernate Configuration DID 3 0 EN http hibernate sourceforge net hibernate configuration 3 0 dtd gt lt hibernate configuration gt lt session factory gt lt Database connection settings gt lt property name connection driver_class gt org hsqldb jdbcDriver lt property gt lt property name connection url gt jdbc hsqldb hsql localhost lt property gt lt property name connection username gt sa lt property gt lt property name connection password gt lt property gt lt i JDBC connection pool tase the b ilt
119. a de una columna lt property name zip length 5 gt lt property name balance precision 12 scale 2 gt Algunas etiquetas tambi n aceptan un atributo not nul1 para generar una restricci n NOT NULL en columnas de tablas y un atributo unique para generar restricciones UNIQUE en columnas de tablas lt many to one name bar column barIld not null true gt lt element column serialNumber type long not null true unique true gt Se puede usar un atributo unique key para agrupar columnas en una restricci n de clave nica Actualmente el valor especificado del atributo unique keyno se utiliza para nombrar la restricci n en el DDL generado S lamente se utiliza para agrupar las columnas en el archivo de mapeo lt many to one name org column orgld unique key 0rgEmployeeld gt lt property name employeeld unique key 0rgEmployee gt Un atributo index especifica el nombre de un ndice que se crear utilizando la columa o las columnas mapeadas Se pueden ser agrupar m ltiples columnas bajo el mismo indice simplemente especificando el mismo nombre de ndice lt property name lastName index CustName gt lt property name firstName index CustName gt Un atributo foreign key se puede utilizar para sobreescribir el nombre de cualquier restricci n de clave for nea generada lt many to one name bar column barld foreign key FKFooBar gt 288 Personalizaci n del esquema
120. a nueva instancia de Criteria que se refiere a los elementos de la colecci n kittens Hay una alternativa que es til en ciertas circunstancias List cats sess createCriteria Cat class CreateAlias kittens kt CreateAlias mate mt add Restrictions eqProperty kt name mt name List createAlias no crea una nueva instancia de Criteria Las colecciones de gatitos de las instancias cat retornadas por las dos consultas previas no est n prefiltradas por los criterios Si desea recuperar s lo los gatitos que coincidan con los criterios debe usar un ResultTransformer List cats sess createCriteria Cat class CreateCriteria kittens kt add Restrictions eq name F setResultTransformer Criteria ALIAS_TO_ENTITY_MAP ads 0 Iterator iter cats iterator while iter hasNext Map map Map iter next Cat cat Cat map get Criteria ROOT_ALIAS Cat kitten Cat map get kt Adicionalmente puede manipular el grupo de resultados utilizando una uni n externa izquierda List cats session createCriteria Cat class CreateAlias mate mt Criteria LEFT_JOIN Restrictions like mt name goods addOrder Order asc mt age 235 Cap tulo 16 Consultas por cr List Esto retornar todos los cats gatos con una pareja cuyo nombre empiece por good ordenado de acuerdo a la edad de la pareja y todos los cats gatos que no tengan una pareja
121. a por subclase Un mapeo de tabla por subclase se ver a as lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT_ID gt lt generator class native gt lt id gt lt property name amount column AMOUNT gt lt joined subclass name CreditCardPayment table CREDIT_PAYMENT gt lt key column PAYMENT_ID gt lt property name creditCardType column CCTYPE gt lt joined subclass gt lt joined subclass name CashPayment table CASH_PAYMENT gt lt key column PAYMENT_ID gt lt joined subclass gt lt joined subclass name ChequePayment table CHEQUE_PAYMENT gt lt key column PAYMENT_ID gt lt joined subclass gt lt class gt Se necesitan cuatro tablas Las tres tablas de subclase tienen asociaciones de clave principal a la tabla de superclase de modo que en el modelo relacional es realmente una asociaci n uno a uno 150 Tabla por subclase utilizando un discriminador 9 1 3 Tabla por subclase utilizando un discriminador La implementaci n de Hibernate de tabla por subclase no requiere ninguna columna discriminadora Otros mapeadores objeto relacional usan una implementaci n diferente de tabla por subclase que necesita una columna discriminadora de tipo en la tabla de superclase Este enfoque es mucho m s dif cil de implementar pero discutiblemente m s correcto desde un punto de vista relacional Si quisiere utilizar una columna discriminadora co
122. a propiedad se encuentre desactualizada 83 Cap tulo 5 Mapeo O R B sico generated opcional por defecto es never Especifica que este valor de la propiedad es de hecho generado por la base de datos Consulte discusi n sobre las propiedades generadas para obtener mayor informaci n escribanombre puede ser 1 Elnombre de un tipo b sico de Hibernate integer string character date timestamp float binary serializable object blob etc 2 El nombre de una clase Java con un tipo b sico predeterminado int float char java lang String java util Date java lang Integer java sql Clob etc 3 El nombre de una clase Java serializable 4 El nombre declase de un tipo personalizado com illflow type MyCustomType etc Si no especifica un tipo Hibernate utilizar reflecci n sobre la propiedad mencionada para deducir el tipo Hibernate correcto Hibernate intentar interpretar el nombre de la clase de retorno del getter de la propiedad utilizando las reglas 2 3 y 4 en ese mismo orden En algunos casos necesitar el atributo type Por ejemplo para distinguir entre Hibernate DATE y Hibernate TIMESTAMP O especificar un tipo personalizado El atributo access le permite controlar el c mo Hibernate acceder a la propiedad en tiempo de ejecuci n Por defecto Hibernate llamar al par de getter setter de la propiedad Si usted especifica access field Hibernate se saltar el par get set y acceder al
123. acheMode IGNORE scroll ScrollMode FORWARD_ONLY int count 0 while customers next Customer customer Customer customers get 0 customer updateStuff Tf Gt tcount s 20 0 9 flush a batch of updates and release memory session flush session clear tx commit 7 session close 14 3 La interfaz de Sesion sin Estado Opcionalmente Hibernate proporciona una API orientada a comandos que se puede utilizar para datos que concurren desde y hacia la base de datos en forma de objetos separados Un StatelessSession NO tiene un contexto de persistencia asociado con l y no proporciona mucha de la sem ntica a un alto nivel de ciclo de vida En particular una sesi n sin estado no implementa un cach en primer nivel y tampoco interact a con cach s de segundo nivel o de peticiones No implementa escritura retrasada transaccional o chequeo de desactualizaciones autom tico Las operaciones realizadas con la utilizaci n de una sesi n sin estado nunca usan cascadas para las instancias asociadas La sesi n sin estado ignora las colecciones Las operaciones llevadas a cabo por una sesi n sin estado ignoran el modelo de evento y los interceptores de Hibernte 208 Operaciones de estilo DML Las sesiones sin estado son vulnerables a efectos de sobrenombamiento de datos debido a la falta de un cach de primer nivel Una sesi n sin estado es una abstracci n en un nivel m s bajo mucho m s cerca del
124. aci n Sin embargo usualmente no manipulamos la identidad de un objeto por lo tanto el m todo setter debe ser privado S lamente Hibernate asignar identificadores cuando se guarde un objeto Como se puede ver Hibernate puede acceder a m todos de acceso p blicos privados y protegidos as como tambi n a campos directamente p blicos privados y protegidos Puede escoger y hacer que se ajuste a su dise o de su aplicaci n El constructor sin argumentos es un requerimiento para todas las clases persistentes Hibernate tiene que crear objetos por usted utilizando Java Reflection El constructor puede ser privado sin embargo se necesita la visibilidad del paquete para generar proxies en tiempo de ejecuci n y para la recuperaci n de datos de manera efectiva sin la instrumentaci n del c digo byte Duarde este archivo en el directorio src main java org hibernate tutorial domain 1 1 3 El archivo de mapeo Hibernate necesita saber c mo cargar y almacenar objetos de la clase persistente En este punto es donde entra en juego el archivo de mapeo de Hibernate Este archivo le dice a Hibernate a que tabla tiene que acceder en la base de datos y que columnas debe utilizar en esta tabla La estructura b sica de un archivo de mapeo se ve as lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC _ Hibernate Hibernate Mapping DTD 3 0 EN El archivo de mapeo http hibernate sourceforge net hibernate mapping 3 0
125. actory getCurrentSession save theEvent El servlet se encuentra completo Un pedido al servlet ser procesado en una sola Session y Transaction Como lo vimos antes en la aplicaci n aut noma Hibernate puede enlazar autom ticamente estos objetos al hilo actual de ejecuci n Esto le da la libertad de utilizar capas en su c digo y acceder a la SessionFactory de cualquier manera que lo desee Usualmente usted utilizar a un dise o m s sofisticado y mover a el c digo de acceso de datos a los objetos de acceso de datos el patr n DAO Refi rase al Wiki de Hibernate para ver m s ejemplos 1 3 3 Despliegue y prueba Para implementar esta aplicaci n para prueba debemos crear una Web ARchive WAR Primero debemos definir el descriptor WAR como src main webapp WEB INF web xml lt xml version 1 0 encoding UTF 8 gt lt web app version 2 4 xmlns http java sun com xml ns j2ee xmlns xsi http www w3 org 2001 XMLSchema instance 25 Cap tulo 1 Tutorial xsi schemaLocation http java sun com xml ns j2ee http java sun com xml ns 3j2ee web app 2 4 xsdi gt lt servlet gt lt servlet name gt Event Manager lt servlet name gt lt servilet crass gt org hibernate tutorial web EventManagerServlet lt servlet class gt lt servlet gt lt servlet mapping gt lt servlet name gt Event Manager lt servlet name gt lt ur li pateern gt eventmanager lt url pattern gt lt servlet mappin
126. addressId not null true gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt set name people inverse true gt lt key column addressId gt lt one to many class Person gt lt set gt lt class gt create table Person personId bigint not null primary key addressId bigint not null create table Address addressId bigint not null primary key Si utiliza un List u otra colecci n con ndice configure la columna key de la clave for nea como not null Hibernate administrar la asociaci n del lado de las colecciones para 134 Uno a uno mantener el ndice de cada elemento haciendo del otro lado virtualmente inverso al establecer update false Y insert false lt class name Person gt lt id name id gt lt many to one name address column addressld not null true insert false update false gt lt class gt lt class name Address gt lt id name id gt lt list name people gt lt key column addressId not null true gt lt list index column peopleldx gt lt one to many class Person gt Sc lt class gt Es importante que defina not null true en el elemento lt key gt del mapeo de la colecci n si la columna de la clave for nea es Not NULL No declare s lamente not null true en un elemento lt column gt posiblemente anidado sino en el elemento lt
127. al_puts Optimiza la operaci n del cach de segundo nivel para minimizar escrituras con el costo de lecturas m s frecuentes Esta configuraci n es m s til para cach s en cl ster y en Hibernate3 est habilitado por defecto para implementaciones de cach en cl ster e g true false hibernate cache use_query_cache Habilita el cach de consultas Las consultas individuales todav a tienen que establecerse con cach s e g true false hibernate cache use_second_level_cache Se puede utilizar para deshabilitar por completo el cach de segundo nivel que est habilitado por defecto para clases que especifican un mapeo lt cache gt e g true false hibernate cache query_cache_factory El nombre de clase de una interfaz QueryCache personalizada por defecto al StandardQueryCache incorporado e g classname of QueryCach hibernate cache region_prefix Un prefijo que se debe utilizar para los nombres de regi n del cach de segundo nivel e g prefix hibernate cache use_structured_entries Obliga a Hibernate a almacenar los datos en el cach de segundo nivel en un formato m s amigable para personas 41 Cap tulo 3 Configuraci n Nombre de la propiedad Prop sito e g true false Tabla 3 6 Propiedades de Transacci n de Hibernate Nombre de la propiedad Prop sito hibernate transaction factory_class El nombre de clase de un TransactionFactory a utilizar con la API de Transaction de Hibern
128. alidad in the first session Cat cat Cat firstSession load Cat class catID in a higher tier of the application Cat mate new Cat cat setMate mate later in a new session secondSession saveOrUpdate cat update existing state cat has a non null id secondSession saveOrUpdate mate save the new instance mate has a null id La utilizaci n y sem ntica de saveOrUpdate parece ser confuso para los usuarios nuevos Primero en tanto no est tratando de utilizar instancias de una sesi n en otra sesi n nueva no debe necesitar usar update saveOrUpdate Omerge Algunas aplicaciones enteras nunca usar n ninguno de estos m todos Usualmente update O saveOrUpdate se utilizan en el siguiente escenario e la aplicaci n carga un objeto en la primera sesi n el objeto se pasa a la capa de UI se realizan algunas modificaciones al objeto e el objeto se pasa abajo de regreso a la capa l gica de negocios e la aplicaci n hace estas modificaciones persistentes llamando a update en una segunda sesi n saveOrUpdate hace lo siguiente e si el objeto ya es persistente en esta sesi n no haga nada e si otro objeto asociado con la sesi n tiene el mismo identificador lance una excepci n e si el objeto no tiene ninguna propiedad identificadora gu rdelo llamando a save e si el identificador del objeto tiene el valor asignado a un objeto reci n instanciado gu rdelo llamando a
129. am gt lt generator gt lt Ld gt lt property name startDate column start_date gt lt property name endDate column end_date gt lt component name hourlyRate class MonetaryAmount gt lt property name amount gt 309 Cap tulo 24 Ejemplo mapeos lt column name hourly_rate sql type NUMERIC 12 2 gt lt property gt lt property name currency length 12 gt lt component gt lt many to one name employer column employer_id not null true gt lt many to one name employee column employee_id not null true gt lt class gt lt class name Employee table employees gt lt id name id gt lt generator class sequence gt lt param name sequence gt employee_id_seq lt param gt lt generator gt lt td gt lt property name taxfileNumber gt lt component name name class Name gt lt property name firstName gt lt property name initial gt lt property name lastName gt lt component gt lt class gt lt hibernate mapping gt Este es el esquema de tablas generado por SchemaExport create table employers id BIGINT not null name VARCHAR 255 primary key id create table employment_periods id BIGINT not null hourly_rate NUMERIC 12 2 currency VARCHAR 12 employee_id BIGINT not null employer_id BIGINT not null end_date TIMESTAMP start_date TIMESTAMP primary key id create table employees id BIG
130. ame String name this name name 4 3 Implementando equais Y nashcode Tiene que sobrescribir los m todos equals y hashCode Si piensa poner instancias de clases persistentes en un set la forma recomendada de representar asociaciones multivaluadas y piensa utilizar reasociaci n de instancias separadas Hibernate garantiza la equivalencia de identidad persistente fila de base de datos y de identidad Java s lamente dentro del mbito de una sesi n en particular De modo que en el momento en que mezcla instancias recuperadas en sesiones diferentes tiene que implementar equals y hashCode si desea tener una sem ntica significativa para sets La forma m s obvia es implementar equals hashCode comparando el valor identificador de ambos objetos Si el valor es el mismo ambos deben ser la misma fila de la base de datos ya que son iguales Si ambos son agregados a un set s lo tendremos un elemento en el set Desafortunadamente no puede utilizar este enfoque con identificadores generados Hibernate s lo asignar valores identificadores a objetos que son persistentes una instancia reci n creada no tendr ning n valor identificador Adem s si una instancia no se encuentra guardada y est actualmente en un set al guardarla se asignar un valor identificador al objeto Si equals y hashCode est n basados en el valor identificador el c digo hash podr a cambiar rompiendo el contrato del set Consu
131. ame id type long column CHEQUE_PAYMENT_ID gt lt generator class native gt lt id gt lt property name amount column CHEQUE_AMOUNT gt lt class gt Observe que la interfaz Payment no se menciona explicitamente Tambi n note que las propiedades de Payment se mapean en cada una de las subclases Si quiere evitar la duplicaci n considere el usar entidades XML por ejemplo lt ENTITY allproperties SYSTEM allproperties xml gt en la declaraci n DOCTYPE Y amp allproperties en el mapeo La desventaja de este enfoque es que Hibernate no genera uniones de SQL al realizar consultas polimdrficas Para esta estrategia de mapeo una asociaci n polim rfica a Payment es mapeada generalmente utilizando lt any gt 153 Cap tulo 9 Mapeo de herencias lt any name payment meta type string id type long gt lt meta value value CREDIT class CreditCardPayment gt lt meta value value CASH class CashPayment gt lt meta value value CHEQUE class ChequePayment gt lt column name PAYMENT_CLASS gt lt column name PAYMENT_ID gt lt any gt 9 1 7 Mezcla de polimorfismo implicito con otros mapeos de herencia Ya que las subclases se mapean cada una en su propio elemento lt class gt y debido a que Payment es s lo una interfaz cada una de las subclases podria ser f cilmente parte de otra jerarqu a de herencia Todav a puede seguir usando consultas polim rficas c
132. amente diferentes en la consulta anterior 15 10 Expresiones Las expresiones utilizadas en la cl usula where incluyen lo siguiente Operadores matem ticos operadores de comparaci n binarios gt lt lt gt like operadores l gicos and or not e Par ntesis que indican agrupaci n e in not in between is null is not null is empty is not empty member of Y not member of Caso simple Case when then else end Y Caso buscado case when then else end e concatenaci n de cadenas Oconcat current_date current_time Y current_timestamp second minute hour day month and year e Cualquier funci n u operador definido por EJB QL 3 0 substring trim lower upper length locate abs sqrt bit_length mod 221 Cap tulo 15 HQL El lenguaje e coalesce y nullif str para convertir valores num ricos o temporales a una cadena legible e cast as donde el segundo argumento es el nombre de un tipo de Hibernate y extract from Sicast Y extract es soportado por la base de datos subyacente e lafunci n index de HQL que se aplica a alias de una colecci n indexada unida e Las funciones de HQL que tomen expresiones de ruta valuadas en colecciones size minelement maxelement minindex maxindex junto con las funciones es
133. anterior Para las consultas relacionadas con mapeos m s complejos como propiedades compuestas discriminadores de herencia colecciones etc existen alias especificos a utilizar para permitir que Hibernate inyecte los alias apropiados La siguiente tabla muestra las diferentes maneras de utilizar la inyecci n de alias Note que los nombres alias en el resultado son simplemente ejemplos cada alias tendr un nombre nico y probablemente diferente cuando se utilice 244 Devoluci n de entidades no administradas Tabla 17 1 Nombres con inyecci n alias Descripci n Sintaxis Ejemplo Una propiedad aliasname A_NAME as item name simple propertyname Una propiedad aliasname CURRENCY as item amount currency VALUE compuesta componentname as item amount value propertyname Discriminador de una entidad Todas las propiedades de una entidad Una clave de colecci n La identificaci n id de una colecci n aliasname aliasname aliasname cl key aliasname id DISC as item class item ORGID EMPID as coll key as coll id El elemento de una colecci n aliasname el em eh as coll element propiedad del elemento en la colecci n Todas las propiedades del elemeto en la colecci n Todas las propiedades de la colecci n propertyname aliasname el em NAME as coll element name alia
134. ap tulo 12 Transacciones y concurrencia for more information about transaction handling and demarcation The previous example also skipped any error handling and rollback Para ejecutar esto utilizaremos el plugin de ejecuci n Maven para llamar nuestra clase con la configuraci n de ruta de clase necesaria mvn exec java Dexec mainClass org hibernate tutorial EventManager Dexec args store Nota Es posible que primero necesite realizar mvn compile Debe ver que Hibernate inicia y dependiendo de su configuraci n tambi n ver bastantes salidas de registro Al final ver la siguiente l nea java Hibernate insert into EVENTS EVENT_DATE title EVENT_ID values Este es el INSERT que Hibernate ejecuta Para listar los eventos almacenados se agrega una opci n al m todo principal if args 90 eguals store mgr createAndStoreEvent My Event new Date else if args 0 equals list List events mgr listEvents for int 1 0 1 lt events size aft f Event theEvent Event events get i System out println Event theEvent getTitle Time theEvent getDate i 13 Cap tulo 1 Tutorial Tambi n agregamos un m todo listEvents private List listEvents Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction List result session createQuery from Event list session getTransaction
135. apas de Java Los nombres de propiedades son construcciones puramente l gicas a las que se puede hacer referencia en consultas HQL 19 2 Mapeo de metadatos XML Muchos elementos de mapeo de Hibernate aceptan el atributo node Esto le permite especificar el nombre de un atributo o elemento XML que contenga los datos de la propiedad o entidad El formato del atributo node tiene que ser uno de los siguientes e element name mapea al elemento XML mencionado e attribute name mapea al atributo XML mencionado e mapea al elemento padre e element name fattribute name mapea al atributo mencionado del elemento nombrado Para las colecciones y asociaciones monovaluadas existe un atributo adicional embed xm1 Si mbed xml true el cual es el valor por defecto el rbol XML para la entidad asociada o colecci n de tipo de valor ser incluida directamente en el rbol XML para la entidad que 260 Mapeo de metadatos XML posee la asociaci n De otra manera Si embed xm1 false entonces s lo el valor identificador referenciado aparecer en el XML para asociaciones de punto nico y para las colecciones simplemente no aparecer No deje embed xm1 true para demasiadas asociaciones ya que XML no se ocupa bien de la circularidad lt class name Customer table CUSTOMER node customer gt lt id name id column CUST_ID node id gt lt map name accounts node embed xml true gt lt k
136. aplicaci n multiusuario cliente servidor es sesi n por petici n En este modelo una petici n del cliente se envia al servidor en donde se ejecuta la capa de persistencia de Hibernate Se abre una nueva Session de Hibernate y todas las operaciones de la base de datos se ejecutan en esta unidad de trabajo Una vez completado el trabajo y una vez se ha preparado la respuesta para el cliente se limpia la sesi n y se cierra Use una s la transacci n de la base de datos para servir la petici n del cliente d ndole inicio y guard ndola cuando abre y cierra la Session La relaci n entre las dos es uno a uno y este modelo es a la medida perfecta de muchas aplicaciones El reto se encuentra en la implementaci n Hibernate brinda administraci n incorporada de la sesi n actual para simplificar este patr n Inicie una transacci n cuando se tiene que procesar un pedido del servidor y termine la transacci n antes de que se envie la respuesta al cliente Las soluciones m s comunes son ServletFilter un interceptor AOP con un punto de corte en los m todos del servicio o un contenedor proxy intercepci n Un contenedor EJB es una manera estandarizada de implementar aspectos de doble filo como demarcaci n de transacci n en beans de sesi n EJB declarativamente con CMT Si decide utilizar la demarcaci n de transacci n program tica use el AP Transaction de Hibernate de f cil uso y portable que se muestra m s adelante en este cap tulo Your
137. application code can access a current session to process the request by calling sessionFactory getCurrentSession You will always get a Session scoped to the current database transaction This has to be configured for either resource local or JTA environments see Secci n 2 5 Sesiones contextuales 186 Conversaciones largas Puede extender el mbito de una Session y transacci n de la base de datos hasta que se ha presentado la vista Esto es bastante til en aplicaciones de servlet que utilizan una fase de entrega separada despu s de que se ha procesado el pedido El extender la transacci n de la base de datos hasta que la entrega de la vista se encuentre completa es f cil de lograr si implementa su propio interceptor Sin embargo no se logra f cilmente si depende de EJBs con transacciones administradas por el contenedor Una transacci n se completar cuando un m todo EJB retorna antes de que pueda empezar la entrega de cualquier vista Vea el sitio web de Hibernate y el foro para encontrar consejos y ejemplos sobre este patr n de sesi n abierta en vista 12 1 2 Conversaciones largas El patr n sesi n por petici n no es la nica forma de dise ar unidades de trabajo Muchos procesos empresariales requieren una serie completa de interacciones con el usuario intercaladas con accesos a la base de datos En aplicaciones empresariales y web no es aceptable que una transacci n de la base de datos abarque la interacc
138. ar las clases persistentes que sobrescriban equals O hashCode Al escoger lazy no proxy en vez del lazy proxy predeterminado podemos evitar los problemas asociados con conversi n de tipos typecasting Sin embargo requiere la instrumentaci n de c digo byte en tiempo estimado de construcci n y todas las operaciones resultar n en una inicializaci n de proxies inmediata 20 1 4 Inicializaci n de colecciones y proxies Hibernate lanzar una LazyInitializationException si se accede a una colecci n o proxy sin acceder fuera del mbito de la Session por ejemplo cuando la entidad que posee la colecci n o que tiene la referencia al proxy est en el estado separado A veces es necesario inicializar un proxy o una colecci n antes de cerrar la Session Puede forzar la inicializaci n llamando a cat getSex O cat getKittens size por ejemplo Sin embargo esto puede ser confuso para los lectores del c digo y no es conveniente para el c digo gen rico Los m todos est ticos Hibernate initialize Y Hibernate isInitialized proporcionan a la aplicaci n una forma conveniente de trabajar con colecciones o proxies inicializados perezosamente Hibernate initialize cat forzar la inicializaci n de un proxy cat en tanto SU Session est todav a abierta Hibernate initialize cat getKittens tiene un efecto similar para la colecci n de gatitos Otra opci n es mantener la session abierta hasta que todas las
139. ar tambi n con los elemento s anidado s lt column gt type opcional un nombre que indica el tipo de Hibernate update insert opcional por defecto es true Especifica que las columnas mapeadas deben ser inclu das en las declaraciones SQL UPDATE y o INSERT Especificando ambas como false permite una propiedad derivada cuyo valor se inicia desde alguna otra propiedad que mapee a la misma columna o columnas o por un disparador u otra aplicaci n formula opcional una expresi n SQL que define el valor para una propiedad computada Las propiedades computadas no tienen una columna mapeada propia access opcional por defecto es property La estrategia que Hibernate utiliza para acceder al valor de la propiedad lazy opcional por defecto es false Especifica que se debe recuperar perezosamente esta propiedad cuando se acceda por primera vez la variable de instancia Requiere instrumentaci n de c digo byte en tiempo de compilaci n unique opcional Activa la generaci n DDL de una restricci n de unicidad para las columnas Adem s permite que sta sea el objetivo de una property ref not nul1 opcional Activa la generaci n DDL de una restricci n de nulabilidad para las columnas optimistic lock opcional por defecto es true Especifica que las actualizaciones a esta propiedad requieren o no de la obtenci n de un bloqueo optimista En otras palabras determina si debe ocurrir un incremento de versi n cuando l
140. ara las entidades involucradas en la herencia mapeada s lamente las propiedades definidas directamente en ese nivel de clase dado se pueden utlizar en la lista de propiedades Las propiedades de la superclase no est n permitidas y las propiedaeds de la subclase no tienen sentido Es decir las declaraciones INSERT son inherentemente no polim rficas e select_statement puede ser cualquier consulta select de HQL v lida con la advertencia de que los tipos de retorno coincidan con los tipos esperados por el insert Actualmente esto se verifica durante la compilaci n de la consulta en vez de permitir que se relegue la verificaci n a la base de datos Sin embargo esto puede crear problemas entre los Types de Hibernate los cuales son equivalentes y no iguales Esto puede crear problemas con las uniones mal hechas entre una propiedad definida como un org hibernate type DateType y una propiedad definida como una org hibernate type TimestampType aunque puede que la base de datos no distinga o no pueda manejar la conversi n Para la propiedad id la declaraci n insert le da dos opciones Puede especificar expl citamente la propiedad id en la lista de propiedades properties list en tal caso su valor se toma de la expresi n de selecci n correspondiente o se omite de la lista de propiedades en tal caso se utiliza un valor generado Esta ltima opci n s lamente est disponible cuando se utilizan generadores de id que operan en la
141. ara su base de datos Si especifica un dialecto Hibernate utilizar valores predeterminados de manera sensible para algunas de las otras propiedades enumeradas anteriormente ahorr ndole el esfuerzo de especificarlas manualmente Tabla 3 8 Dialectos SQL de Hibernate hibernate dialect RDBMS Dialecto DB2 org hibernate dialect DB2Dialect DB2 AS 400 org hibernate dialect DB2400Dialect DB2 OS390 org hibernate dialect DB2390Dialect PostgreSQL org hibernate dialect PostgreSQlDialect MySQL org hibernate dialect MySQLDialect MySQL con InnoDB org hibernate dialect MySQLInnoDBDialect MySQL con MyISAM org hibernate dialect MySQLMyISAMDialect Oracle cualquier versi n org hibernate dialect OracleDialect Oracle 9i org hibernate dialect Oracle9iDialect Oracle 10g org hibernate dialect Oraclel0gDialect Sybase org hibernate dialect SybaseDialect Sybase Anywhere org hibernate dialect SybaseAnywhereDialect Microsoft SQL Server org hibernate dialect SQLServerDialect SAP DB org hibernate dialect SAPDBDialect Informix org hibernate dialect InformixDialect HypersonicSQL org hibernate dialect HSQLDialect Ingres org hibernate dialect IngresDialect Progress org hibernate dialect ProgressDialect Mckoi SQL org hibernate dialect MckoiDialect Interbase org hibernate dialect InterbaseDialect Pointbase org hibernate dialect PointbaseDialect FrontBase org hibernate dialect FrontbaseDialect Firebird org hibernate dialect Fire
142. aradas Hibernate no establece ninguna garant a sobre la relaci n entre identidad persistente e identidad Java 2 3 Integraci n JMX JMX es el est ndar J2EE para la gesti n de componentes Java Hibernate se puede administrar por medio de un servicio est ndar JMX Brindamos una implementaci n de MBean en la distribuci n org hibernate jmx HibernateService Para ver un ejemplo de c mo desplegar Hibernate como un servicio JMX en un servidor de aplicaciones JBoss por favor refi rase al manual del usuario de JBoss JBoss AS tambi n proporciona estos beneficios si despliega utilizando JMX Administraci n de Sesi n El ciclo de vida de la Session de Hibernate puede estar ligado autom ticamente al mbito de una transacci n JTA Esto significa que ya no tiene que abrir ni cerrar la Session manualmente esto pasa a ser el trabajo de un interceptor EJB de JBoss Adem s tampoco tiene que preocuparse m s de la demarcaci n de la transacci n en su c digo a menos de que quiera escribir una capa de persitencia port til utilice la API de Transaction de Hibernate para hacer esto Para acceder a una Session llame al HibernateContext Despliegue HAR el servicio JMX de Hibernate se implementa usando un descriptor de despliegue de servicio de JBoss en un archivo EAR y o SAR que soporta todas las opciones de configuraci n usuales de una SessionFactory de Hibernate Sin embargo todav a tiene que nombrar todos sus archivos de mapeo en el des
143. arece a SQL Sin embargo comparado con SQL HQL es completamente orientado a objetos y comprende nociones como herencia polimorfismo y asociaci n 15 1 Sensibilidad a may sculas Las consultas no son sensibles a may sculas a excepci n de los nombres de las clases y propiedades Java De modo que Select es lo mismo que sELEct e igual a SELECT pero org hibernate eg Foo no es lo mismo que org hibernate eg Foo Y foo barSet no es igual a foo BARSET Este manual utiliza palabras clave HQL en min sculas Algunos usuarios encuentran que las consultas con palabras clave en may sculas son m s f ciles de leer pero esta convenci n no es apropiada para las peticiones incluidas en c digo Java 15 2 La cl usula from La consulta posible m s simple de Hibernate es de esta manera from eg Cat Esto retorna todas las instancias de la clase eg cat Usualmente no es necesario calificar el nombre de la clase ya que auto import es el valor predeterminado Por ejemplo from Cat Con el fin de referirse al cat en otras partes de la petici n necesitar asignar un alias Por ejemplo from Cat as cat Esta consulta asigna el alias cat a las instancias cat de modo que puede utilizar ese alias luego en la consulta La palabra clave as es opcional Tambi n podr a escribir from Cat cat 213 Cap tulo 15 HQL El lenguaje Pueden aparecer m ltiples clases lo que causa un producto cartesiano o una
144. argaron en una sesi n previa undefined especifica que se debe utilizar el valor de la propiedad identificadora GO generated opcional por defecto es never Especifica que este valor de la propiedad de la versi n es generado por la base de datos Vea la discusi n de las propiedades generadas para obtener mayor informaci n O insert opcional por defectos es t rue Especifica si la columna de la versi n debe incluirse en las declaraciones de inserci n SQL Se puede configurar como false si la columna de la base de datos se define con un valor predeterminado de 0 o 000 8 Los n meros de versi n pueden ser de tipo Hibernate long integer short timestamp O calendar Una propiedad de versi n o de sello de fecha nunca debe ser nula para una instancia separada Hibernate detectar cualquier instancia con una versi n o sello de fecha nulo como transitoria sin importar qu otras estrategias unsaved value se hayan especificado El declarar una propiedad de versi n o sello de fecha nulable es una forma f cil de evitar cualquier problema con la re uni n transitiva en Hibernate Es especialmente til para la gente que utiliza identificadores asignados o claves compuestas 5 1 10 Timestamp opcional El elemento opcional lt timestamp gt indica que la tabla contiene datos con sellos de fecha Esto brinda una alternativa al versionado Los sellos de tiempo timestamps son por naturaleza una implementaci n menos segura del blo
145. arios nuevos es modelar tanto Parent COMO Child como clases de entidad con una asociaci n lt one to many gt desde Parent a Child El enfoque opcional es declarar el child como un lt composite element gt La sem ntica prederterminada de una asociaci n uno a muchos en Hibernate es mucho menos cercana a la sem ntica usual de una relaci n padre hijo que la de un mapeo de elementos compuestos Explicaremos c mo utilizar una asociaci n uno a muchos bidireccional con tratamiento en cascada para modelar una relaci n padre hijo de manera eficiente y elegante 22 1 Nota sobre las colecciones Se considera que las colecciones de Hibernate son una parte l gica de la entidad que las posee y no de las entidades contenidas Note que esta es una diferencia crucial y que esto tiene las siguientes consecuencias e Cuando se elimina agrega un objeto desde a una colecci n se incrementa el n mero de la versi n del due o de la colecci n e Si un objeto que fue eliminado de una colecci n es una instancia de un tipo de valor por ejemplo un elemento compuesto ese objeto cesar de ser persistente y su estado ser completamente eliminado de la base de datos Asimismo a adir una instancia de tipo de valor a la colecci n causar que su estado sea persistente inmediatamente e Por otro lado si se elimina una entidad de una colecci n una asociaci n uno a muchos o muchos a muchos no se borrar por defecto Este comportamiento es completam
146. as 5 1 18 joined subclass Se puede mapear cada subclase a su propia tabla Esto se llama una estrategia de mapeo tabla por subclase El estado heredado se recupera uniendo con la tabla de la superclase Para hacer esto utilice elemento lt joined subclass gt Por ejemplo lt joined subclass name ClassName table tablename proxy ProxyInterface 0000 lazy true false dynamic update true false dynamic insert true false schema schema catalog catalog extends SuperclassName persister ClassName subselect SQL expression entity name EntityName node element name gt AI sese lt PLOP SB lt joined subclass gt name El nombre de clase completamente calificado de la subclase table El nombre de tabla de la subclase proxy opcional Especifica una clase o interfaz que se debe utilizar para proxies de inicializaci n perezosa lazy opcional por defecto es true El establecer lazy false desactiva el uso de la recuperaci n perezosa Go 00808 No se necesita una columna discriminadora para esta estrategia de mapeo Sin embargo cada subclase debe declarar una columna de tabla que tenga el identificador del objeto utilizando el elemento lt key gt El mapeo mencionado al comienzo del cap tulo se reescribir a as lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC 93 Cap tulo 5 Mapeo O R B sico _ Hibernate Hibernate Mapping DID EN http hibernate sou
147. as de una clase persistente puede utilizar un cach read on1y de s lo lectura Esta es la mejor estrategia y la m s simple Incluso es totalmente segura para utilizar en un cl ster 276 Estrategia lectura escritura read write lt class name eg Immutable mutable false gt lt cache usage read only gt lt class gt 20 2 3 Estrategia lectura escritura read write Si la aplicaci n necesita actualizar datos un cach read write puede ser apropiado Esta estrategia de cach nunca se debe utilizar si se requiere un nivel de aislamiento serializable de transacciones Si el cach se usa en un entorno JTA tiene que especificar la propiedad hibernate transaction manager_lookup_class mencionando una estrategia para obtener el TransactionManager de JTA En otros entornos debe asegurarse de que la transacci n est completada cuando se llame a Session close O Session disconnect Si desea utilizar esta estrategia en un cl ster debe asegurarse de que la implementaci n de cach subyacente soporta bloqueos Los provedores de cach internos no soportan bloqueos lt class name eg Cat gt lt cache usage read write gt lt set name kittens gt lt cache usage read write gt lt set gt lt class gt 20 2 4 Estrategia lectura escritura no estricta Si la aplicaci n necesita s lo ocasionalmente actualizar datos es decir es extremadamente improbable que dos transacc
148. ate gt lt map Nota El valor del atributo order by es una ordenaci n SQL no una ordenaci n HQL Las asociaciones pueden incluso ser ordenadas por alg n criterio arbitrario en tiempo de ejecuci n utilizando un filter de colecci n sortedUsers s createFilter group getUsers order by this name list 6 3 2 Asociaciones bidireccionales Una asociaci n bidireccional permite la navegaci n desde ambos extremos de la asociaci n Se soportan dos tipos de asociaci n bidireccional uno a muchos conjunto o bag valorados en un lado monovaluados en el otro muchos a muchos set o bag valorados en ambos extremos 120 Asociaciones bidireccionales Puede especificar una asociaci n bidireccional muchos a muchos simplemente mapeando dos asociaciones muchos a muchos a la misma tabla de base de datos y declarando un extremo como inverso cu l de ellos usted escoge pero no puede ser una colecci n indexada He aqu un ejemplo de una asociaci n bidireccional muchos a muchos que ilustra la manera en que cada categor a puede tener muchos items y cada item puede estar en muchas categor as lt class name Category gt lt id name id column CATEGORY_ID gt lt bag name items table CATEGORY_ITEM gt lt key column CATEGORY_ID gt lt many to many class Item column ITEM_ID gt lt bag gt lt class gt lt class name Item gt lt id name id column ITEM_ID gt lt
149. ate por defecto es JDBCTransactionFactory e g classname of TransactionFactory jta UserTransaction Un nombre JNDI utilizado por JTATransactionFactory para obtener la UserTransaction de JTA del servidor de aplicaciones e g jndi composite name hibernate transaction manager_lookup_cldds nombre de clase de un TransactionManagerLookup Se requiere cuando el chach a nivel de MVJ est habilitado o cuando se utiliza un generador alto bajo en un entorno JTA e g classname of TransactionManagerLookup hibernate transaction flush_before_compltienabled the session will be automatically flushed during the before completion phase of the transaction Built in and automatic session context management is preferred see Secci n 2 5 Sesiones contextuales e g true false hibernate transaction auto_close_sessiodf enabled the session will be automatically closed during the after completion phase of the transaction Built in and automatic session context management is preferred see Secci n 2 5 Sesiones contextuales e g true false 42 Par metros de configuraci n opcionales Tabla 3 7 Propiedades Miscel neas Nombre de la propiedad Prop sito hibernate current_session_context_class Supply a custom strategy for the scoping of the current Session See Secci n 2 5 Sesiones contextuales for more information about the built in strategies e g jta thread manag
150. ateException Estas no son recuperables y debe tomarse una acci n apropiada Hibernate envuelve SOLExceptions lanzadas mientras se interact a con la base de datos en una JDBCException De hecho Hibernate intentar convertir la excepci n en una subclase de JDBCException m s significativa La soLException subyacente siempre est disponible por medio de JDBCException getCause Hibernate convierte la SQLException en una subclase de JDBCException apropiada usando el soLExceptionConverter adjunto a la SessionFactory Por defecto el soLExceptionConverter est definido por el dialecto configurado Sin embargo tambi n es posible enchufar una implementaci n personalizada Consulte los javadocs de la clase SOLExceptionConverterFactory para obtener m s detalles Los subtipos est ndar de JDBCException Son e JDBCConnectionException indica un error con la comunicaci n JDBC subyacente SQLGrammarException indica un problema de gram tica o sint xis con el SQL publicado ConstraintViolationException indica alguna forma de violaci n de restricci n de integridad LockAcquisitionException indica un error adquiriendo un nivel de bloqueo necesario para realizar una operaci n solicitada e GenericJDBCException una excepci n gen rica que no encaj en ninguna de las otras categor as 12 2 4 Tiempo de espera de la transacci n Una caracter stica importante proporcionada por un e
151. atos JNDI provisto por un servidor de aplicaciones hibernate connection datasource java comp env jdbc test hibernate transaction factory_class org hibernate transaction JTATransactionFactory hibernate transaction manager_lookup_class org hibernate transaction JBossTransactionManagerLookup hibernate dialect org hibernate dialect PostgreSQLDialect Las conexiones JDBC obtenidas de una fuente de datos JNDI participaran automaticamente en las transacciones del servidor de aplicaciones administradas por el contenedor Pueden darse propiedades de conexi n arbitrarias anteponiendo hibernate connnection al nombre de propiedad de la conexi n Por ejemplo puede especificar una propiedad de conexi n charSet usando hibernate connection charSet Puede definir su propia estrategia plugin para obtener conexiones JDBC implementando la interfaz org hibernate connection ConnectionProvider y especificando su propia implementaci n personalizada por medio de la propiedad hibernate connection provider_class 3 4 Par metros de configuraci n opcionales Hay otras propiedades que controlan el comportamiento de Hibernate en tiempo de ejecuci n Todas son opcionales y tienen valores razonables por defecto Aviso Algunas de estas propiedades se encuentran a nivel del sistema s lamente Las propiedades a nivel del sistema s lamente se pueden establecer por medio de java Dproperty value O hibernate properties Nose pueden establecer por
152. atr s Se espera que los sets sean el tipo m s com n de colecci n en las aplicaciones de Hibernate Esto se debe a que la sem ntica de los sets es la m s natural en el modelo relacional 282 Los Bags y las listas son las colecciones inversas m s eficientes Sin embargo en modelos de dominio de Hibernate bien die ados usualmente vemos que la mayor a de las colecciones son de hecho asociaciones uno a muchos con inverse true Para estas asociaciones la actualizaci n es manejada por el extremo muchos a uno de la asociaci n y las consideraciones de este tipo sobre el rendimiento de la actualizaci n de las colecciones simplemente no se aplican 20 5 3 Los Bags y las listas son las colecciones inversas m s eficientes Hay un caso en particular en el que los bags y tambi n las listas son mucho m s eficientes que los conjuntos Para una colecci n con inverse true por ejemplo el idioma est ndar de relaciones uno a muchos bidireccionales podemos agregar elementos a un bag o lista sin necesidad de inicializar recuperar los elementos del bag Esto se debe a que a manera opuesta de Collection add O Collection addA11 siempre deben retornar verdadero para un bag O List no como un set Esto puede hacer el siguiente c digo com n mucho m s r pido Parent p Parent sess load Parent class id Child c new Child c setParent pi p getChildren add c no need to fetch the collection sess flush 20
153. bag gt La mayor a de las asociaciones muchos a muchos y las colecciones de valores que hemos mostrado hasta ahora mapean a tablas con claves compuestas aunque se ha sugerido que las entidades deben tener identificadores sint ticos llaves sustitutas Una tabla de pura asociaci n no parece beneficiarse mucho de una llave sustituta aunque s podr a beneficiarse una colecci n de valores compuestos Es por esto que Hibernate brinda una funcionalidad que le permite mapear asociaciones muchos a muchos y colecciones de valores a una tabla con una llave sustituta El elemento lt idbag gt le permite mapear una List O Collection con sem ntica de bag Por ejemplo lt idbag name lovers table LOVERS gt lt collection id column ID type long gt lt generator class sequence gt lt collection id gt lt key column PERSON1 gt lt many to many column PERSON2 class Person fetch join gt lt idbag gt Un lt idbag gt tiene un generador de id sint tico al igual que una clase de entidad Se asigna una clave delegada diferente a cada fila de la colecci n Sin embargo Hibernate no proporciona ning n mecanismo para descubrir el valor de la clave delegada de una fila en particular El rendimiento de actualizaci n de un lt idbag gt es mucho mejor que el de un lt bag gt normal Hibernate puede localizar filas individuales eficientemente y actualizarlas o borrarlas individualmente al igual que si fuese una lista
154. beginTransaction String hqlDelete delete Customer c where c name oldName 210 Operaciones de estilo DML or String hqlDelete delete Customer where name oldName int deletedEntities s createQuery hqlDelete setString oldName oldName executeUpdate Gx commit session close El valor int retornado por el m todo Query executeUpdate indica el numero de entidades afectadas por la operaci n Considere que esto puede estar correlacionado o no con el n mero de filas afectadas en la base de datos Una operaci n masiva de HQL puede llegar a causar que se ejecuten m ltiples declaraciones SQL reales por ejemplo para una subclase joined El n mero retornado indica el n mero de entidades realmente afectadas por la declaraci n De vuelta al ejemplo de la subclase joined un borrado contra una de las subclases puede resultar de hecho en borrados de no s lamente la tabla a la cual esa subclase esta mapeada sino tambi n la tabla ra z y potencialmente las tablas de subclases joined hasta la jerarqu a de herencia La pseudo sint xis para las declaraciones INSERT S INSERT INTO EntityName properties_list select_statement Algunos puntos que se deben observar son S lamente se soporta la forma INSERT INTO SELECT no la forma INSERT INTO VALUES La lista de propiedades properties list es an loga a la column speficiation en la declaraci n INSERT de SQL P
155. birdDialect 44 Recuperaci n por Uni n Externa Outer Join Fetching 3 4 2 Recuperaci n por Uni n Externa Outer Join Fetching Si su base de datos soporta uniones externas del estilo ANSI Oracle o Sybase frecuentemente la recuperaci n por uni n externa aumentar el rendimiento limitando el n mero de llamadas a la base de datos La recuperaci n por uni n externa permite que un gr fico completo de objetos conectados por asociaciones muchos a uno uno a muchos muchos a muchos y uno a uno sea recuperado en un s lo SELECT SQL La recuperaci n por uni n externa puede ser deshabilitada globalmente estableciendo la propiedad hibernate max_fetch_depth como 0 Un valor de 1 o mayor habilita la recuperaci n por uni n externa para asociaciones uno a uno y muchos a uno que hayan sido mapeadas con fetch 3oin See Secci n 20 1 Estrategias de recuperaci n for more information 3 4 3 Flujos Binarios Oracle limita el tama o de arrays de byte que se puedan pasar a desde su controlador JDBC Si desea utilizar instancias grandes de tipo binary O serializable usted debe habilitar hibernate jdbc use_streams_for_binary Esta es una configuraci n a nivel de sistema s lamente 3 4 4 Cach de segundo nivel y de lectura The properties prefixed by hibernate cache allow you to use a process or cluster scoped second level cache system with Hibernate See the Secci n 20 2 El Cach de Segu
156. birthday this birthday birthday public Name getName return name public void setName Name name this name name public class Name ehar inicial Serle EMASE String Hasty public String getFirst return first void setFirst String first this tins first J public String getLast return last 141 Cap tulo 8 Mapeo de componentes void setLast String last this lasti last public char getInitial return initial void setInitial char initial this initial initial Ahora Name puede ser persistido como un componente de Person Name define m todos getter y setter para sus propiedades persistentes pero no necesita declarar ninguna interfaz ni propiedades identificadoras Nuestro mapeo de Hibernate se ver a as lt class name eg Person table person gt lt id name Key column pid type string gt lt generator class uuid gt lt a lt property name birthday type date gt lt component name Name class eg Name gt lt class attribute optional gt lt property name initial gt lt property name first gt lt property name last gt lt component gt elas La tabla person tendria las columnas pid birthday initial first y last Como todos los tipos de valor los componentes no soportan referencias compartidas En otras palabras dos personas pueden tener el mismo nombre pero los dos objetos persona contendr
157. bjectName hibernate tb MBean object name StatisticsService stats new StatisticsService MBean implementation server registerMBean stats on Register the MBean on the server Puede activar y desactivar el monitoreo de una SessionFactory e en tiempo de configuraci n establezca hibernate generate_statistics COMO false e en tiempo de ejecuci n sf getStatistics setStatisticsEnabled true 0 hibernateStatsBean setStatisticsEnabled true Las estad sticas pueden ser reajustadas program ticamente utilizando el m todo clear Puede enviarse un resumen a un registro a nivel de informaci n utilizando el m todo logSummary 284 M tricas 20 6 2 M tricas Hibernate proporciona un n mero de m tricas desde informaci n muy b sica hasta la m s especializada s lamente relevante en ciertos escenarios Todos los contadores disponibles se describen en la API de la interfaz statistics en tres categor as e M tricas relacionadas al uso general de Session usage tales como n mero de sesiones abiertas conexiones JDBC recuperadas etc e M tricas relacionadas con las entidades colecciones consultas y cach s como un todo tambi n conocidas como m tricas globales e M tricas detalladas relacionadas con una entidad colecci n consulta o regi n de cach en particular Por ejemplo puede comprobar el acceso p rdida y radio de colecciones de entidades y consultas en el cach
158. ble Java que no sea por defecto un tipo basico Glob blob Mapeos de tipo para las clases JDBC java sql Clob y java sql Blob Estos tipos pueden ser inconvenientes para algunas aplicaciones pues el objeto blob o clob no pueden ser 101 Cap tulo 5 Mapeo O R B sico reusados fuera de una transacci n Adem s el soporte del controlador suele ser malo e inconsistente imm_date imm_time imm_timestamp imm_calendar imm_calendar_date imm_serializable imm_binary Los mapeos de tipo para lo que usualmente se considera tipos Java mutables Aqu es donde Hibernate realiza ciertas optimizaciones apropiadas s lamente para tipos Java inmutables y la aplicaci n trata el objeto como inmutable Por ejemplo no debe llamar Date set Time para una instancia mapeada como imm_timestamp Para cambiar el valor de la propiedad y hacer que ese cambio sea persistente la aplicaci n tiene que asignar un objeto nuevo no id ntico a la propiedad Los identificadores nicos de entidades y colecciones pueden ser de cualquier tipo b sico excepto binary blob y clob Los identificadores compuestos tambi n est n permitidos a continuaci n encontrar mayor informaci n Los tipos de valor b sicos tienen sus constantes Type correspondientes definidas en org hibernate Hibernate Por ejemplo Hibernate STRING representa el tipo string 5 2 3 Tipos de valor personalizados Es relativamente f cil para los desarrolladores crear sus propio
159. bu das a trav s de varias fuentes de datos Tambi n puede demarcar los l mites de las transacciones program ticamente BMT o puede que quiera utilizar para esto la API opcional de Transaction de Hibernate para mantener port til su c digo e Vinculaci n Autom tica JNDI Hibernate puede vincular sus SessionFactory a JNDI despu s del inicio e Vinculaci n de Sesi n JTA La Session de Hibernate se puede vincular autom ticamente al mbito de transacciones JTA Simplemente busque la SessionFactory de JNDI y obt nga la Session actual Deje que Hibernate se ocupe de vaciar y cerrar la Session cuando se complete su transacci n JTA La demarcaci n de transacci n puede ser declarativa CMT o program tica BMT UserTransaction Despliegue JMX Si tiene un servidor de aplicaciones con capacidad para JMX por ejemplo JBoss AS puede escoger el desplegar Hibernate como un MBean administrado Esto le ahorra el c digo de una l nea de inicio para construir su SessionFactory desde una Configuration El contenedor iniciar su HibernateService idealmente tambi n cuidar de las dependencias entre servicios la fuente de datos debe estar disponible antes de que Hibernate inicie etc Dependiendo de su entorno podr a tener que establecer la opci n de configuraci n hibernate connection aggressive_release como true si su servidor de aplicaciones muestra excepciones contenci n de conexi n 3 8 1 Configuraci n de la estrategia d
160. cada Puede abordar las frustraciones de la llamada expl cita a save utilizando cascadas lt set name children inverse true cascade all gt lt key column parent_id gt lt one to many class Child gt lt set gt Esto simplifica el c digo anterior a Parent p Parent session load Parent class pid Child c new Child p adeChildic 297 Cap tulo 22 Ejemplo Padre Hijo session flush De manera similar no necesitamos iterar los hijos al guardar o borrar un Parent Lo siguiente elimina p y todos sus hijos de la base de datos Parent p Parent session load Parent class pid session delete p session flush Sin embargo el siguiente c digo Parent p Parent session load Parent class pid Child c Child p getChildren iterator next p getChildren remove c c setParent null session flush no eliminar c de la base de datos En este caso s lo quitar el enlace a p y causar una violaci n auna restricci n NOT NULL Necesita borrar el hijo expl citamente llamando a delete en Child Parent p Parent session load Parent class pid Child c Child p getChildren iterator next p getChildren remove c session delete c session flush En nuestro caso un Child no puede existir realmente sin su padre De modo que si eliminamos un Child de la colecci n realmente queremos que sea borrado Para esto tenemos qu
161. campo directamente utilizando reflecci n Puede especificar su propia estrategia de acceso a la propiedad mencionando una clase que implemente la interfaz org hibernate property PropertyAccessor Una funcionalidad especialmente poderosa son las propiedades derivadas Estas propiedades son por definici n de s lo lectura El valor de la propiedad se computa en tiempo de carga Usted declara la computaci n como una expresi n SQL y sta se traduce como una cl usula de subconsulta SELECT en la consulta SQL que carga una instancia lt property name totalPrice formula SELECT SUM li quantity p price FROM Lineltem li Product p WHERE li productId p productld AND li customerld customerld AND li orderNumber orderNumber gt Puede referenciar la tabla de las entidades sin declarar un alias o una columna particular En el ejemplo dado ser a customerId Tambi n puede utilizar el elemento anidado de mapeo lt formula gt si no quiere utilizar el atributo 5 1 12 Many to one Una asociaci n ordinaria a otra clase persistente se declara utilizando el elemento many to one El modelo relacional es una asociaci n muchos a uno una clave for nea en una tabla referencia la columna o columnas de la clave principal de la tabla destino 84 Many to one lt many to one O O O 060 080 name propertyName column column_name class ClassName cascade cascade_style fetch Join select update true false
162. car una configuraci n completa en un archivo llamado hibernate cfg xml Este archivo se puede utilizar como un remplazo del archivo hibernate properties O en el caso de que ambos se encuentren presentes para sobrescribir propiedades El archivo de configuraci n XML por defecto se espera en la ra z de su CLASSPATH Este es un ejemplo lt xml version 1 0 encoding utf 8 gt lt DOCTYPE hibernate configuration PUBLIC _ Hibernate Hibernate Configuration DTD EN http hibernate sourceforge net hibernate configuration 3 0 dtd gt lt hibernate configuration gt lt a SessionFactory instance listed as jndi name gt lt session factory name java hibernate SessionFactory gt US properties gt gt 47 Cap tulo 3 Configuraci n lt property name connection datasource gt java comp env jdbc MyDB lt property gt lt property name dialect gt org hibernate dialect MySQLDialect lt property gt lt property name show_sql gt false lt property gt lt property name transaction factory_class gt org hibernate transaction JTATransactionFactory lt property gt lt property name jta UserTransaction gt java comp UserTransaction lt property gt si mapping files gt lt mapping resource org hibernate auction Item hbm xml gt lt mapping resource org hibernate auction Bid hbm xml gt aUa eena aaeeea e lt class cache class org hibernate auction Item usage read write gt
163. ccccnnonoccnononnccnnnnnnccnnnnnnccnnnnnncrnnnnnnrrnnnnnnrrnnn nano 216 15 5 Referencia a la propiedad identificadora oooooconnconncicinnnnnccnconncnccnnnnccnnnnnnannann 216 15 6 La cl usula Select ooococononnncccnncccccnnonnnnccnnnncnnnnnnnannnnnnn canon nn naar aran na nn nn nn 216 15 7 Funciones de agregaci n coccccoconococccconconononnnncnnnnncnnononnnnannnnnnnncnnnnanannrancnncnnns 218 15 8 Consultas poliIM TTICAS cuco si dina 219 15 9 La clausula Where inuit 219 15 10 EXPIESIONES coi E 221 15 11 La cl usula Order DY oooocococonccnccnccnconononncncnncnncn nono nnnnnncnnn cnn cnn nn nan rrn nn n cn nn nn 225 15 12 La cl usula grOUP DY coooconoccccnccncononnnnonccncnncononnnnnncnncnnnn nono rra EEEa as 226 15 13 SUDCONSUITAS id iia ENE 226 15 14 Ejemplos de HQL 000ooooccccccccccnnnooncccnnnnnnnnnonnancnnnnncononnnnnnnnnrnnnnnnnnnnanannnnnninonnns 227 15 15 Declaraciones UPDATE y DELETE masivas oooccccconocccnnnnnccnnnnnncnnnnnnncnnnnnnnnos 230 15 16 CONSEJOS y TRUCOS suscitar td E aA 230 15 17 COMPONENTES ori 231 15 18 Sintaxis del constructor de valores por fila ocoonnonnindidnnnnlnccocnnnnonncncinnnnncnn 232 vil HIBERNATE Persistencia rela 16 Consultas por criterios ooooooocidnnnnncnconnccccnncnccnnnonnnncnnnnncnnnnonnancnn narco nono nnancnncancnnns 233 16 1 Creaci n de una instancia Criteria ooooncnnnncnnononnccncnnnoncnnnnnncanonnnnncnnnnnnancancnncnnns 233 16 2 L mi
164. cci n de unicidad de la columna lt class name Person gt lt id name id column personld gt lt generator class native gt lt id gt lt many to one name address column addressId unique true not null true gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key addressId bigint not null unique create table Address addressId bigint not null primary key Usualmente una asociaci n unidireccional uno a uno en una clave principal utiliza un generador de id especial Sin embargo hemos invertido la direcci n de la asociaci n lt class name Person gt lt id name id column personld gt lt generator class native gt lt id gt lt class gt lt class name Address gt lt id name id column personld gt lt generator class foreign gt lt param name property gt person lt param gt lt generator gt lt id gt lt one to one name person constrained true gt elas gt Create table Person personld bigint not null primary key 130 Uno a muchos create table Address personId bigint not null primary key 7 2 3 Uno a muchos Una asociaci n unidireccional uno a muchos en una clave for nea es un caso muy inusual y no se recomienda lt class name Person gt lt id name id column personl
165. ccoccnccccnconnnncnnnnnnnnnnnnnnnnnnnonannncnnnnnnnnnnnnns 119 6 3 2 Asociaciones bidireccionales ooccccocccoonnncocnncconnconononocncononocononinonnnnnns 120 6 3 3 Asociaciones bidireccionales con colecciones indexadas oooooccccconcnncccos 122 6 3 4 Asociaciones ternariaS occoooccconcconconnonnnonnnonnnnnnnncnonnnonnnnononannnannnnnnnnnonnns 123 6 3 5 USING AN lt IGDAQ gt sti 124 6 4 Ejemplos de colecci n o oocococononccinncncocononnnnnancnncnnonnnnannnnrnn conc nn nn cnn nn nr nn 124 7 Mapeos de asociaci nN cuida dias 129 FW INTTOQUECI N escrit li stas 129 7 2 Asociaciones Unidireccionales cooccocncocccccnccocnoncnonnnconnnancnnnonnnonnnonnnonnnnnnnnons 129 Tek ManystO 0N6 cuca a 129 EA aaa Eai eeraa E 130 12 3 Uno a MUCHOS ienie a ados 131 7 3 Asociaciones unidireccionales con tablas de uni n oocooonocccccononncccononnncnnnannnnnnns 131 LIA Unoa MUCHOS 200 ias 131 13 2 May TOONE cuca ARA dada 132 13 39 UNGA UNO iii 133 7 3 4 MUCHOS 2 MUCHOS dessini raaa a a aa n 133 7 4 Asociaciones bidireccionales occconcccconncocnnococnccnnnncncnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnns 134 7 4 1 uno a muchos MUCNOS A UNO ocooccccccccnnncnnncnnnnnnnnnnnnnnnnnonnnannnnnconnnonnnnnns 134 TAL AUN AUN oa 135 7 5 Asociaciones bidireccionales con tablas de UNION ooocccccoocccccnonocononnnnnnnnnnannnnns 136 7 5 1 uno a muchos MUCNOS A UNO ccocccccccccnnncncncnnnnnnnnnnnnnnnnnonnnannn
166. ce to null has no effect on the entity s database representation get a contract with an existing plan make the contract read only and set its plan to null tx session beginTransaction Contract contract Contract session get Contract class contractld 181 Cap tulo 11 Read only entities session setReadOnly contract true contract setPlan null tx commit get the same contract tx session beginTransaction contract Contract session get Contract class contractld contract getPlan still refers to the original plan tx commit session close The following shows that even though an update to a read only entity s many to one association has no affect on the entity s database representation flush still cascades the save update operation to the locally changed association get a contract with an existing plan make the contract read only and change to a new plan tx session beginTransaction Contract contract Contract session get Contract class contractld session setReadOnly contract true Plan newPlan new Plan new plan contract setPlan newPlan tx commit get the same contract tx session beginTransaction contract Contract session get Contract class contractld newPlan Contract session get Plan class newPlan getId contract getPlan still refers to the original plan newPlan is
167. cedimiento tiene que ser un ouT que retorna un grupo de resultados Esto se hace utilizando un tipo SYS_REFCURSOR en Oracle 9 o 10 En Oracle necesita definir un tipo Rer CURSOR Consulte la documentaci n de Oracle para obtener mayor informaci n Para Sybase o el servidor MS SQL aplican las siguientes reglas El procedimiento tiene que retornar un grupo de resultados Observe que debido a que estos servidores pueden retornar grupos de resultados m ltiples y cuentas actualizadas Hibernate iterar los resultados y tomar el primer resultado que sea un grupo resultados como su valor retornado Todo lo dem s ser descartado Si puede habilitar ser NocountT ON en su procedimiento probablemente ser m s eficiente pero no es un requerimiento 17 3 Personalice SQL para crear actualizar y borrar Hibernate3 can use custom SQL for create update and delete operations The SQL can be overridden at the statement level or inidividual column level This section describes statement overrides For columns see Secci n 5 7 Expresiones de lectura y escritura de columnas Los persistentes de clase y de colecci n en Hibernate ya contienen un grupo de cadenas generadas en tiempo de configuraci n insertsql deletesql updatesql etc Las etiquetas de mapeo lt sql insert gt lt sql delete gt Y lt sql update gt sobrescriben estas cadenas lt class name Person gt lt id name id gt lt generator class increment gt
168. cente llamando a ScrollableResults close OHibernate close Iterator expl citamente desde un bloque finally La mayor a de las aplicaciones pueden evitar f cilmente el utilizar scro11 O iterate del c digo JTA o CMT 12 2 3 Manejo de excepciones Si la Session lanza una excepci n incluyendo cualquier soLException debe deshacer inmediatamente la transacci n de la base de datos llamar a Session close y descartar la instancia de Session Ciertos m todos de Session no dejar n la sesi n en un estado consistente Ninguna excepci n lanzada por Hibernate puede ser tratada como recuperable Aseg rese de que la Session se cierre llamando a close en un bloque finally La HibernateException que envuelve a la mayor a de los errores que pueden ocurrir en la capa de persistencia de Hibernate es una excepci n no chequeada No lo era en versiones anteriores de Hibernate En nuestra opini n no debemos forzar al desarrollador de aplicaciones a capturar una excepci n irrecuperable en una capa baja En la mayor a de los sistemas las excepciones no chequeadas y fatales son manejadas en uno de los primeros cuadros de la pila de llamadas a m todos por ejemplo en las capas m s altas y presenta un mensaje de error al usuario de la aplicaci n o se toma alguna otra acci n apropiada Note que Hibernate podr a 193 Cap tulo 12 Transacciones y tambi n lanzar otras excepciones no chequeadas que no sean una Hibern
169. cesamiento es exactamente el mismo que en el enfoque m s antiguo de JTA s lamente Refi rase a los Javadocs para obtener m s informaci n 31 Cap tulo 2 Arquitectura org hibernate context ThreadLocalSessionContext las sesiones actuales son rastreadas por un hilo de ejecuci n Consulte los Javadocs para obtener m s detalles org hibernate context ManagedSessionContext las sesiones actuales son rastreadas por un hilo de ejecuci n Sin embargo usted es responsable de vincular y desvincular una instancia Session con m todos est ticos en esta clase no abre vacia o cierra una Session The first two implementations provide a one session one database transaction programming model This is also known and used as session per request The beginning and end of a Hibernate session is defined by the duration of a database transaction If you use programmatic transaction demarcation in plain JSE without JTA you are advised to use the Hibernate Transaction API to hide the underlying transaction system from your code lf you use JTA you can utilize the JTA interfaces to demarcate transactions If you execute in an EJB container that supports CMT transaction boundaries are defined declaratively and you do not need any transaction or session demarcation operations in your code Refer to Capitulo 12 Transacciones y concurrencia for more information and code examples El par metro de configuraci n hibernate current_session_conte
170. cesita bloquear ning n dato que s est actualizando Usualmente configurar a F lushMode MANUAL en una Session extendida de manera que de hecho s lamente se permite persistir el ltimo ciclo de transacci n de la base de datos de todas las modificaciones realizadas en esta conversaci n S lamente esta ltima transacci n de la base de datos incluir a la operaci n flush y luego cierra close la sesi n para dar fin a la conversaci n Este patr n es problem tico si la Session es demasiado grande para almacenarla durante el tiempo para pensar del usuario por ejemplo una HttpSession se debe mantener tan peque a como sea posible Como la Session tambi n lo es el cach de primer nivel obligatorio 196 Objetos separados y versionado autom tico y comprende todos los objetos cargados probablemente podemos utilizar esta estrategia s lamente para unos pocos ciclos de pedido respuesta Debe utilizar una Session s lamente para una conversaci n nica ya que pronto tambi n tendr datos a ejos Nota Las versiones anteriores de Hibernate necesitaban desconexi n expl cita y reconexi n de una Session Estos m todos ya no se aprueban ya que tienen el mismo efecto que dar inicio o finalizar a una transacci n Mantenga la Session desconectada cerca a la capa de persistencia Use un bean de sesi n EJB con estado para mantener la Session en un entorno de tres capas No la transfiera a la capa web ni la serial
171. chedCriteria avgWeight DetachedCriteria forClass Cat class setProjection Property forName weight avg session createCriteria Cat class add Property forName weight gt avgWeight List DetachedCriteria weights DetachedCriteria forClass Cat class setProjection Property forName weight session createCriteria Cat class add Subqueries geAll weight weights List Las subconsultas correlacionadas tambie son posibles DetachedCriteria avgWeightForSex DetachedCriteria forClass Cat class cat2 setProjection Property forName weight avg add Property forName cat2 sex eqProperty cat sex session createCriteria Cat class cat add Property forName weight gt avgWeightForSex TES AOE 239 Cap tulo 16 Consultas por cr 16 9 Consultas por identificador natural Para la mayor a de las consultas incluyendo las consultas por criterios el cach de consulta no es muy eficiente debido a que la invalidaci n del cach de consulta ocurre con demasiada frecuencia Sin embargo hay un tipo especial de consulta donde podemos optimizar el algoritmo de invalidaci n de cach b squedas de una clave natural constante En algunas aplicaciones este tipo de consulta ocurre frecuentemente La API de criterios brinda una provisi n especial para este caso Primero mapee la clave natural de su entidad utilizando lt natura1 id gt y habilite el uso del cach de segund
172. ci n de Hibernate por medio del objeto Configuration 147 148 Mapeo de herencias 9 1 Las tres estrategias Hibernate soporta las tres estrategias b sicas de mapeo de herencia e tabla por jerarqu a de clases e table per subclass e tabla por clase concreta Ademas Hibernate soporta un cuarto un tipo ligeramente diferente de polimorfismo e polimorfismo impl cito Es posible utilizar estrategias de mapeo diferentes para diferentes ramificaciones de la misma jerarqu a de herencia Luego puede usar un polimorfismo impl cito para conseguir polimorfismo a trav s de toda la jerarqu a Sin embargo Hibernate no soporta la mezcla de mapeos lt subclass gt lt joined subclass gt y lt union subclass gt bajo el mismo elemento lt class gt ra z Es posible mezclar las estrategias de tabla por jerarqu a y tabla por subclase bajo el mismo elemento lt class gt combinando los elementos lt subclass gt y lt join gt a continuaci n encontrar un ejemplo Es posible definir los mapeos subclass union subclass Y joined subclass en documentos de mapeo separados directamente debajo de hibernate mapping Esto le permite extender une jerarqu a de clase s lamente a adiendo un nuevo archivo de mapeo Tiene que especificar un atributo extends en la subclase de mapeo nombrando una superclase mapeada previamente Nota Anteriormente esta caracter stica hacia que el orden de los documentos de mapeo fuera importante D
173. ci n se realiza en los descriptores de implementacion bean de sesi n no program ticamente Por lo tanto el c digo se reduce a CMT idiom Session sess factory getCurrentSession do some work En un CMT EJB incluso el deshacer sucede de forma autom tica Un Runt imeException lanzado por un m todo bean de sesi n le dice al contenedor que establezca una transacci n global para deshacer No necesita utilizar el API Transaction de Hibernate con BMT o CMT y obtiene la propagaci n autom tica de sesi n actual vinculada a la transacci n Al configurar la f brica de transacciones de Hibernate escoja org hibernate transaction JTATransactionFactory si utiliza JTA directamente BMT y org hibernate transaction CMITransactionFactory en una bean de sesi n CMT Recuerde establecer tambi n hibernate transaction manager_lookup_class Aseg rese de que su hibernate current_session_context_class no se encuentra configurado compatibilidad retrasada o configurada como jta La operaci n getCurrentSession tiene un inconveniente en un entorno JTA Hay una desventaja en el uso del modo de liberaci n de la conecci n after_statement la cual luego se utiliza por defecto Debido a una limitaci n de la especificaci n JTA no le es posible a Hibernate limpiar autom ticamente cualquier instancia ScrollableResults O Iterator no cerradas y retornadas por scroll O iterate Tiene que liberar el cursor de la base de datos subya
174. citamente los comandos CREATE y DROP en el archivo de mapeo 108 Objetos de bases de datos auxiliares lt hibernate mapping gt lt database object gt lt creake gt CREATE TRIGGER my_trigger lt create gt lt drop gt DROP TRIGGER my_trigger lt drop gt lt database object gt lt hibernate mapping gt El segundo modo es para proporcionar una clase personalizada que construye los comandos CREATE y DROP Esta clase personalizada tiene que implementar la interfaz org hibernate mapping AuxiliaryDatabaseObject lt hibernate mapping gt lt database object gt lt definition class MyTriggerDefinition gt lt database object gt lt hibernate mapping gt Adicionalmente estos objetos de la base de datos se pueden incluir de manera opcional de forma que aplique s lamente cuando se utilicen ciertos dialectos lt hibernate mapping gt lt database object gt lt definition class MyTriggerDefinition gt lt dialect scope name org hibernate dialect Oracle9iDialect gt lt dialect scope name org hibernate dialect Oraclel0gDialect gt lt database object gt lt hibernate mapping gt 109 110 Mapeos de colecci n 6 1 Colecciones persistentes Hibernate requiere que los campos valuados en colecci n persistente se declaren como un tipo de interfaz Por ejemplo public class Product private String serialNumber private Set parts new HashSet public Set getPart
175. cks 10 6 Modificaci n de objetos separados Muchas aplicaciones necesitan recuperar un objeto en una transacci n enviarla a la capa de Ul para su manipulaci n y entonces guardar los cambios en una nueva transacci n Las 166 Modificaci n de objetos separados aplicaciones que usan este tipo de enfoque en un entorno de alta concurrencia usualmente utilizan datos versionados para asegurar el aislamiento de la unidad de trabajo larga Hibernate soporta este modelo al proveer re uni n de instancias separadas utilizando los m todos Session update O Session merge in the first session Cat cat Cat firstSession load Cat class catld Cat potentialMate new Cat firstSession save potentialMate in a higher layer of the application Cat setMate potentialMate later in a new session secondSession update cat update cat secondSession update mate update mate Si el cat con identificador cat Id ya hubiera sido cargado por secondSession cuando la aplicaci n intent volver a unirlo se habr a lanzado una excepci n Utilice update si est seguro de que la sesi n no tiene una instancia ya persistente con el mismo identificador Utilice merge si quiere fusionar sus modificaciones en cualquier momento sin consideraci n del estado de la sesi n En otras palabras update usualmente es el primer m todo que usted llamar a en una sesi n actualizada asegurando que la re uni n de
176. clase persistente Generalmente este no es el caso El atributo formula le permite declarar una expresi n SQL arbitraria que ser utilizada para evaluar el tipo de una fila Por ejemplo lt discriminator formula case when CLASS_TYPE in a b c then 0 else 1 end type integer gt 5 1 9 Versi n opcional El elemento lt version gt es opcional e indica que la tabla contiene datos versionados Esto es particularmente til si planea utilizar transacciones largas Vea a continuaci n para obtener mayor informaci n 80 Timestamp opcional lt version column version_column name propertyName type typename access field property ClassName unsaved value null negative undefined generated never always 0000000 insert true false node element name attribute name element attribute column opcional por defecto es el nombre de la propiedad El nombre de la columna que tiene el n mero de la versi n name El nombre de una propiedad de la clase persistente type opcional por defecto es integer El tipo del n mero de la versi n access opcional por defecto es property La estrategia que Hibernate utiliza para acceder al valor de la propiedad unsaved value opcional por defecto es undefined Un valor de la propiedad de versi n que indica que una instancia se encuentra reci n instanciada sin guardar distingui ndola de las instancias separadas que se guardaron o se c
177. class Part gt lt set gt lt class gt Aparte de lt set gt existen ademas los elementos de mapeo lt list gt lt map gt lt bag gt lt array gt y lt primitive array gt El elemento lt map gt es representativo lt map name propertyName table table_name schema schema_name lazy true extra false inverse true false cascade all1 none save update delete all delete orphan delete orphan sort unsorted natural comparatorClass order by column_name asc desc where arbitrary sql where condition fetch join select subselect batch size N 112 Mapeos de colecci n access field property ClassName D optimistic lock truelfalse 13 mutbablle true balses node element name embed xml true false KIN on oo VS lt map key gt lt element gt lt map gt Go 0 00 o O 8 8 OQ name el nombre de la propiedad de colecci n table opcional por defecto es el nombre de la propiedad el nombre de la tabla de colecci n No se utiliza para asociaciones uno a muchos schema opcional el nombre de un esquema de tablas para sobrescribir el esquema declarado en el elemento ra z lazy opcional por defecto es t rue deshabilita la recuperaci n perezosa y especifica que la asociaci n siempre es recuperada tempranamente Tambi n se puede utilizar para activar una recuperaci n extra perezoza en donde la mayor a de las operaciones no inicializan la col
178. co ooocccccnnncccoconoccconnnnccnnnnnninos 197 12 4 BIOQUEO PESIMISTA coacciones ii Ree 198 12 5 Modos de liberaci n de la conexi n oooocciccnncccccconnccncnncnncnnnonncnccnncn nono nonnancnnn 199 13 Interceptores Y eventos oooocccccoocccccnnnccnconnnncnnononnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnannnnnnannnnns 201 13 1 INtSKCO POLO viiicoi dae 201 13 2 Sistema de CVENtOS aneor ee cece cette E E ee ease aa T EEE 203 13 3 Seguridad declarativa de Hibernate ooonoonccccnnnococnccnnccccnncnccnnnnnnanccn nan cc nn cnn 204 14 Procesamiento por lotes ooooococcconcccccnoccccccnnnonnnonnnonnnnnnnnnnnnnnnrnnnnnnrrnnnnnnrrnn rancio 207 141 Inserciongs de lOtSS eco iio a Re 207 14 2 Actualizaciones de lotes ooocccconnncccccnnnnccconnnncncnnnnncnccnnnnencnnnanencnnnnnnnnnnnanenes 208 14 3 La interfaz de Sesi n sin Estado ooooonocccicccccccononococoncnncnnononnancancnn conc nn nnanannnano 208 14 4 Operaciones de estilo DML ooooooooccccicnccccnnnccnccncnncnnonononannnnnncn nono nnnancnnncnncnnns 209 15 HQL El lenguaje de consulta de Hibernate oooooocccnnnccconocncccccnccccnnnonanancnncnccnnno 213 15 1 Sensibilidad a may sculas ooooocciccnncccncnnccnconcnnconnnnnnnncnccnnnn cnn nnn nan rra nan cn nn nnnnan 213 15 2 La clausula froMicoiacia a eee needa 213 15 3 Asociaciones y UNIONES JOINS cccooonnccccnoncccnononaccnnnnnnccnnnnnnccnnnnnncrnnnnnnrrnnnnnneo 214 15 4 Formas de sintaxis unida cccooooc
179. colecciones y proxies necesarios hayan sido cargados En algunas arquitecturas de aplicaci n particularmente en aquellas donde el c digo que accede a los datos usando Hibernate y el c digo que los utiliza est n en capas de aplicaci n diferentes o procesos f sicos diferentes puede ser un problema asegurar que la Session est abierta cuando se inicializa una colecci n Existen dos formas b sicas para abordar este tema En una aplicaci n basada en la web se puede utilizar un filtro de servlets para cerrar la Session s lamente al final de una petici n del usuario una vez que la entrega de la vista est completa 270 Utilizaci n de recuperaci n de lotes el patr n sesi n abierta en vista open session in view Por supuesto estos sitios requieren una fuerte demanda de correcci n del manejo de excepciones de la infraestructura de su aplicaci n Es de una vital importancia que la Session est cerrada y la transacci n terminada antes de volver al usuario incluso cuando ocurra una excepci n durante le entrega de la vista Refi rase a la Wiki de Hibernate para ver ejemplos de este patr n Open Session in View sesi n abierta en vista En una aplicaci n con una capa de negocios separada la l gica empresarial tiene que preparar todas las colecciones que la capa web va a necesitar antes de retornar Esto significa que la capa empresarial debe cargar todos los datos y devolver a la capa web presentaci n todos los
180. como esto select order id sum price amount count item from Order as order join order lineltems as item join item product as product Catalog as catalog join catalog prices as price where order paid false and order customer customer and price product product and catalog currentCatalog group by order having sum price amount gt minAmount order by sum price amount desc La pr xima consulta cuenta el n mero de pagos en cada estado excluyendo todos los pagos en el estado AWAITING_APPROVAL donde el cambio m s reciente al estado lo hizo el usuario actual Se traduce en una consulta SQL con dos uniones interiores y una subselecci n correlacionada contra las tablas PAYMENT PAYMI ENT_STATUS Y PAYMI select count payment status name from Payment as payment join payment currentStatus as status join payment statusChanges as statusChange where payment status name lt gt PaymentStatus AWAITING_APPROVAL or ENT_STATUS_CHANG Gl 228 Ejemplos de HQL statusChange timeStamp select max change timeStamp from PaymentStatusChange change where change payment payment and statusChange user lt CURESATU Sen group by status name status sortOrder order by status sortOrder Si la colecci n statusChanges se mapeara como una lista en vez de un conjunto la consulta habr a sido mucho m s simple de escribir select count payment statu
181. configurar un sistema de registro Hibernate utiliza registros comunes le da dos opciones Log4J y registros de JDK 1 4 La mayor a de los desarrolladores prefieren Log4J copie loy4j properties de la distribuci n de Hibernate se encuentra en el directorio etc a su directorio src junto a hibernate cfg xml Si desea tener una salida m s verbosa que la que se proporcion en la configuraci n del ejemplo entonces puede cambiar su configuraci n Por defecto s lo se muestra el mensaje de inicio de Hibernate en la salida est ndar La infraestructura del tutorial est completa y estamos listos para hacer un poco de trabajo real con Hibernate 1 1 7 Carga y almacenamiento de objetos We are now ready to start doing some real work with Hibernate Let s start by writing an EventManager Class with a main method package org hibernate tutorial import org hibernate Session import java util import org hibernate tutorial domain Event import org hibernate tutorial util HibernateUtil public class EventManager public static void main String args EventManager mgr new EventManager if args 0 equals store 11 Cap tulo 1 Tutorial mgr createAndStoreEvent My Event new Date HibernateUtil getSessionFactory close private void createAndStoreEvent String title Date theDate Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction
182. contract Contract session get Contract class contractId contract getCustomerName is still Sherman tx commit session close 11 2 2 Unidirectional associations 11 2 2 1 Unidirectional one to one and many to one Hibernate treats unidirectional one to one and many to one associations in the same way when the owning entity is read only We use the term unidirectional single ended association when referring to functionality that is common to unidirectional one to one and many to one associations Hibernate does not dirty check unidirectional single ended associations when the owning entity is read only If you change a read only entity s reference to a unidirectional single ended association to null or to refer to a different entity that change will not be flushed to the database Nota If an entity is of an immutable class then its references to unidirectional single ended associations must be assigned when that entity is first created Because the entity is automatically made read only these references can not be updated If automatic versioning is used Hibernate will not increment the version due to local changes to unidirectional single ended associations In the following examples Contract has a unidirectional many to one association with Plan Contract cascades save and update operations to the association The following shows that changing a read only entity s many to one association referen
183. controladores JDBC Esta herramienta es extremadamente til para comprobar java cp hibernate _classpaths org hibernate tool hbm2ddl SchemaValidator options mapping_files La siguiente tabla presenta las opciones de la l nea de comandos para SchemaValidator 293 Cap tulo 21 Manual del conju Tabla 21 5 Opciones de la L nea de Comandos schemavalidator Opci n Descripci n naming eg MyNamingStrategy seleccione Un NamingStrategy lee las propiedades de base de datos de un archivo properties hibernate properties config hibernate cfg xml specifique un archivo cfg xml Puede incluir SchemaValidator en su aplicaci n Comzcquicaita lon ero reen new SchemaValidator cfg validate 21 1 8 Utilizacion de Ant para la validacion de esquema Puede llamar SchemaValidator desde el scrip de Ant lt target name schemavalidate gt lt taskdef name schemavalidator classname org hibernate tool hbm2ddl SchemaValidatorTask classpathref class path gt lt schemavalidator properties hibernate properties gt lt fileset dir src gt lt include name hbm xml gt lt fileset gt lt schemavalidator gt lt target gt 294 Ejemplo Padre Hijo Una de las primeras cosas que los usuarios nuevos intentan hacer con Hibernate es modelar una relaci n de tipo padre hijo Para esto existen dos enfoques diferentes El enfoque m s conveniente especialmente para los usu
184. cp hibernate_classpaths org hibernate tool hbm2ddl SchemaUpdate options mapping_ files Tabla 21 4 Opciones de L nea de Comandos de schemaupdate Opci n Descripci n quiet no envie el script a la salida estandar 292 Utilizaci n de Ant para actualizaciones incrementales de esquema Opci n Descripci n text no exporte el script a la base de datos naming eg MyNamingStrategy seleccione un NamingStrategy lee las propiedades de base de datos de un archivo properties hibernate properties config hibernate cfg xml specifique un archivo cfg xml Puede incluir SchemaUpdate en su aplicaci n Configuration Cig y new SchemaUpdate cfg execute false 21 1 6 Utilizaci n de Ant para actualizaciones incrementales de esquema Puede llamar a SchemaUpdate desde el script de Ant lt target name schemaupdate gt lt taskdef name schemaupdate classname org hibernate tool hbm2dd1 SchemaUpdateTask classpathref class path gt lt schemaupdate properties hibernate properties quiet no gt lt fileset dir src gt lt include name hbm xml gt lt fileset gt lt schemaupdate gt lt target gt 21 1 7 Validaci n de Esquema La herramienta SchemaValidator validar que el esquema de la base de datos existente coincide con sus documentos de mapeo El schemaValidator depene bastante de la API de metadatos JDBC as que no funcionar con todos los
185. cribir leer tipos binary O serializable a desde JDBC Propiedad a nivel de sistema e g true false Habilita el uso de PreparedStatement getGeneratedKeys de JDBC3 para recuperar claves generadas nativamente despu s de insertar Requiere un controlador JDBC3 y un JRE1 4 Establ zcalo como falso si su controlador tiene problemas con los generadores del identificador de Hibernate Por defecto se intenta determinar las capacidades del controlador utilizando los metadatos de conexi n e g true false EL nombre de clase de un org hibernate connection ConnectionProvider personalizado que proporcione conexiones JDBC a Hibernate e g classname of ConnectionProvider 39 Cap tulo 3 Configuraci n Nombre de la propiedad hibernate connection isolation hibernate connection autocommit hibernate connection release_mode Prop sito Establece el nivel de aislamiento de la transacci n JDBC Comprueba java sql Connection para valores significativos pero observe que la mayoria de las bases de datos no soportan todos los niveles de aislamiento y algunos definen nivekes de aislamiento adicionales y no estandares g 1 2 4 8 Habilita un guardado autom tico autocommit para las conexiones JDBC en pool no se recomienda e g true false Especifica el momento en que Hibernate debe liberar las conexiones JDBC Por defecto una conexi n JDBC es retenida hasta que la sesi n se cierra o se
186. criminator value C gt lt id name id gt lt generator class native gt lt id gt lt discriminator column subclass type character gt lt property name weight gt lt property name birthdate type date not null true update false gt lt property name color type eg types ColorUserType not null true update false gt lt property name sex not null true update false gt lt property name litterld column litterld update false gt 65 Cap tulo 5 Mapeo O R B sico lt many to one name mother column mother_id update false gt lt set name kittens inverse true order by litter_id gt lt key column mother_id gt lt one to many class Cat gt lt set gt lt subclass name DomesticCat discriminator value D gt lt property name name type string gt lt subclass gt lt class gt lt class name Dog gt lt mapping for Dog could go here gt lt class gt lt hibernate mapping gt Ahora vamos a discutir el contenido del documento de mapeo S lamente describiremos los elementos y atributos del documento que Hibernate utiliza en tiempo de ejecuci n El documento de mapeo tambi n comprende algunos atributos y elementos extra opcionales que afectan los esquemas de la base de datos exportados por la herramienta de exportaci n de esquemas por ejemplo el atributo not nu11 5 1 1 Doctype Todos
187. criptor de despliegue Si utiliza el depliegue HAR opcional JBoss detectar autom ticamente todos los archivos de mapeo en su archivo HAR 30 Soporte JCA Para m s informaci n sobre estas opciones consulte el Manual de Usuario de JBoss AS Another feature available as a JMX service is runtime Hibernate statistics See Secci n 3 4 6 Estadisticas de Hibernate for more information 2 4 Soporte JCA Hibernate tambi n puede ser configurado como un conector JCA Por favor refi rase al sitio web para encontrar m s detalles Sin embargo tenga en cuenta que el soporte de JCA de Hibernate a n est bajo desarrollo 2 5 Sesiones contextuales La mayor a de las aplicaciones que utilizan Hibernate necesitan alguna forma de sesiones contextuales en donde una sesi n dada se encuentra en efecto en todo el campo de acci n de un contexto dado Sin embargo a trav s de las aplicaciones la definici n de lo que constituye un contexto es usualmente diferente y diferentes contextos definen diferentes campos de acci n para la noci n de actual Las aplicaciones que utiliza Hibernate antes de la version 3 0 tienden a utilizar ya sea sesiones contextuales con base ThreadLocal desarrollados en casa las clases ayudantes tales como Hibernateuti1 o enfoques de terceros utilizados como Spring o Pico los cuales brindaban sesiones contextuales con base proxy intercepci n Comenzando con la version 3 0 1 Hibernate agreg el m todo
188. ctualizados Hibernate utiliza una s la declaraci n uPDATE con una cl usula WHERE apropiada por entidad para ejecutar el chequeo de versiones y actualizar la informaci n Si utiliza una persistencia transitiva para la re uni n en cascada de entidades asociadas Hibernate podr a ejecutar actualizaciones innecesarias Esto usualmente no es problema pero podr an ejecutarse disparadores triggers enactualizazci n en la base de datos incluso cuando no se haya hecho ning n cambio a las instancias separadas Puede personalizar este comportamiento estableciendo select before update true en el mapeo de lt class gt forzando a Hibernate a seLEcT la instancia para asegurar que las actualizaciones realmente ocurran antes de actualizar la fila 12 4 Bloqueo pesimista No se pretende que los usuarios tomen mucho tiempo preocup ndose de las estrategias de bloqueo Usualmente es suficiente con especificar un nivel de aislamiento para las conexiones JDBC y entonces simplemente dejar que la base de datos haga todo el trabajo Sin embargo los usuarios avanzados a veces pueden obtener bloqueos exclusivos pesimistas o reobtener bloqueos al comienzo de una nueva transacci n Hibernate siempre usar el mecanismo de bloqueo de la base de datos nunca el bloqueo de objetos en memoria La clase LockMode define los diferentes niveles de bloqueo que Hibernate puede adquirir Un bloqueo se obtiene por medio de los siguiente
189. cuci n de declaraciones en masa DML del estilo de SQL las cuales se realizan por medio del Lenguaje de Consulta de Hibernate HQL H La pseudo sint xis para las declaraciones UPDATE y DELETE S UPDATE DELETE FROM EntityName WHERE where_conditions Algunos puntos a observar e En la cl usula from la palabra clave FROM es opcional S lamente puede haber una entidad mencionada en la cl usula from y puede tener un alias Si el nombre de la entidad tiene un alias entonces cualquier referencia a la propiedad tiene que ser calificada utilizando ese alias Si el nombre de la entidad no tiene un alias entonces es ilegal calificar cualquier referencia de la propiedad 209 Cap tulo 14 Procesamiento po e No se puede especificar ninguna uni n ya sea impl cita o expl cita en una consulta masiva de HQL Se pueden utilizar subconsultas en la cl usula where y en donde las subconsultas puedan contener uniones en s mismas e La cl usula where tambi n es opcional Como ejemplo para ejecutar un UPDATE de HAL utilice el m todo Query executeUpdate El m todo es nombrado para aquellos familiarizados con el PreparedStatement executeUpdate de JDBC Session session sessionFactory openSession Transaction tx session beginTransaction String hqlUpdate update Customer c set c name newName where c name oldName
190. cution time by not dirty checking simple properties or single ended associations e It saves memory by deleting database snapshots 11 1 Making persistent entities read only Only persistent entities can be made read only Transient and detached entities must be put in persistent state before they can be made read only 175 Cap tulo 11 Read only entities Hibernate provides the following ways to make persistent entities read only you can map an entity class as immutable when an entity of an immutable class is made persistent Hibernate automatically makes it read only see Secci n 11 1 1 Entities of immutable classes for details you can change a default so that entities loaded into the session by Hibernate are automatically made read only see Secci n 11 1 2 Loading persistent entities as read only for details you can make an HQL query or criteria read only so that entities loaded when the query or criteria executes scrolls or iterates are automatically made read only see Secci n 11 1 3 Loading read only entities from an HQL query criteria for details you can make a persistent entity that is already in the in the session read only see Secci n 11 1 4 Making a persistent entity read only for details 11 1 1 Entities of immutable classes When an entity instance of an immutable class is made persistent Hibernate automatically makes it read only An entity of an immutable class can cr
191. d i q setParameter blogid blogid blog Blog q uniqueResult Exo Commits catch HibernateException he If txt null tx rollback throw he finally session close return blog public List listBlogsAndRecentItems throws HibernateException Session session _sessions openSession Transaction tx null List result null try tx session beginTransaction Query q session createQuery from Elog as Log inner join blog items as blogItem where blogItem datetime gt minDate i 307 Cap tulo 23 Ejemplo Aplicac Calendar cal Calendar getInstance j cal roll Calendar MONTH false q setCalendar minDate cal result q list tx commit catch HibernateException he f EAS rolls y throw he finally session close I return result 308 Ejemplo mapeos varios Este cap tulo explora algunos de los mapeos de asociaciones m s complejos 24 1 Empleador Empleado El siguiente modelo de la relaci n entre Employer y Employee utiliza una clase de entidad Employment para representar la asociaci n Puede hacer esto cuando podr a haber m s de un per odo de empleo para los dos mismos participantes Se utilizan componentes para modelar los valores monetarios y los nombres de los empleados Employer eemploveran Oe Employment id long startDate Date name String endDate Date getld long id long set
192. d gt lt generator class native gt lt id gt lt set name addresses gt lt key column personld not null true gt lt one to many class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table Person personld bigint not null primary key create table Address addressId bigint not null primary key personId bigint not null En lugar debe utilizar una tabla de uni n para esta clase de asociaci n 7 3 Asociaciones unidireccionales con tablas de uni n 7 3 1 Uno a muchos Se prefiere una asociaci n unidireccional uno a muchos en una tabla de uni n El especificar unique true cambia la multiplicidad de muchos a muchos a uno a muchos lt class name Person gt lt id name id column personld gt lt generator class native gt lt id gt lt set name addresses table PersonAddress gt lt key column personld gt lt many to many column addressId unique true 131 Cap tulo 7 Mapeos de asociaci n class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressld gt lt generator class native gt lt a gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId not null addressId bigint not null primary key create table
193. d item_id item id group by item name lt subselect gt lt synchronize table item gt lt synchronize table bid gt lt id name name gt ass lara las tablas con las cuales se debe sincronizar esta entidad asegurandose de que el auto vaciado ocurra correctamente y que las consultas frente a la entidad derivada no devuelvan datos desactualizados El lt subselect gt se encuentra disponible tanto como un atributo y como un elemento anidado de mapeo 5 1 Las 4 id clases mapeadas tienen que declarar la columna de clave primaria de la tabla de la base de datos La mayor a de las clases tambi n tendr n una propiedad de estilo Javabeans que tenga el id colu aiel o 000 entificador nico de una instancia El elemento lt ia gt define el mapeo de esa propiedad a la mna de clave primaria name propertyName type typename column column_name unsaved value null any none undefined id_value 000090 access field property ClassName gt node element name attribute name element attribute lt generator class generatorClass gt name opcional El nombre de la propiedad del identificador s type opcional un nombre que indica el tipo de Hibernate column opcional por defecto es el nombre de la propiedad El nombre de la columna de la clave principal unsaved value opcional por defecto es un valor sensible Un valor de la propiedad identificadora que indica que una ins
194. datos ya inicializados que se requieran para un caso de uso en particular Usualmente la aplicaci n llama a Hibernate initialize para cada colecci n que se necesitar en la capa web esta llamada debe tener lugar antes de que se cierre la sesi n o recupera la colecci n tempranamente utilizando una consulta de Hibernate con una cl usula FETCH o una FetchMode JOIN en Criteria Usualmente esto es m s f cil si adopta el patr n Comando en vez de una Fachada de Sesi n Tambi n puede adjuntar un objeto cargado previamente a una nueva Session CON merge O lock antes de acceder a colecciones no inicializadas u otros proxies Hibernate no y ciertamente no debe hacer esto autom ticamente ya que introducir a sem nticas de transacci n improvisadas A veces no quiere inicializar una colecci n grande pero todav a necesita alguna informaci n sobre ella como por ejemplo su tama o o un subconjunto de los datos Puede utilizar un filtro de colecciones para obtener el tama o de una colecci n sin inicializarla Integer s createFilter collection select count list get 0 intValue El m todo createFilter tambi n se utiliza para recuperar eficientemente subconjuntos de una colecci n sin necesidad de inicializar toda la colecci n s createFilter lazyCollection setFirstResult 0 setMaxResults 10 list 20 1 5 Utilizaci n de recuperaci n de lotes Usando la recuperaci n por lotes Hibernat
195. de objetos de esta clase 69 Cap tulo 5 Mapeo O R B sico persister opcional Especifica un classPersister personalizado batch size opcional por defecto es 1 especifica un tama o de lote para buscar instancias de esta clase por identificador optimistic locx opcional por defecto es version Determina la estrategia optimista de bloqueo lazy opcional La recuperaci n perezosa se puede deshabilitar por completo al establecer E 6 98 lazy false entity name optional defaults to the class name Hibernate3 allows a class to be mapped multiple times potentially to different tables lt also allows entity mappings that are represented by Maps or XML at the Java level In these cases you should provide an explicit arbitrary name for the entity See Secci n 4 4 Modelos din micos and Cap tulo 19 Mapeo XML for more information check opcional Una expresi n SQL utilizada para generar una restricci n check multi filas para la generaci n autom tica de esquemas KE rowia opcional Hibernate puede utilizar los llamados ROWIDs en las bases de datos Por ejemplo en Oracle Hibernate puede utilizar la columna extra rowid para actualizaciones r pidas si usted establece esta opci n como rowid Un ROWID es un detalle de implementaci n y representa la posici n f sica de la tupla almacenada EN subselect opcional Mapea una entidad inmutable y de s lo lectura a una sub
196. desconecta expl citamente Para una fuente de datos JTA del servidor de aplicaciones debe utilizar after_statement para liberar agresivamente las conexiones despu s de cada llamada JDBC Para una conexi n no JTA frecuentemente tiene sentido el liberar la conexi n al final de cada transacci n el utilizarafter_transaction auto escoger after_statement para las estrategias de transacci n JTA y CMT y after_transaction para la estrategia JDBC de transacci n e g auto default on_close after _ transaction after_statement This setting only affects Sessions returned from SessionFactory openSession For Sessions obtained through SessionFactory getCurrentSession the CurrentSessionContext implementation configured for use controls the connection release mode for those Sessions See Secci n 2 5 Sesiones contextuales 40 Par metros de configuraci n opcionales Nombre de la propiedad hibernate connection lt propertyName gt hibernate jndi lt propertyName gt Prop sito Pasar la propiedad JDBC lt propertyName gt a DriverManager getConnection Pasar la propiedad lt propertyName gt al InitialContextFactory JNDI Tabla 3 5 Propiedades de Cach de Hibernate Nombre de la propiedad hibernate cache provider_class Prop sito El nombre de clase de un CacheProvider personalizado e g classname of CacheProvider hibernate cache use_minim
197. destino de una asociaci n puede ser adem s una entidad din mica en lugar de un POJO Despu s de establecer el modo de entidad predeterminado como dynamic map para la SessionFactory puede trabajar en tiempo de ejecuci n con Mapeos de Mapeos Session s openSession Transaction tx s beginTransaction Create a customer Map david new HashMap 58 Tuplizers david put name David Create an organization Map foobar new HashMap FOo0baraput name Foobar Inc Link both david put organization foobar Save both s save Customer david s save Organization foobar tx commit s close Una de las ventajas principales de un mapeo din mico es el r pido tiempo de entrega del prototipado sin la necesidad de implementar clases de entidad Sin embargo pierde el chequeo de tipos en tiempo de compilaci n y muy probablemente tendr que tratar con muchas excepciones en tiempo de ejecuci n Gracias al mapeo de Hibernate el esquema de base de datos se puede normalizar y volver s lido permitiendo a adir una implementaci n apropiada del modelo de dominio m s adelante Los modos de representaci n de entidad se pueden establecer por Session Session dynamicSession pojoSession getSession EntityMode MAP Create a customer Map david new HashMap david put name David dynamicSession save Customer david dynamicSession flush dyna
198. dividual columns like this lt property name creditCardNumber gt lt column name credit_card_num read decrypt credit_card_num write encrypt gt lt property gt Hibernate aplica las expresiones personalizadas de manera autom tica cuando la propiedad se referencia en una petici n Esta funcionalidad es similar a una propiedad derivada formula con dos diferencias e Esta propiedad est respaldada por una o m s columnas que se exportan como parte de la generaci n autom tica del esquema e La propiedad es de lectura y escritura no de s lo lectura Si se especifica la expresi n write debe contener exactamente un par metro de sustituci n para el valor 5 8 Objetos de bases de datos auxiliares Los objetos de bases de datos auxiliares permiten la creaci n CREATE y eliminaci n DROP de objetos de bases de datos arbitrarios Junto con las herramientas de evoluci n del esquema de Hibernate tienen la habilidad de definir de manera completa el esquema de un usuario dentro de los archivos de mapeo de Hibernate Aunque est n dise ados espec ficamente para crear y eliminar cosas como disparadores triggers o procedimientos almacenados realmente cualquier comando SQL se puede ejecutar por medio de un m todo java sql Statement execute aqui es v lido por ejemplo ALTERs INSERTS etc B sicamente hay dos modos para definir objetos de bases de datos auxiliares El primer modo es para numerar expl
199. do cuando se vacie la Session Esto se discute m s adelante en este cap tulo No hay necesidad de llamar a un m todo en particular como update que tiene un prop sito diferente para hacer persistentes sus modificaciones De modo que la forma m s directa de actualizar el estado de un objeto es cargarlo con load y luego manipularlo directamente mientras la Session est abierta DomesticCat cat DomesticCat sess load Cat class new Long 69 cat setName PK sess flush changes to cat are automatically detected and persisted A veces este modelo de programaci n es ineficiente pues requiere un SELECT de SQL para cargar un objeto y un UPDATE de SQL para hacer persistente su estado actualizado en la misma sesi n Por lo tanto Hibernate ofrece un enfoque opcional utilizando instancias separadas Importante Hibernate does not offer its own API for direct execution of UPDATE Or DELETE statements Hibernate is a state management service you do not have to think in statements to use it JDBC is a perfect API for executing SQL statements you can get a JDBC connection at any time by calling session connection Furthermore the notion of mass operations conflicts with object relational mapping for online transaction processing oriented applications Future versions of Hibernate can however provide special mass operation functions See Cap tulo 14 Procesamiento por lotes for some possible batch operation tri
200. dtd gt lt hibernate mapping package org hibernate tutorial domain gt Lao ol lt hibernate mapping gt El DTD de Hibernate es sofisticado Puede utilizarlo para autocompletar los elementos y atributos XML de mapeo en su editor o IDE Abrir el archivo DTD en su editor de texto es la manera m s f cil para obtener una sinopsis de todos los elementos y atributos y para ver los valores por defecto as como algunos de los comentarios Note que Hibernate no cargar el fichero DTD de la web sino que primero lo buscar en la ruta de clase de la aplicaci n El archivo DTD se encuentra incluido en hibernate core jar tambi n en hibernate3 jar si esta usando el paquete de la distribuci n gt Importante Omitiremos la declaraci n de DTD en los ejemplos posteriores para hacer m s corto el c digo Esto no es opcional Entre las dos etiquetas hibernate mapping incluya un elemento class Todas las clases de entidad persistentes de nuevo podr an haber clases dependientes m s adelante las cuales no son entidades de primera clase necesitan de dicho mapeo en una tabla en la base de datos SQL lt hibernate mapping package org hibernate tutorial domain gt lt class name Event table EVENTS gt lt class gt lt hibernate mapping gt Hasta ahora le hemos dicho a Hibernate c mo persistir y cargar el objeto de clase Event a la tabla EVENTS Cada instancia se encuentra representada por una fila en esa tabla Ahora
201. durante actualizaciones de producto deshacer cambios realizados durante transacciones no ACID y m s 10 10 Limpieza flushing de la sesi n A veces la Session ejecutar las declaraciones SQL necesarias para sincronizar el estado de la conexi n JDBC con el estado de los objetos en la menoria Este proceso denominado vaciado flush ocurre por defecto en los siguientes puntos antes de algunas ejecuciones de consulta e desde org hibernate Transaction commit e desde session flush Las declaraciones SQL se emiten en el siguiente orden 1 todas las inserciones de entidades en el mismo orden que los objetos correspondientes fueron guardados utilizando session save todas las actualizaciones de entidades todas los borrados de colecciones todos los borrados actualizaciones e inserciones de elementos de colecci n todas las inserciones de colecciones oar W PP todos los borrados de entidades en el mismo orden que los objetos correspondientes fueron borrados usando Session delete Una excepci n es que los objetos que utilizan generaci n de ID native se insertan cuando se guardan Excepto cuando llama expl citamente a flush no hay en absoluto garant as sobre cu ndo la Session ejecuta las llamadas JDBC s lamente sobre el orden en que se ejecutan Sin embargo Hibernate garantiza que los m todos Query list nunca devolver n datos desactualizados o incorrectos It is possible to change the d
202. e return true return false public void afterTransactionCompletion Transaction tx if tx wasCommitted System out println Creations creates Updates updates Loads updates 0 E ALOAS e creates 0 loads 0 Hay dos clases de interceptores incluido en Session e incluido en SessionFactory Se especifica un interceptor inclu do Session cuando se abre una sesi n utilizando uno de los m todos SessionFactory openSession sobrecargados aceptando un Interceptor Session session sf openSession new AuditInterceptor 202 Sistema de eventos Un interceptor incluido en SessionFactory se encuentra registrado con el objeto Configuration antes de construir el SessionFactory En este caso el interceptor proveido ser aplicado a todas las sesiones abiertas desde ese SessionFactory a menos de que se abra una sesi n especificando expl citamente el interceptor a utilizar Los interceptores SessionFactory incluidos deben ser a prueba de hilos Aseg rese de no almacenar un estado especifico a la sesi n ya que m ltiples sesiones utilizar n este interceptor potencialmente de manera concurrente new Configuration setInterceptor new AuditInterceptor 13 2 Sistema de eventos Si tiene que reaccionar a eventos particulares en su capa de persistencia tambi n puede utilizar la arquitectura de eventos de Hibernate3 El sistema de eventos se puede ser utilizar adem s de o como u
203. e 000090 unique true false lt property KS lt many to one gt lt properties gt name El nombre l gico del agrupamiento No es un nombre de propiedad insert Las columnas mapeadas aparacen en INSERTs SQL update Las columnas mapeadas aparacen en UPDATES SQL 00090 optimistic lock opcional por defecto es true Especifica que las actualizaciones de estas propiedades requieren o no de la adquisici n de un bloqueo optimista Determina si debe ocurrir un incremento de versi n cuando estas propiedades est n desactualizadas 6 unique opcional por defecto es false Especifica que existe una restricci n de unicidad sobre todas las columnas mapeadas del componente Por ejemplo si tenemos el siguiente mapeo de lt properties gt lt class name Person gt lt id name personNumber gt lt properties name name unique true update false gt lt property name firstName gt lt property name initial gt lt property name lastName gt lt properties gt lt class 91 Cap tulo 5 Mapeo O R B sico Puede que tenga alguna asociaci n de datos heredados que se refiera a esta clave nica de la tabla de Person en lugar de la clave principal lt many to one name person class Person property ref name gt lt column name firstName gt lt column name initial gt lt column name lastName gt lt many to one No recomendamos el uso de est
204. e ENE SO tx roll libacki throw he finally session close public void updateBlogItem Long itemid String text throws HibernateException Session session _sessions openSession Transaction tx null Ery i tx session beginTransaction Blogltem item BlogItem session load BlogItem class itemid item setText text tx commit catch HibernateException he f tex null ts rollback throw he finally session close public List listAllBlogNamesAndItemCounts int max throws HibernateException Session session _sessions openSession Transaction tx null List result null Ery i tx session beginTransaction Query q session createQuery select blog id blog name count blogItem from Blog as blog T w 306 C digo Hibernate left outer join blog items as blogltem q roup by blog name blog ad 1 p order by max bloglItem datetime i q setMaxResults max result q list exe Commies Oy catch HibernateException he af txt null tx reliback throw he finally session close return result public Blog getBlogAndAllItems Long blogid throws HibernateException Session session _sessions openSession Transaction tx null Blog blog nuli try tx session beginTransaction Query q session createQuery from Blog as Blog left outer join fetch blog items where blog id blogi
205. e column_name length N precision N scale N not null true false unique true false unique key multicolumn_unique_key_name index index_name sql type sql_type_name check SOL expression default SOL expression read SOL expression write SQOL expression gt 97 Cap tulo 5 Mapeo O R B sico lt formula gt SQL expression lt formula gt La mayoria de los atributos en column proporcionan una manera de personalizar el DDL durante la generaci n del esquema autom tico Los atributos read y write le permiten especificar SQL personalizado que Hibernate utilizar para acceder el valor de la columna Para obtener mayor informaci n sobre esto consulte la discusi n sobre expresiones de lectura y escritura de columnas Los elementos column y formula incluso se pueden combinar dentro del mismo mapeo de propiedad o asociaci n para expresar por ejemplo condiciones de uni n ex ticas lt many to one name homeAddress class Address insert false update false gt lt column name person_id not null true length 10 gt lt formula gt MAILING lt formula gt lt many to one gt 5 1 23 Import Si su aplicaci n tiene dos clases persistentes con el mismo nombre y no quiere especificar el nombre del paquete completamenta calificado en las consultas Hibernate las clases pueden ser importadas expl citamente en lugar de depender de auto import true Incluso puede importar clases e
206. e bajo costo inseguro entre hilos que se debe utilizar una sola vez y luego se debe descartar para un s lo pedido una sola conversaci n o una s la unidad de trabajo Una Session no obtendr una Connection JDBC o Un Datasource a menos de que sea necesario No consumir recursos hasta que se utilice Una transacci n de la base de datos tiene que ser tan corta como sea posible para reducir la contenci n de bloqueos en la base de datos Las transacciones largas de la base de datos prevendr n a su aplicaci n de escalar a una carga altamente concurrente Por lo tanto no se recomienda que mantenga una transacci n de la base de datos abierta durante el tiempo para pensar del usuario hasta que la unidad de trabajo se encuentre completa Cu l es el mbito de una unidad de trabajo Puede una sola Session de Hibernate extenderse atrav s de varias transacciones de la base de datos o sta es una relaci n uno a uno de mbitos Cu ndo debe abrir y cerrar una Session y c mo demarca los l mites de la transacci n de la base de datos En las siguientes secciones abordaremos estas preguntas 185 Cap tulo 12 Transacciones y 12 1 1 Unidad de trabajo First let s define a unit of work A unit of work is a design pattern described by Martin Fowler as maintaining a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems POEAA In other
207. e cach estrategia de concurrencia 278 20 3 Gesti n de Cach s sssvivestesiecccenntieedaneiccddeavitercnandeccddntuiedernnsdedcaavadersaanveeddansydes 278 20 4 El Cach de Consultas cooonocccccococccccononnnonononnncnnnnnnnnonnnnnnnnnannnnnnnnnnnnnnnnnnnnnnnns 279 20 4 1 Habilitaci n del cach de peticiones ooooconnconncccinccncccnnonccnccnnancnnnnnnnnnos 280 20 4 2 Regiones de cach de consultas ooocicccccccnconococoncnnccnnnonnnnconcancnnnnnnnans 281 20 5 Comprensi n del rendimiento de Colecciones ccooonccccconoccconnnaccnnnnnacnnnnnnaninns 281 20 54 Vaxonomia ita aia 281 20 5 2 Las listas mapas idbags y conjuntos son las colecciones m s eficientes de ACI ANI ZAR tn aa 282 20 5 3 Los Bags y las listas son las colecciones inversas m s eficientes 283 20 5 4 Borrado de UN s lo tiro occcooonnnncccoconnccnoconnnnnnonnnonnnconnnnnncnnnonnnrnnnonnnoos 283 20 6 Control del rendimiento 000 liar dad ande 284 20 6 1 Control de una SessionFactory ooocccccccccccononnccccnnnnncnnnnnnnnncnnnn cnn nnnnnancnnn 284 20 6 2 2 M TICAS cocida 285 21 Manual del conjunto de herramientas ooooooooocccccccoccccncnncccnnnnnccnnnnnnronnnnnnrrnnn nacion 287 21 1 Generaci n autom tica de esquemas oooooccccccnconcnnnnnnnnccnnnnnonnnonnancnnnnn cnn nnnnnans 287 21 1 1 Personalizaci n del esquema cooococcccccnnnnccnnnonnnnconcnncnnonnnnancnncnncnnnnnnnnns 288 21 1 2 Ejecuci n de la herramienta
208. e de instancia por primera vez Requiere instrumentaci n de c digo byte en tiempo de compilaci n optimistic lock opcional por defecto es true Especifica que las actualizaciones de este componente requieren o no la adquisici n de un bloqueo optimista Determina si debe ocurrir un incremento de versi n cuando esta propiedad se encuentra desactualizada unique opcional por defecto es false Especifica que existe una restricci n de unicidad sobre todas las columnas mapeadas del componente Las etiquetas hijas lt property gt mapean propiedades de la clase hija a las columnas de la tabla El elemento lt component gt permite un subelemento lt parent gt que mapea una propiedad de la clase del componente como una referencia a la entidad contenedora 90 Propiedades The lt dynamic component gt element allows a Map to be mapped as a component where the property names refer to keys of the map See Secci n 8 5 Componentes din micos for more information 5 1 16 Propiedades El elemento lt properties gt permite la definici n de un grupo de propiedades l gico con nombre de una clase El uso m s importante de la contrucci n es que permite que una combinaci n de propiedades sea el objetivo de una property ref Tambi n es una forma pr ctica de definir una restricci n de unicidad multicolumna Por ejemplo lt properties name logicalName insert true false update true false optimistic lock truelfals
209. e de una propiedad de la clase asociada que se encuentra unida a su llave for nea Si no se especifica se utiliza la llave principal de la clase asociada access opcional por defecto es property La estrategia que Hibernate utiliza para acceder al valor de la propiedad 85 Cap tulo 5 Mapeo O R B sico O unique opcional Activa la generaci n DDL de una restricci n de unicidad para la columna de clave for nea Adem s permite que ste sea el objetivo de una property ref puede hacer que la asociaci n sea de multiplicidad uno a uno not nul1 opcional Activa la generaci n DDL de una restricci n de nulabilidad para las columnas de clave for nea optimistic lock opcional por defecto es true Especifica que las actualizaciones a esta propiedad requieren o no de la obtenci n de un bloqueo optimista En otras palabras determina si debe ocurrir un incremento de versi n cuando la propiedad se encuentre desactualizada Pb lazy opcional por defecto es proxy Por defecto las asociaciones de punto nico van con proxies lazy no proxy especifica que esta propiedad debe ser recuperada perezosamente cuando se acceda por primera vez a la variable de instancia Requiere instrumentaci n del c digo byte en tiempo de compilaci n lazy false especifica que la asociaci n siempre ser recuperada tempranamente not founa opcional por defecto es exception Especifica c mo se manejar n las claves for
210. e hecho el poder del lenguaje de consulta es uno de las fortalezas principales de Hibernate He aqu algunos ejemplos de consultas muy similares a las consultas de proyectos recientes Note que la mayor a de las consultas que escribir son mucho m s simples que los siguientes ejemplos La siguiente consulta retorna el order id n mero de items y valor total m nimo dado y el valor de la orden para todas las rdenes no pagadas de un cliente en particular Los resultados se ordenan de acuerdo al valor total Al determinar los precios usa el cat logo actual La consulta SQL resultante contra las tablas ORDER ORDER_LINE PRODUCT CATALOG Y PRICE tiene cuatro uniones interiores y una subselecci n no correlacionada 227 Cap tulo 15 HQL El lenguaje select order id sum price amount count item from Order as order join order lineltems as item join item product as product Catalog as catalog join catalog prices as price where order paid false and order customer customer and price product product and catalog effectiveDate lt and catalog effectiveDate gt all sysdate select cat effectiveDate from Catalog as cat where cat effectiveDate group by order having sum price amount gt minAmount order by sum price amount desc lt sysdate Qu monstruo Realmente en la vida real no me gustan mucho las subconsultas de modo que mi consulta fue realmente algo
211. e las capacidades de la base de datos subyacente assigned deja a la aplicaci n asignar un identificador al objeto antes de que se llame a save Esta es la estrategia por defecto si no se especifica un elemento lt generator gt select recupera una clave principal asignada por un disparador de base de datos seleccionando la fila por alguna clave nica y recuperando el valor de la clave principal foreign utiliza el identificador de otro objeto asociado Generalmente se usa en conjunto c n a una asociaci n de clave principal lt one to one gt sequence identity una estrategia de generaci n de secuencias especilizadas que utiliza una secuencia de base de datos para el valor real de la generaci n pero combina esto junto con JDBC3 getGeneratedKeys para devolver el valor del identificador generado como parte de la ejecuci n de la declaraci n de inserci n Esta estrategia est soportada s lamente en los controladores 10g de Oracle destinados para JDK1 4 Los comentarios en estas declaraciones de inserci n est n desactivados debido a un error en los controladores de Oracle 5 1 4 2 Algoritmo alto bajo Los generadores hilo Y seghilo brindan dos implementaciones opcionales del algoritmo alto bajo La primera implementaci n necesita de una tabla especial de base de datos para tener el siguiente valor alto disponible La segunda utiliza una secuencia del estilo de Oracle donde se encuentre soportada lt id name id type
212. e name address property ref person cascade all fetch join gt 24 4 5 Asociaciones sobre claves alternativas 319 Cap tulo 24 Ejemplo mapeos lt set name accounts inverse true gt lt key column userld property ref userld gt lt one to many class Account gt lt set gt lt property name userld length 8 gt lt class gt lt class name Address gt lt id name id gt lt generator class hilo gt lt id gt lt property name address length 300 gt lt property name zip length 5 gt lt property name country length 25 gt lt many to one name person unique true not null true gt lt class gt lt class name Account gt lt id name accountId length 32 gt lt generator class uuid gt lt S e lt many to one name user column userld property ref userld gt lt property name type not null true gt else gt 320 Pr cticas recomendadas Escriba las clases detalladas y map elas utilizando lt component gt Utilice una clase Direcci n para encapsular calle distrito estado c digo postal Esto promueve la reutilizaci n de c digo y simplifica la refabricaci n Declare las propiedades identificadoras en clases persistentes Las propiedades identificadoras son opcionales en Hibernate Existe todo tipo de razones por las que debe usarlas Recomendamos que los identificadores sean sint ticos es decir ge
213. e principal Hibernate no tiene forma de distinguir entre filas duplicadas Hibernate resuelve este problema quitando por completo con un s lo DELETE y recreando la colecci n siempre que cambia Esto puede ser muy ineficiente H Para una asociaci n uno a muchos la clave principal puede no ser la clave principal f sica de la tabla de la base de datos Incluso en este caso la clasificaci n anterior es til todav a Refleja c mo Hibernate localiza filas individuales de la colecci n 20 5 2 Las listas mapas idbags y conjuntos son las colecciones m s eficientes de actualizar De la discusi n anterior debe quedar claro que las colecciones indexadas y los conjuntos permiten una operaci n m s eficiente en t rminos de agregar quitar y actualizar elementos Discutiblemente hay una ventaja m s de las colecciones indexadas sobre otros conjuntos para las asociaciones muchos a muchos o colecciones de valores Debido a la estructura de un set Hibernate ni siquiera actualiza una fila con UPDATE cuando se cambia un elemento Los cambios a un set siempre funcionan por medio de INSERT y DELETE de filas individuales Una vez m s esta consideraci n no se aplica a las asociaciones uno a muchos mE Despu s de observar que los arrays no pueden ser perezosos podr amos concluir que las listas mapas e idbags son los tipos m s eficientes de colecciones no inversas con los conjuntos sets no muy
214. e puede cargar varios proxies sin inicializar si se accede a un proxy La recuperaci n en lotes es una optimizaci n de la estrategia de recuperaci n por selecci n perezosa Hay dos formas en que puede configurar la recuperaci n en lotes a nivel de la clase y a nivel de colecci n La recuperaci n en lotes para clases entidades es m s f cil de entender Considere el siguiente ejemplo en tiempo de ejecuci n tiene 25 instancias de cat cargadas en una Session y cada Cat tiene una referencia a SU owner UNa Person La clase Person est mapeada con un proxy 271 Cap tulo 20 Mejoramiento del lazy true Si ahora itera a trav s de todos los cats y llama a getowner para cada uno Hibernate por defecto ejecutar 25 declaraciones SELECT para recuperar los due os proxies Puede afinar este comportamiento especificando un batch size en el mapeo de Person lt class name Person batch size 10 gt a S elass gt Hibernate ahora ejecutar s lamente tres consultas el patr n es 10 10 5 Tambi n puede habilitar la recuperaci n en lotes para colecciones Por ejemplo si cada Person tiene una colecci n perezosa de cats y hay 10 personas actualmente cargadas en la Session iterar a trav s de las 10 personas generar 10 SELECTS uno para cada llamada a getCats Si habilita la recuperaci n en lotes para la colecci n de cats en el mapeo de Person Hibernate puede recuperar por adelantado las colecciones
215. e ser n devueltas s lo por consultas que mencionen expl citamente la clase Las consultas que mencionen la clase retornar n s lo instancias de subclases mapeadas dentro de esta declaraci n lt class gt como una lt subclass gt O lt joined subclass gt Para la mayor a de los prop sitos el valor por defecto polymorphism implicit resulta apropiado El polimorfismo expl cito es til cuando 70 Clase dos clases diferentes se encuentran mapeadas a la misma tabla Esto permite tener una clase liviana que contenga un subconjunto de columnas de la tabla El atributo persister le permite personalizar la estrategia de persistencia para la clase Por ejemplo puede especificar su propia subclase de org hibernate persister EntityPersister o incluso puede proporcionar una implementaci n completamente nueva de la interfaz org hibernate persister ClassPersister que implemente por ejemplo la persistencia por medio de llamadas a procedimientos almacenados serializaci n a archivos planos o LDAP Para ver un ejemplo simple de persistencia a una Hashtable consulte org hibernate test CustomPersister Los valores de dynamic update Y dynamic insert no son heredados por las subclases y por lo tanto deben especificarse en los elementos lt subclass gt O lt joined subclass gt Aunque en algunos casos estos ajustes pueden incrementar el rendimiento de hecho en otros casos podr an disminuirlo El uso de select bef
216. e tipo de cosas fuera del contexto del mapeo de datos heredados 5 1 17 Subclase La persistencia polim rfica requiere la declaraci n de cada subclase de la clase persistente ra z Para la estrategia de mapeo tabla por jerarqu a de clases se utiliza la declaraci n lt subclass gt Por ejemplo lt subclass name ClassName discriminator value discriminator_value proxy ProxyInterface 0000 lazy true false dynamic update true false dynamic insert true false entity name EntityName node element name extends SuperclassName gt PLE lt subclass gt name El nombre de clase completamente calificado de la subclase discriminator value opcional por defecto es el nombre de la clase Un valor que distingue subclases individuales proxy opcional Especifica una clase o interfaz que se utiliza para proxies de inicializaci n perezosa lazy opcional por defecto es true El establecer lazy false desactiva el uso de la recuperaci n perezosa o 0 00 92 joined subclass Cada subclase debe declarar sus propias propiedades persistentes y subclases Se asume que las propiedades lt version gt y lt id gt son heredadas de la clase ra z Cada subclase en una jerarqu a tiene que definir un discriminator value nico Si no se especifica ninguno entonces se utiliza el nombre completamente calificado de clase Java For information about inheritance mappings see Cap tulo 9 Mapeo de herenci
217. e transacci n La API de Session de Hibernate es independiente de cualquier demarcaci n de transacci n en su arquitectura Si deja que Hibernate utilice JDBC directamente a trav s de un pool de conexiones puede comenzar y acabar sus transacciones llamando la API de JDBC Si ejecuta en un servidor de aplicaciones J2EE puede que quiera utilizar transacciones administradas por bean y llamar la API de JTA y UserTransaction cuando sea necesario Para mantener su c digo portable entre estos dos y otros entornos le recomendamos la API de Transaction de Hibernate que envuelve y oculta el sistema subyacente Tiene que especificar una clase f brica para las instancias de Transact ion estableciendo la propiedad de configuraci n hibernate transaction factory_class de Hibernate Existen tres opciones est ndares o incorporadas org hibernate transaction JDBCTransactionFactory delega a transacciones de bases de datos JDBC por defecto org hibernate transaction JTATransactionFactory delega a transacciones administradas por el contenedor si una transacci n existente se encuentra en proceso en este contexto por ejemplo un m todo de bean de sesi n EJB De otra manera se inicia una nueva transacci n y se utilizan las transacciones administradas por bean 49 Cap tulo 3 Configuraci n org hibernate transaction CMTTransactionFactory delega a transacciones JTA administradas por el contenedor Tambi n puede definir sus propia
218. e transacci n Es posible configurar un cl ster o cach a nivel de MVJ a nivel de SessionFactory sobre una base de clase por clase o colecci n por colecci n Incluso puede enchufar un cach en cl ster Tenga en cuenta de que los cach s nunca est n al tanto de los cambios que otra aplicaci n haya realizado al almac n persistente Sin embargo se pueden configurar para que los datos en cach expiren regularmente Tiene la opci n de decirle a Hibernate cual implementaci n de cach utilizar al especificar el nombre de una clase que implemente org hibernate cache CacheProvider Utilizando la propiedad hibernate cache provider_class Hibernate viene vinculada con un n mero de integraciones incorporadas con los proveedores cach de c digo abierto enumerados a continuaci n Adem s puede implementar el suyo y enchufarlo como se explic anteriormente Observe que las versiones anteriores a 3 2 por defecto utilizan EhCache como proveedor de cach Tabla 20 1 Proveedores de Cach Cach Clase del Provedor Tipo Cl ster Cach de Seguro Consultas Soportado Hashtable org hibernate cache HashtableCachememoldar yes no fue pensado para la utilizaci n en producci n EHCache org hibernate cache EhCacheProvidememoria yes disco OSCache org hibernate cache OSCacheProvidememoria yes disco 275 Cap tulo 20 Mejoramiento del Cach Clase del Provedor Tipo Cl ster Cach de Seguro Consultas Soportado
219. e utilizar cascade all delete orphan lt set name children inverse true cascade all delete orphan gt lt key column parent_id gt lt one to many class Child gt lt set gt Aunque el mapeo de la colecci n especifique inverse true el tratamiento en cascada se procesa a n al iterar los elementos de la colecci n De modo que si necesita que un objeto se guarde borre o actualice en cascada debe a adirlo a la colecci n No es suficiente con simplemente llamar a setParent 298 Cascadas y unsaved value 22 4 Cascadas y unsavea vaiue Suppose we loaded up a Parent in one Session made some changes in a UI action and wanted to persist these changes in a new session by calling update The Parent will contain a collection of children and since the cascading update is enabled Hibernate needs to know which children are newly instantiated and which represent existing rows in the database We will also assume that both Parent and child have generated identifier properties of type Long Hibernate will use the identifier and version timestamp property value to determine which of the children are new See Secci n 10 7 Detecci n autom tica de estado In Hibernate3 it is no longer necessary to specify an unsaved value explicitly El siguiente c digo actualizar parent y child e insertar newChild parent and child were both loaded in a previous session parent addChild child Child ne
220. ea columna de elemento de colecci n o columnas y posiblemente una columna o columnas ndices Para una colecci n de valores utilice la etiqueta lt element gt Por ejemplo lt element column column_name formula any SOL expression 0090 type typename length L precision P scale g not null true false unique true false node element name is column optional the name of the column holding the collection element values formula optional an SQL formula used to evaluate the element O type required the type of the collection element A many to many association is specified using the lt many to many gt element lt many to many column column_name formula any SOL expression class ClassName fetch select join unique true false not found ignorelexception entity name EntityName 00000000 property ref propertyNameFromAssociatedClass node element name embed xml true false i column optional the name of the element foreign key column 6 formula optional an SQL formula used to evaluate the element foreign key value class required the name of the associated class 116 Colecciones de valores y asociaciones muchos a muchos fetch optional defaults to join enables outer join or sequential select fetching for this association This is a special case for full eager fetching in a single SELECT of an entity and its many to many relationship
221. easeMode AFTER_TRANSACTION si se considera que una sesi n se encuentra en modo auto commit las conexiones ser n liberada como si el modo de liberaci n fuese AFTER_STATEMENT after_statement usa ConnectionReleaseMode AFTER_STATEMENT Adem s se consulta la ConnectionProvider configurada para ver si soporta esta caracteristica support sAggressiveRelease Si no el modo de liberaci n se vuelve a establecer como ConnectionReleaseMode AFTER_TRANSACTION Esta configuraci n s lamente es segura en entornos en donde podemos re adquirir la misma conexi n JDBC subyacente cada vez que llamamos a ConnectionProvider getConnection o en entornos auto commit en donde no importa si recibimos la misma conexi n 200 Interceptores y eventos Es til para la aplicaci n reaccionar a ciertos eventos que ocurren dentro de Hibernate Esto permite la implementaci n de funcionalidades gen ricas y la extensi n de la funcionalidad de Hibernate 13 1 Interceptores La interfaz Interceptor brinda callbacks desde la sesi n a la aplicaci n permitiendole a sta ltima inspeccionar y o manipular las propiedades de un objeto persistente antes de que sea guardado actualizado borrado o cargado Un uso posible de esto es seguir la pista de la informaci n de auditor a Por ejemplo el siguiente Interceptor establece autom ticamente el createTimestamp Cuando se crea UN Auditable y se actualiza la propiedad lastUpdateTimestamp Cuando se actualiza un
222. eated and deleted the same as an entity of a mutable class Hibernate treats a persistent entity of an immutable class the same way as a read only persistent entity of a mutable class The only exception is that Hibernate will not allow an entity of an immutable class to be changed so it is not read only 11 1 2 Loading persistent entities as read only Nota Entities of immutable classes are automatically loaded as read only To change the default behavior so Hibernate loads entity instances of mutable classes into the session and automatically makes them read only call Session setDefaultReadOnly true To change the default back so entities loaded by Hibernate are not made read only call Session setDefaultReadOnly false You can determine the current setting by calling 176 Loading read only entities from an HQL query criteria Session isDefaultReadOnly If Session isDefaultReadOnly returns true entities loaded by the following are automatically made read only Session load e Session get Session merge executing scrolling or iterating HQL queries and criteria to override this setting for a particular HQL query or criteria see Secci n 11 1 3 Loading read only entities from an HQL query criteria Changing this default has no effect on persistent entities already in the session when the default was changed e persistent entities that are refreshed via Session refresh a refre
223. ecci n Esto es apropiado para colecciones grandes inverse opcional por defecto es false marca esta colecci n como el extremo inverso de una asociaci n bidireccional cascade opcional por defecto es none habilita operaciones en cascada para entidades hijas sort opcional especifica una colecci n con ordenamiento natural o una clase comparadora dada order by opcional s lamente en JDK1 4 especifica una columna de tabla o columnas que definen el orden de iteraci n del Map set o bag junto con un asc O desc opcional where opcional especifica una condici n WHERE de SQL arbitraria que se utiliza al recuperar o quitar la colecci n Esto es til si la colecci n debe contener s lamente un subconjunto de los datos disponibles fetch opcional por defecto es select Elige entre la recuperaci n por uni n externa outer join la recuperaci n por selecci n secuencial y la recuperaci n por subselecci n secuencial batch size opcional por defecto es 1 especifica un tama o de lote para recuperar perezosamente instancias de esta colecci n access opcional por defecto es property La estrategia que Hibernate utiliza para acceder al valor de la propiedad de colecci n optimistic locx opcional por defecto es true Especifica que los cambios de estado de la colecci n causan incrementos de la versi n de la entidad due a Para asociaciones uno a muchos es posible que quiera deshabilitar esta
224. ed custom Class hibernate query factory_class Elige la implementaci n de an lisis sint ctico HQL ej org hibernate hql ast ASTQueryTranslatorFactory o org hibernate hql classic ClassicQueryTranslatorFactor hibernate query substitutions Se utiliza para mapear desde tokens en consultas Hibernate a tokens SQL por ejemplo los tokens pueden ser nombres de funci n o literales e g hqlLiteral SQL_LITERAL hglFunct ion SQLFUNC hibernate hbm2ddl auto Exporta o valida automaticamente DDL de esquema a la base de datos cuando se crea la SessionFactory Con create drop se desechar el esquema de la base de datos cuando la SessionFactory se cierre expl citamente e g validate update create creat drop hibernate bytecode use_reflection_optimimables the use of bytecode manipulation instead of runtime reflection This is a System level property and cannot be set in hibernate cfg xml Reflection can sometimes be useful when troubleshooting Hibernate always requires either CGLIB or javassist even if you turn off the optimizer e g true false hibernate bytecode provider Both javassist or cglib can be used as byte manipulation engines the default is javassist 43 Cap tulo 3 Configuraci n Nombre de la propiedad Prop sito e g javassist cglib 3 4 1 Dialectos de SQL Siempre configure la propiedad hibernate dialect a la subclase correcta org hibernate dialect Dialect p
225. edad de fecha de cualquiera de sus objetos Mientras se encuentran en estado persistente es decir enlazado a una org hibernate Session de Hibernate en particular Hibernate monitorea cualquier cambio y ejecuta SQL de un modo escribe detr s El proceso de sincronizaci n del estado de la memoria con la base de datos usualmente s lo al final de una unidad de trabajo se denomina vaciado En nuestro c digo la unidad de trabajo termina con guardar o deshacer los cambios de la transacci n de la base de datos Puede cargar una persona y un evento en diferentes unidades de trabajo Tambi n puede modificar un objeto fuera de una org hibernate Session cuando no se encuentra en estado persistente si antes era persistente denominamos a este estado separado Inclusive puede modificar una colecci n cuando se encuentre separada private void addPersonToEvent Long personld Long eventld Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction Person aPerson Person session CreateQuery select p from Person p left join fetch p events where p id pid setParameter pid personld uniqueResult Eager fetch the collection so we can use it detached Event anEvent Event session load Event class eventId session getTransaction commit End of first unit of work aPerson getEvents add anEvent aPerson and its collection is detached Begin second unit of work
226. ede ser manejado con una sem ntica de valor su ciclo de vida depende completamente del propietario de la colecci n o podr a ser una referencia a otra entidad con su propio ciclo de vida En el ltimo caso s lamente el enlace entre los dos objetos se considera como un estado mantenido por la colecci n Se hace referencia al tipo contenido como el tipo de elemento de la colecci n Los elementos de colecci n son mapeados por lt element gt O lt composite element gt O en el caso de referencias de entidades con lt one to many gt O lt many to many gt Las dos primeras mapean elementos con sem ntica de valor los dos siguientes se utilizan para mapear asociaciones de entidades 6 2 3 Colecciones indexadas Todos los mapeos de colecci n excepto aquellos con sem ntica de set o bag necesitan una columna ndice en la tabla de colecci n Una columna ndice es una columna que mapea a un indice de array o indice de List o llave de Map El indice de un Map puede ser de cualquier tipo b sico mapeado con lt map key gt Puede ser una referencia de entidad mapeada con lt map key 114 Colecciones indexadas many to many gt O puede ser un tipo compuesto mapeado con lt composite map key gt El ndice de un array o lista es siempre de tipo integer y se mapea utilizando el elemento lt 1ist index gt La columna mapeada contiene enteros secuenciales numerados desde cero por defecto lt list index column column_name
227. efault behavior so that flush occurs less frequently The FlushMode class defines three different modes only flush at commit time when the Hibernate Transaction API is used flush automatically using the explained routine or never flush unless 1ush is called explicitly The last mode is useful for long running units of work where a Session is kept open and disconnected for a long time see Secci n 12 3 2 Sesi n extendida y versionado autom tico sess sf openSession 170 Persistencia transitiva Transaction tx sess beginTransaction sess setFlushMode FlushMode COMMIT allow queries to return stale state Catia Cat sess load Cat elass mad izi setName iznizi might return stale data sess find from Cat as cat left outer join cat kittens kitten change to izi is not flushed tx commit flush cecurs sess close During flush an exception might occur e g if a DML operation violates a constraint Since handling exceptions involves some understanding of Hibernate s transactional behavior we discuss it in Capitulo 12 Transacciones y concurrencia 10 11 Persistencia transitiva Es absolutamente inc modo guardar borrar o reunir objetos individuales especialmente si trata con un grafo de objetos asociados Un caso com n es una relaci n padre hijo Considere el siguiente ejemplo Si los hijos en una relaci n padre hijo pudieran ser tipificados en valor por ejemplo una c
228. el SQL generado encerrando el nombre de tabla o de columna entre comillas sencillas en el documento de mapeo Hibernate utilizar el estilo de comillas para el Dialect SQL Usualmente comillas dobles a excepci n de corchetes para SQL Server y comillas sencillas para MySQL lt class name Lineltem table Line Item gt lt id name id column Item Id gt lt generator class assigned gt lt id gt lt property name itemNumber column Item gt lt class gt 5 5 Alternativas de metadatos XML no es para todo el mundo asi que hay algunas formas opcionales de definir metadatos de mapeo O R en Hibernate 5 5 1 Utilizaci n de marcado de XDoclet Muchos usuarios de Hibernate prefieren incluir la informaci n de mapeo directamente en el c digo fuente usando las hibernate tags XDoclet No abordaremos este enfoque en este manual de referencia ya que se considera como parte de XDoclet Sin embargo inclu mos el siguiente ejemplo de la clase cat con los mapeos XDoclet package eg import java util Set import java util Date 104 Utilizaci n de marcado de XDoclet Ak hibernate class TALE CATS nye public class Cat private Long id identifier private Date birthdate private Cat mother private Set kittens private Color color private char sex private float weight hibernate id generator class native column CAT_ID ay public Long getId return id private
229. elo t pico usualmente menos importantes Algunos de ustedes las habr n visto como un int OUN java lang String Denominamos a estas clases tipos de valor y sus instancias dependen de una entidad en particular Las instancias de estos tipos no tienen su propia identidad ni son compartidas entre entidades Dos personas no referencian el mismo objeto firstname incluso si tienen el mismo nombre Los tipos de valor no s lo pueden encontrarse en el JDK sino que tambi n puede escribir por s mismo clases dependientes como por ejemplo Address O MonetaryAmount De hecho en una aplicaci n Hibernate todas las clases JDK se consideran como tipos de valor Tambi n puede dise ar una colecci n de tipos de valor Esto es conceptualmente diferente de una colecci n de referencias a otras entidades pero se ve casi igual en Java 1 2 4 Colecci n de valores Vamos a agregar una colecci n de direcciones de correo electr nico a la entidad Person Esto se representar como un java uti1 set de las instnaicas java lang String private Set emailAddresses new HashSet public Set getEmailAddresses return emailAddresses public void setEmailAddresses Set emailAddresses this emailAddresses emailAddresses 18 Colecci n de valores El mapeo de este set es as lt set name emailAddresses table PERSON_EMAIL_ADDR gt lt key column PERSON_ID gt lt element type string column EMAIL_ADDR gt lt set La d
230. en tiempo de llamada o en tiempo de vaciado Todas las operaciones si se encuentran activadas se tratan en cascadas en entidades asociadas alcanzables cuando se ejecuta la operaci n Sin embargo save upate Y delete orphan son transitivos para todas las entidades asociadas alcanzables durante el vaciado de la Session 10 12 Utilizaci n de metadatos Hibernate requiere de un modelo de meta nivel muy rico de todas las entidades y tipos de valor Este modelo puede ser til para la aplicaci n misma Por ejemplo la aplicaci n podr a utilizar los metadatos de Hibernate para implementar un algoritmo inteligente de copia en profundidad que entienda qu objetos deben ser copiados por ejemplo tipos de valor mutables y cu les no por ejemplo tipos de valor inmutables y posiblemente las entidades asociadas Hibernate expone los metadatos por medio de las interfaces ClassMetadata Y CollectionMetadata y la jerarqu a Type Las instancias de las interfaces de metadatos se pueden obtener de la SessionFactory Ca oescas E ClassMetadata catMeta sessionfactory getClassMetadata Cat class Object propertyValues catMeta getPropertyValues fritz String propertyNames catMeta getPropertyNames Type propertyTypes catMeta getPropertyTypes get a Map of all properties which are not collections or associations Map namedValues new HashMap for int i 0 i lt propertyNames length i if propertyTypes i isEnti
231. ente consistente un cambio en el estado interno de otra entidad no hace desaparecer la entidad asociada Asimismo el agregar una entidad a una colecci n no causa que la entidad se vuelva persistente por defecto El comportamiento por defecto es que al agregar una entidad a una colecci n se crea un enlace entre las dos entidades Al eliminar la entidad se eliminar el enlace Esto es muy apropiado para todos los tipos de casos Sin embargo no apropiado en el caso de una relaci n padre hijo En este caso la vida del hijo se encuentra vinculada al ciclo de vida del padre 22 2 Uno a muchos bidireccional Sup nga que empezamos con una asociaci n simple lt one to many gt desde Parent a Child lt set name children gt lt key column parent_id gt 295 Cap tulo 22 Ejemplo Padre Hijo lt one to many class Child gt lt set gt Si ejecut semos el siguiente c digo Parent DS odio Child c new Child p getChildren add c session save c session flush Hibernate publicar a dos declaraciones SQL UN INSERT para crear el registro de c UN UPDATE para crear el enlace desde pac Esto no es s lo ineficiente sino que adem s viola cualquier restricci n NOT NULL en la columna parent_id Puede arreglar la violaci n de restricci n de nulabilidad especificando not null true en el mapeo de la colecci n lt set name children gt lt key column parent_id not null true
232. entidades para ver la secuencia esperada recuerde no incluir su SQL personalizado en los archivos de mapeo ya que eso sobrescribir el sql est tico generado por Hibernate En la mayor a de los casos se requiere que los procedimientos almacenados retornen el n mero de filas insertadas actualizadas y borradas ya que Hibernate tiene algunas verificaciones en tiempo de ejecuci n para el xito de la declaraci n Hibernate siempre registra el primer par metro de la declaraci n como un par metro de la salida num rica para las operaciones CUD CREATE OR REPLACE FUNCTION updatePerson uid IN NUMBER uname IN VARCHAR2 RETURN NUMBER IS BEGIN 251 Cap tulo 17 SQL Nativo update PERSON set NAME uname where ID oid return SOLSROWCOUNT END updatePerson 17 4 Personalice SQL para cargar You can also declare your own SQL or HQL queries for entity loading As with inserts updates and deletes this can be done at the individual column level as described in Secci n 5 7 Expresiones de lectura y escritura de columnas or at the statement level Here is an example of a statement level override lt sql query name person gt lt return alias pers class Person lock mode upgrade gt SELECT NAME AS pers name ID AS pers id FROM PERSON WHERE ID FOR UPDATE lt sql query gt Esta es tan s lo una declaraci n de consulta nombrada como se discuti anteriormente Puede referenciar esta co
233. entificadora en la asociaci n del lado de la persona se define con el elemento key el nombre de columna para el lado del evento se define con el atributo column del many to many Tambi n tiene que informarle a Hibernate la clase de los objetos en su colecci n la clase del otro lado de la colecci n de referencias Por consiguiente el esquema de base de datos para este mapeo es EVENTS PERSON_EVENT PERSON EVENT_ID gt EVENT_ID EVENT_DATE PERSON_ID gt PERSON_ID ARISTA AGE FIRSTNAME LASTNAME 1 2 3 Trabajo de la asociaci n Vamos a reunir a algunas personas y eventos en un nuevo m todo en EventManager 16 Trabajo de la asociaci n private void addPersonToEvent Long personld Long eventld Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction Person aPerson Person session load Person class personld Event anEvent Event session load Event class eventld aPerson getEvents add anEvent session getTransaction commit Despu s de cargar una Person y Un Event simplemente modifique la colecci n utilizando los m todos normales de colecci n No hay una llamada expl cita a update O save Hibernate detecta autom ticamente que se ha modificado la colecci n y que se necesita actualizarla Esto se denomina chequeo autom tico de desactualizaciones y tambi n puede probarlo modificando el nombre o la propi
234. entity y sequence los cuales tienen una gran diferencia sem ntica que 76 Generadores mejorados del identificador puede crear problemas sutiles en las aplicaciones mirando la portabilidad Sin embargo org hibernate id enhanced SequenceStyleGenerator logra la portabilidad de una manera diferente Escoge entre una tabla o una secuencia en la base de datos para almacenar sus valores en subida dependiendo de las capacidades del dialecto que se est utilizando La diferencia enter esto y native es que el almacenamiento basado en tablas y secuencias tienen la misma sem ntica De hecho las secuencias son exactamente lo que Hibernate trata de emular con sus generadores basados en tablas Este generador tiene un n mero de par metros de configuraci n sequence_name opcional por defecto es hibernate_sequence el nombre de la secuencia O la tabla a utilizar e initial value opcional por defecto es 1 el valor inicial a recuperarse de la secuencia tabla En t rminos de creaci n de secuencias esto es an logo a la cl usula que usualmente se llama STARTS WITH increment_size opcional por defecto es 1 el valor por el cual las llamadas subsecuentes a la secuencia tabla deben diferir En t rminos de creaci n de secuencias esto es an logo a la cl usula que usualmente se llama INCREMENT BY e force _table_use opcional por defecto es false debemos forzar el uso de una tabla como la estructura de respaldo aunque
235. epresentadas como clases POJO o como objetos JavaBean en tiempo de ejecuci n Hibernate tambi n soporta modelos din micos utilizando Mapeos de Mapeos en tiempo de ejecuci n y la representaci n de entidades como rboles de DOM4J No escriba clases persistentes con este enfoque s lamente archivos de mapeo 57 Cap tulo 4 Clases persistentes By default Hibernate works in normal POJO mode You can set a default entity representation mode for a particular SessionFactory using the default_entity_mode configuration option see Tabla 3 3 Propiedades de Configuraci n de Hibernate Los siguientes ejemplos demuestran la representaci n utilizando Mapeos Primero en el archivo de mapeo tiene que declararse un entity name en lugar de o adem s de un nombre de clase lt hibernate mapping gt lt class entity name Customer gt lt id name id type long column ID gt lt generator class sequence gt lt id gt lt property name name column NAME type string gt lt property name address column ADDRESS type string gt lt many to one name organization column ORGANIZATION_ID class Organization gt lt bag name orders inverse true lazy false cascade al1 gt lt key column CUSTOMER_ID gt lt one to many class 0rder gt lt bag gt lt class gt lt hibernate mapping gt Aunque las asociaciones se declaran utilizando nombres de clase destino el tipo
236. equence Ambas estrategias requieren dos consultas SQL para insertar un nuevo objeto Por ejemplo lt id name id type long column person_id gt lt generator class sequence gt lt param name sequence gt person_id_sequence lt param gt lt generator gt ans gt lt id name id type long column person_id unsaved value 0 gt lt generator class identity gt lt id gt 75 Cap tulo 5 Mapeo O R B sico Para desarrollos a trav s de plataformas la estrategia native eligir entre las estrategias identity sequence hilo dependiendo de las capacidades de la base de datos subyacente 5 1 4 5 Identificadores asignados Si quiere que la aplicaci n asigne los identificadores en contraposici n a que los genere Hibernate puede utilizar el generador assigned Este generador especial utilizar el valor identificador ya asignado a la propiedad identificadora del objeto Este generador se utiliza cuando la clave principal es una clave natural en vez de una clave sustituta Este es el comportamiento por defecto si no especifica un elemento lt generator gt El generador assigned hace que Hibernate utilice unsaved value undefined Esto fuerza a Hibernate a ir a la base de datos para determinar si una instancia es transitoria o separada a menos de que haya una propiedad de versi n o sello de fecha o que usted defina Interceptor isUnsaved 5 1 4 6 Claves primarias asignadas por disparadores
237. er en cach los resultados de una petici n introduce algunos sobrecostos en t rminos del procesamiento transaccional normal de sus aplicaciones Por ejemplo si pone en cach los resultados de una petici n frente a Person Hibernate necesitar rastrear cuando se deben invalidar esos resultados debido a los cambios que se han guardado en Person Eso m s el hecho de que la mayor a de las aplicaciones simplemente no ganan beneficio de poner los resultados en cach lleva a Hibernate a deshabilitar el cach de los resultados de una petici n por defecto Para utilizar el cach de peticiones primero necesita habilitar el cach de peticiones hibernate cache use_query_cache true Esta configuraci n crea dos nuevas regiones de cach org hibernate cache StandardQueryCache mantiene los resultados de la petici n en cach org hibernate cache UpdateTimestampsCache mantiene los sellos de fecha de las actualizaciones m s recientes a las tablas de peticiones Estas se utilizan para validar los resultados ya que se sirven desde el cach de peticiones Importante If you configure your underlying cache implementation to use expiry or timeouts is very important that the cache timeout of the underlying cache region for the Update TimestampsCache be set to a higher value than the timeouts of any of the query caches In fact we recommend that the the UpdateTimestampsCache region not be configured for expiry at all Note in particular that a
238. eration to the different databases For example the org hibernate id enhanced SequenceStyleGenerator mimics the behavior of a sequence on databases which do not support sequences by using a table 26 5 Funciones de la base de datos Aviso Esta es un rea en la que Hibernate necesita mejorar En t rminos de qu tan portatil puede ser esta funci n que se maneja actualmente trabaja bastante bien desde HQL sin embargo en otros aspectos le falta mucho Los usuarios pueden referenciar las funciones de SQL de muchas maneras Sin embargo no todas las bases de datos soportan el mismo grupo de funciones Hibernate proporciona una manera de mapear un nombre de una funci n l gica a un delegado el cual sabe c mo entregar esa funci n en particular tal vez incluso usando una llamada de funci n f sica totalmente diferente Importante T cnicamente este registro de funci n se maneja por medio de la clase org hibernate dialect function SOLFunctionRegistry la cual tiene el prop sito de permitirle a los usuarios el proporcionar definiciones de funciones personalizadas sin tener que brindar un dialecto personalizado Este comportamiento especifico todav a no est del todo completo De cierta manera est implementado para que los usuarios puedan registrar program ticamente las funciones con la org hibernate cfg Configuration y aquellas funciones ser n reconocidas por HQL 26 6 Mapeos de tipo Esta secci n se completar
239. erencias Dialecto ici aio SI a cs tecioda 325 Resoluci n del dialecto ocococncccccncoonnncononcconnconnnncnnnnononononnnnnnnnnonononnnncnnnos 325 Generaci n del identificador coooncococcccconncoonnoconncnnnnnconnnccnnnconononnnncnnanos 326 Funciones de la base de datos ooocccccoocccccconoccncnnnaccnnnnanccnnonancnnnonancnnnnnanznnnns 327 Mapegs de UPO eiii id an REE 327 a ts 329 Prefacio El trabajar con software orientado a objetos y con una base de datos relacional puede llegar a ser engorroso y puede llegar a tomar bastante tiempo en los entornos empresariales de hoy en d a Hibernate es una herramienta de mapeo objeto relacional para entornos Java El t rmino de mapeo objeto relacional ORM se refiere a la t cnica de mapear una representaci n de datos desde un modelo de objeto a un modelo de datos relacionales con un esquema basado en SQL Hibernate no s lamente se ocupa del mapeo desde las clases Java a las tablas de las bases de datos y desde los tipos de datos de Java a los tipos de datos de SQL sino que tambi n facilita la consulta y recuperaci n de datos Esto puede reducir de manera importante el tiempo de desarrollo que se tomar a con el manejo de datos de forma manual en SQL y JDBC La meta de Hibernate es aliviar el trabajo del desarrollador en 95 de la persistencia de datos comunes relacionados con tareas de programaci n Es posible que Hibernate no sea la mejor soluci n para aq
240. erfiles de recuperaci n Entonces qu significa Vamos a explicarlo por medio de un ejemplo Digamos que tenemos los siguientes mapeos lt hibernate mapping gt lt class name Customer gt lt set name orders inverse true gt lt key column cust_id gt lt one to many class 0rder gt lt set gt lt class gt lt class name Order gt lt class gt lt hibernate mapping gt Ahora normalmente cuando reciba una referencia a un cliente en particular el grupo de pedidos ser perezoso lo que significa que a n no habremos cargado esos pedidos de la base de datos Usualmente esto est bien Ahora digamos que tiene un ejemplo en donde es m s eficiente el cargar el cliente y sus pedidos juntos Una manera es utilizar las estrategias de recuperaci n din mica por medio de peticiones de criterio o un HQL Pero otra opci n es utilizar un perfi de recuperaci n para lograr esto Simplemente agregue lo siguiente a su mapeo lt hibernate mapping gt lt fetch profile name customer with orders gt lt fetch entity Customer association orders style join gt lt fetch profile gt lt hibernate mapping gt o incluso lt hibernate mapping gt lt class name Customer gt lt fetch profile name customer with orders gt lt fetch association orders style join gt lt fetch profile gt lt class gt lt hibernate mapping gt Ahora el siguiente c digo de hecho cargar
241. eriormente una soluci n mucho m s flexible es la administraci n de contexto sesi n actual incorporada en Hibernate Non managed environment idiom with getCurrentSession ay factory getCurrentSession beginTransaction do some work factory getCurrentSession getTransaction commit catch RuntimeException e factory getCurrentSession getTransaction rollback throw e or display error message No ver estos pedazos de c digo en una aplicaci n normal las excepciones fatales del sistema siempre deben ser capturadas en la cima En otras palabras el c digo que ejecuta las llamadas de Hibernate en la capa de persistencia y el c digo que maneja Runt imeExcept ion y usualmente s lo puede limpiar y salir se encuentran en capas diferentes La administraci n de contexto actual de Hibernate puede simplificar de manera importante este dise o ya que todo lo que necesita hacer es acceder a SessionFactory El manejo de excepciones se discute m s adelante en este cap tulo Debe seleccionar org hibernate transaction JDBCTransactionFactory el cual es el predeterminado y para el segundo ejemplo seleccionar thread como su hibernate current_session_context_class 191 Cap tulo 12 Transacciones y 12 2 2 Utilizaci n de JTA Si su capa de persistencia se ejecuta en un servidor de aplicaciones por ejemplo detr s de los beans de sesi n EJB cada conexi n de fuente de datos
242. esde Hibernate3 el orden de los archivos de mapeo no tiene relevancia cuando se utiliza la palabra clave extends El orden dentro de un s lo archivo de mapeo todav a necesita ser definido como superclases antes de subclases lt hibernate mapping gt lt subclass name DomesticCat extends Cat discriminator value D gt lt property name name type string gt lt subclass gt lt hibernate mapping gt 9 1 1 Tabla por jerarqu a de clases Suponga que tenemos una interfaz Payment con los implementadores CreditCardPayment CashPayment ChequePayment El mapeo de tabla por jerarqu a se ver a as 149 Cap tulo 9 Mapeo de herencias lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT_ID gt lt generator class native gt lt id gt lt discriminator column PAYMENT_TYPE type string gt lt property name amount column AMOUNT gt lt subclass name CreditCardPayment discriminator value CREDIT gt lt property name creditCardType column CCTYPE gt lt subclass gt lt subclass name CashPayment discriminator value CASH gt lt subclass gt lt subclass name ChequePayment discriminator value CHEQUE gt lt subclass gt lt class gt Se requiere exactamente una tabla Hay una limitaci n de esta estrategia de mapeo las columnas declaradas por las subclases tal como ccrYPE no pueden tener restricciones NOT NULL 9 1 2 Tabl
243. espacios de nombre del usuario lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN http hibernate sourceforge net hibernate mapping 3 0 dtd lt ENTITY version 3 5 6 Final gt lt ENTITY today September 15 2010 gt lt ENTITY types SYSTEM classpath your domain types xml gt lt hibernate mapping package your domain gt lt class name MyEntity gt lt id name id type my custom id type gt lt a gt lt class gt types lt hibernate mapping gt En donde types xml es un recurso en el paquete your domain y comprende un typedef personalizado 5 1 2 Mapeo de Hibernate Este elemento tiene varios atributos opcionales Los atributos schema Y catalog especifican que las tablas a las que se refiere en este mapeo pertenecen al esquema y o cat logo mencionado s De especificarse los nombres de tablas ser n calificados por el nombre del esquema y del cat logo dados De omitirse los nombres de las tablas no ser n calificados El atributo default cascade especifica qu estilo de cascada se debe asumir para las propiedades y colecciones que no especifican un atributo cascade Por defecto el atributo auto import nos permite utilizar nombres de clase sin calificar en el lenguaje de consulta lt hibernate mapping schema schemaName catalog catalogName default cascade cascade_style 0000 default access field propertyl ClassName
244. esticCat pk new DomesticCat pk setColor Color TABBY pk setSex F pk setName PK pk setKittens new HashSet pk addKitten fritz sess save pk new Long 1234 Si el objeto que hace persistente tiene objetos asociados por ejemplo la colecci n kittens en el ejemplo anterior estos objetos pueden ser hechos persistentes en cualquier orden que quiera a menos de que tenga una restricci n NoT NULL sobre una columna clave for nea Nunca hay riesgo de violar restricciones de clave for nea Sin embargo puede que usted viole una restricci n NOT NULL si llama a save sobre los objetos en el orden equivocado Usualmente no se preocupe de este detalle pues muy probablemente utilizar la funcionalidad de persistencia transitiva de Hibernate para guardar los objetos asociados autom ticamente Entonces ni siquiera tienen lugar violaciones de restricciones NoT NULL Hibernate se ocupar de todo M s adelante en este cap tulo se discute la persistencia transitiva 158 Cargando un objeto 10 3 Cargando un objeto Los m todos load de Session le proporcionan una forma de recuperar una instancia persistente si ya conoce su identificador load toma un objeto clase y carga el estado dentro de una instancia reci n instanciada de esa clase en un estado persistente Cat fritz Cat sess load Cat class generatedld you need to wrap primitive identifiers long id 1234 DomesticCat pk DomesticCa
245. eturn property name regionCode column REGIONCODE gt lt return property name id column EID gt lt return property name salary gt lt return column name VALUE gt lt return column name CURRENCY gt lt return property gt lt return gt call selectAllEmployments lt sql query gt Los procedimientos almacenados actualmente s lo retornan escalares y entidades No se soporta lt return join gt ni lt load collection gt 249 Cap tulo 17 SQL Nativo 17 2 2 1 Reglas limitaciones para utilizar procedimientos almacenados Para utilizar procedimientos almacenados con Hibernate debe seguir ciertas reglas de funciones procedimientos Si no siguen esas reglas entonces no se pueden utilizar con Hibernate Si todavia quiere utilizar estos procedimientos tiene que ejecutarlos por medio de session connection Las reglas son diferentes para cada base de datos debido a que los vendedores de la base de datos tienen diferentes sintaxis semantica de procedimientos almacenados Las consultas de procedimientos almacenados no se pueden llamar con setFirstResult setMaxResults La forma de la llamada recomendada es SQL92 est ndar call functionName lt parameters gt O call procedureName lt parameters gt Nose soporta la sintaxis de llamadas nativas Para Oracle aplican las siguientes reglas Una funci n tiene que retornar un grupo de resultados El primer par metro de un pro
246. evisaremos algunos casos can nicos uno por uno comenzando con los mapeos unidireccionales y luego considerando los casos bidireccionales Vamos a utilizar Person y Address en todos los ejemplos Vamos a clasificar las asociaciones en cuanto su multiplicidad y a si mapean o no a una tabla de uni n interviniente Las claves for neas que aceptan valores nulos no se consideran como una buena pr ctica en el modelado tradicional de datos as que todos nuestros ejemplos utilizan claves for neas no nulas Esto no es un requisito de Hibernate y todos los mapeos funcionar n si quita las restricciones de nulabilidad 7 2 Asociaciones Unidireccionales 7 2 1 Many to one Una asociaci n unidireccional muchos a uno es el tipo de asociaci n unidireccional m s com n lt class name Person gt lt id name id column personld gt lt generator class native gt lt id gt lt many to one name address column addressId not null true gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key addressId bigint create table Address addressId bigint not null primary key coe noL 129 Cap tulo 7 Mapeos de asociaci n 7 2 2 Uno a uno Una asociaci n unidireccional uno a uno en una clave for nea es casi id ntica La nica diferencia es la restri
247. extensi n opcionales que puede implementar para personalizar el comportamiento de su capa de persistencia Para obtener m s detalles vea la documentaci n de la API Dada una arquitectura sencilla la aplicaci n evita las APIs de Transaction TransactionFactory y O ConnectionProvider para comunicarse directamente con JTA o JDBC 29 Cap tulo 2 Arquitectura 2 2 Estados de instancia Una instancia de una clase persistente puede estar en uno de tres estados diferentes Estos estados se definen con respecto a su contexto de persistencia El objeto Session de Hibernate es el contexto de persistencia Los tres estados diferentes son los siguientes transitorio La instancia no est asociada con un contexto de persistencia No tiene identidad persistente o valor de clave principal persistente La instancia se encuentra actualmente asociada con un contexto de persistencia Tiene una identidad persistente valor de clave principal y puede tener una fila correspondiente en la base de datos Para un contexto de persistencia en particular Hibernate garantiza que la identidad persistente es equivalente a la identidad Java en relaci n con la ubicaci n del objeto separado La instancia estuvo alguna vez asociada con un contexto de persistencia pero ese contexto se cerr o la instancia fue serializada a otro proceso Tiene una identidad persistente y puede tener una fila correspondiente en la base de datos Para las instancias sep
248. ey column CUSTOMER_ID not null true gt lt map key column SHORT_DESC node fshort desc type string gt lt one to many entity name Account embed xml false node account gt lt map gt lt component name name node name gt lt property name firstName node first name gt lt property name initial node initial gt lt property name lastName node last name gt lt component gt lt class gt En este caso la colecci n de ids de cuenta est n inclu dos pero no los datos reales de cuenta La siguiente consulta HQL from Customer c left join fetch c accounts where c lastName like lastName retornar a conjuntos de datos como este lt customer id 123456789 gt 261 Cap tulo 19 Mapeo XML lt account short desc Savings gt 987632567 lt account gt lt account short desc Credit Card gt 985612323 lt account gt lt name gt lt first name gt Gavin lt first name gt lt initial gt A lt initial gt lt last name gt King lt last name gt lt name gt lt customer gt Si establece embed xm1 true en el mapeo lt one to many gt puede que los datos se vean as lt customer id 123456789 gt lt account id 987632567 short desc Savings gt lt customer id 123456789 gt lt balance gt 100 29 lt balance gt lt account gt lt account id 985612323 short desc Credit Card gt lt customer id 123456789 gt lt balance g
249. fecto es false indica que se utiliza un identificador compuesto mapeado y que los mapeos de propiedad contenidos se refieren tanto a la clase de entidad como a la clase identificadora compuesta class opcional pero requerida por un identificador compuesto mapeado La clase se utiliza como un identificador compuesto We will describe a third even more convenient approach where the composite identifier is implemented as a component class in Secci n 8 4 Componentes como identificadores compuestos The attributes described below apply only to this alternative approach name opcional se necesita para este enfoque Una propiedad de tipo componente que tiene el identificador compuesto Consulte el cap tulo 9 para obtener mayor informaci n access opcional por defecto es property La estrategia que Hibernate utiliza para acceder al valor de la propiedad class opcional por defecto es el tipo de propiedad determinado por la reflecci n la clase componente utilizada como un identificador compuesto Vea la siguiente secci n para obtener mayor informaci n Este tercer enfoque un componente identificador es el que recomendamos para casi todas las aplicaciones 79 Cap tulo 5 Mapeo O R B sico 5 1 8 Discriminador Se necesita el elemento lt discriminator gt para la persistencia polim rfica utilizando la estrategia de mapeo de tabla por jerarquia de clases Declara una columna discriminadora de la tabla
250. float getWeight 53 Cap tulo 4 Clases persistentes return weight public Color getColor return color void setColor Color color this color color void setSex char sex this sex sex public char getSex return sex void setLitterId int id this litterld id public int getLitterId return litterld void setMother Cat mother this mother mother public Cat getMother return mother void setKittens Set kittens this kittens kittens public Set getkittens 1 return kittens addKitten not needed by Hibernate public void addKitten Cat kitten kitten setMother this kitten setLitterId kittens size kittens add kitten En las siguientes secciones vamos a explorar en mayor detalle las cuatro reglas principales de las clases persistentes 4 1 1 Implemente un constructor sin argumentos Cat tiene un contructor sin argumentos Todas las clases persistentes deben tener un constructor predeterminado el cual puede ser no p blico de modo que Hibernate pueda instanciarlas usando Constructor newInstance Le recomendamos contar con un constructor por defecto con al menos una visibilidad de paquete para la generaci n de proxies en tiempo de ejecuci n en Hibernate 54 Proporcione una propiedad identificadora opcional 4 1 2 Proporcione una propiedad identificadora opcional Cat tiene una propiedad llamada id Esta pro
251. g gt lt web app gt Para construir y desplegar llame a mvn package en su directorio de proyecto y copie el archivo hibernate tutorial war en su directorio webapp Tomcat O Una vez que se encuentre desplegado y que Tomcat est ejecutando acceda la aplicaci n en http localhost 8080 hibernate tutorial eventmanager Aseg rese de ver el registro de Tomcat para ver a Hibernate iniciar cuando llegue el primer pedido a su servlet se llama al inicializador est tico en HibernateUtil y para obetener la salida detallada si ocurre alguna excepci n 1 4 Resumen Este tutorial abord los puntos b sicos de la escritura de una simple aplicaci n de Hibernate aut noma y una peque a aplicaci n web Encontrar m s tutoriales en el website de Hibernate http hibernate org 26 Arquitectura 2 1 Sinopsis El diagrama a continuaci n brinda una perspectiva a alto nivel de la arquitectura de Hibernate Application Persistent Objects HIBERNATE hibernate i properties AMIL pS Database Este documento no incluye una sinopsis detallada de la arquitecturas en tiempo de ejecuci n disponibles Hibernate es flexible y soporta diferentes enfoques Sin embargo mostraremos los dos extremos la arquitectura minima y la arquitectura completa Este diagrama ilustra la manera en que Hibernate utiliza la base de datos y los datos de configuraci n para proporcionar servicios de persistencia y objetos per
252. ginal Se proporciona para los datos heredados not nul1 opcional Especifica que las columnas de la clave for nea son no nulables Esto se implica cuando la clave for nea tambi n es parte de la clave principal update opcional Especifica que la clave for nea nunca se debe actualizar Esto se implica cuando la clave for nea tambi n es parte de la clave principal unique opcional Especifica que la clave for nea debe tener una restricci n de Esto se implica cuando la clave for nea tambi n es la clave principal Para los sistemas en donde el rendimiento es importante todas las claves deben ser definidas on delete cascade Hibernate utiliza una restricci n ON CASCADE DELE base de datos en vez de muchas declaraciones DELE a nivel de E individuales Tenga en cuenta que put T el esta funcionalidad evita la estrategia de bloqueo optimista normal de Hibernate para datos versionados Los atributos not null y update son tiles al mapear una asociaci n uno a muchos unidireccional Si mapea una unidireccional uno a muchos a una clave for nea no nulable tiene que declarar la columna clave utilizando lt key not null true gt 5 1 22 Los elementos columna y f rmula Los elementos de mapeo que acepten un atributo column aceptar n opcionalmente un subelemento lt column gt De manera similar lt formula gt es una alternativa al atributo formula Por ejemplo lt column nam
253. i n Esto sugiere la siguiente clasificaci n 281 Cap tulo 20 Mejoramiento del colecciones indexadas conjuntos sets e bolsas bags Todas las colecciones indexadas mapas listas y arrays tienen una clave principal que consiste de las columnas lt key gt lt index gt En este caso las actualizaciones de colecciones son extremadamente eficientes La clave principal puede ser indexada eficientemente y una fila en particular puede ser localizada cuando Hibernate intenta actualizarla o borrarla Los conjuntos tienen una clave principal que consiste de lt key gt y columnas de elementos Esto puede ser menos eficiente para algunos tipos de elementos de colecci n particularmente elementos compuestos o texto largo o campos binarios ya que la base de datos puede no ser capaz de indexar una clave principal compleja eficientemente Sin embargo para asociaciones uno a muchos o muchos a muchos particularmente en el caso de los identificadores sint ticos es probable que s lo sea igual de eficiente Si quiere que SchemaExport realmente cree la clave principal de un lt set gt tiene que declarar todas las columnas como not null true Los mapeos de lt idbag gt definen una clave delegada de modo que siempre resulten eficientes de actualizar De hecho son el mejor caso Los bags son el peor caso ya que un bag permite valores de elementos duplicados y no tiene ninguna columna ndice no puede definirse ninguna clav
254. i n de un usuario Considere el siguiente ejemplo Se abre la primera pantalla de un di logo Los datos que ve el usuario han sido cargados en una Session en particular y en una transacci n de la base de datos El usuario es libre de modificar los objetos e El usuario hace click en Guardar despu s de 5 minutos y espera que sus modificaciones se hagan persistentes Tambi n espera que l sea la nica persona editando esta informaci n y que no ocurra ning n conflicto en la modificaci n Desde el punto de vista del usuario llamamos a esta unidad de trabajo una larga conversaci n o transacci n de aplicaci n Hay muchas formas de implementar esto en su aplicaci n Una primera implementaci n ingenua podr a mantener abierta la Session y la transacci n de la base de datos durante el tiempo para pensar del usuario con bloqueos en la base de datos para prevenir la modificaci n simult nea y para garantizar el aislamiento y la atomicidad Esto es un antipatr n ya que la contenci n de bloqueo no permitir a a la aplicaci n escalar con el n mero de usuarios simult neos Tiene que usar varias transacciones de la base de datos para implementar la conversaci n En este caso mantener el aislamiento de los procesos empresariales se vuelve una responsabilidad parcial de la capa de la aplicaci n Una s la conversaci n usualmente abarca varias transacciones de la base de datos Ser at mica si s lo una de estas transacciones de la
255. ian dos objetos nombre independientes s lamente iguales en valor La sem ntica de valor nulo de un componente es ad hoc Cuando se recargue el objeto contenedor Hibernate asumir que si todas las columnas del componente son nulas el componente entero es nulo Esto es apropiado para la mayor a de prop sitos Las propiedades de un componente pueden ser de cualquier tipo de Hibernate colecciones asociaciones muchos a uno otros componentes etc Los componentes anidados no deben ser considerados como un uso ex tico Hibernate est concebido para soportar un modelo de objetos muy detallado El elemento lt component gt permite un subelemento lt parent gt que mapea una propiedad de la clase del componente como una referencia a la entidad contenedora lt class name eg Person table person gt 142 Colecciones de objetos dependientes lt id name Key column pid type string gt lt generator class uuid gt lt J id lt property name birthday type date gt lt component name Name class eg Name unique true gt lt parent name namedPerson gt lt reference back to the Person gt lt property name initial gt lt property name first gt lt property name last gt lt component gt elas gt 8 2 Colecciones de objetos dependientes Las colecciones de componentes se encuentran soportadas por ejemplo un array de tipo Name Declare su colecci n de componentes remplazando la etiq
256. ibernate elimina el primer prop sito Sin embargo a n necesita una fase de ensamblado a menos de que est preparado para tener el contexto de persistencia la sesi n abierto a trav s del proceso de entrega de la vista Piense en sus m todos empresariales como si tuviesen un contrato estricto con el nivel de presentaci n sobre qu datos est n disponibles en los objetos separados Esta no es una limitaci n de Hibernate Este es un requerimiento fundamental de acceso seguro a datos transaccionales Considere abstraer su l gica empresarial de Hibernate Oculte el c digo de acceso a datos de Hibernate detr s de una interfaz Combine los patrones DAO y sesi n local de hilo Incluso puede hacer algunas clases persistentes por medio de JDBC escrito a mano asociadas a Hibernate por medio de un UserType Sin embargo este consejo va para las aplicaciones suficientemente grandes No es apropiado para una aplicaci n con cinco tablas No utilice mapeos de asociaci n ex ticos Son raros los casos de uso de asociaciones reales muchos a muchos La mayor parte del tiempo necesita informaci n adicional almacenada en una tabla de enlace En este caso es mucho mejor usar dos asociaciones uno a muchos a una clase de enlace intermedio De hecho la mayor a de las asociaciones son uno a muchos y muchos a uno Por esta raz n debe tener cuidado al utilizar cualquier otro estilo de asociaci n Prefiera las asociaciones bidireccionales Las asociac
257. ice en una capa separada para almacenarla en la HttpSession El patr n de sesi n extendido o sesi n por conversaci n es m s dificil de implementar con la administraci n de contexto de sesi n actual Necesita proporcionar su propia implementaci n de la CurrentSessionContext para esto vea el Wiki de Hibernate para obtener m s ejemplos 12 3 3 Objetos separados y versionado autom tico Cada interacci n con el almacenamiento persistente ocurre en una nueva Session Sin embargo las mismas instancias persistentes son reutilizadas para cada interacci n con la base de datos La aplicaci n manipula el estado de las instancias separadas cargadas originalmente en otra Session y luego las readjunta usando Session update Session saveOrUpdate O Session merge foo is an instance loaded by a previous Session foo setProperty bar session factory openSession Transaction t session beginTransaction session saveOrUpdate foo Use merge if foo might have been loaded already t commit session close De nuevo Hibernate chequear las versiones de la instancia durante el vaciado lanzando una excepci n si tuvieron lugar conflictos en las actualizaciones Tambi n puede llamar a lock en lugar de update y utilizar LockMode READ realizando un chequeo de versi n evitando todos los cach s si est seguro de que el objeto no ha sido modificado 12 3 4 Personalizaci n del versionado autom t
258. ico Puede deshabilitar el incremento de la versi n autom tica de Hibernate para ciertas propiedades y colecciones en particular estableciendo el atributo de mapeo optimistic lock COMO false 197 Cap tulo 12 Transacciones y Hibernate entonces ya no incrementar m s las versiones si la propiedad se encuentra desactualizada Los esquemas heredados de la base de datos con frecuencia son est ticos y no pueden ser modificados Inclusive otras aplicaciones podr an tambi n acceder la misma base de datos y no saber c mo manejar los n meros de versi n ni los sellos de fecha En ambos casos el versionado no puede confiarse a una columna en particular en una tabla Para forzar un chequeo de versiones sin un mapeo de propiedad de versi n o sello de fecha con una comparaci n del estado de todos los campos en una fila active optimistic lock a11 en el mapeo de lt class gt Esto funciona conceptualmente s lamente si Hibernate puede comparar el estado viejo y el nuevo es decir si usa una s la Session larga y no sesi n por petici n con instancias separadas Las modificaciones simult neas pueden permitirse en instancias en tanto los cambios que se hayan realizado no se superpongan Si establece optimistic lock dirty al mapear la lt class gt Hibernate s lo comparar los campos desactualizados durante el vaciado En ambos casos con columnas de versi n sello de fecha dedicadas o con comparaci n de campos completos desa
259. iferencia comparado con el mapeo anterior es el uso de la parte element que le dice a Hibernate que la colecci n no contiene referencias a otra entidad sino que es una colecci n de elementos que son tipos de valores aqu especificamente de tipo String El nombre en min sculas le dice que es un tipo conversor de mapeo de Hibernate Una vez m s el atributo table del elemento set determina el nombre de la tabla para la colecci n El elemento key define el nombre de la columna clave for nea en la tabla de colecci n El atributo column en el elemento element define el nombre de la columna donde realmente se almacenar n los valores de la direcci n de correo electr nico Este es el esquema actualizado EVENTS PERSON_EVENT PERSON PERSON_EMAIL_ADDR EVENT_ID lt gt EVENT_ID EVENT_DATE PERSON_ID lt gt PERSON_ID lt gt PERSON_ID TITLE AGE EMAIL_ADDR FIRSTNAME LASTNAME Puede ver que la clave principal de la tabla de colecci n es de hecho una clave compuesta que utiliza ambas columnas Esto tambi n implica que no pueden haber direcciones de correo electr nico duplicadas por persona la cual es exactamente la sem ntica que necesitamos para un conjunto en Java Ahora puede tratar de agregar elementos a esta colecci n al igual que lo hicimos antes vinculando personas y eventos Es el mismo c digo en Java private void addEmailToPerson Long personId String
260. ificador Puede haber sido guardado o cargado sin embargo por definici n se encuentra en el mbito de una Session Hibernate detectar cualquier cambio realizado a un objeto en estado persistente y sincronizar el estado con la base de datos cuando se complete la unidad de trabajo Los desarrolladores no ejecutan declaraciones UPDATE manuales o declaraciones DELETE cuando un objeto se debe poner como transitorio e Separado una instancia separada es un objeto que se ha hecho persistente pero su Session ha sido cerrada La referencia al objeto todav a es v lida por supuesto y la instancia separada podr a incluso ser modificada en este estado Una instancia separada puede ser re unida a una nueva Session m s tarde haci ndola persistente de nuevo con todas las modificaciones Este aspecto habilita un modelo de programaci n para unidades de trabajo de ejecuci n larga que requieren tiempo para pensar por parte del usuario Las llamamos transaccciones de aplicaci n por ejemplo una unidad de trabajo desde el punto de vista del usuario Discutiremos ahora los estados y transiciones de estados y los m todos de Hibernate que disparan una transici n en m s detalle 10 2 Haciendo los objetos persistentes Las instancias reci n instanciadas de una clase persistente Hibernate las considera como transitorias Podemos hacer una instancia transitoria persistente asoci ndola con una sesi n 157 Cap tulo 10
261. ils class eg Purchase gt lt many to one name item class eg Item gt lt composite element gt lt set gt lt class gt Los elementos compuestos pueden aparecer en consultas usando la misma sint xis que las asociaciones a otras entidades 8 3 Componentes como ndices de Mapeo El elemento lt composite map key gt le permite mapear una clase componente como la clave de un Map Aseg rese de sobrescribir hashCode Y equals correctamente en la clase componente 144 Componentes como identificadores compuestos 8 4 Componentes como identificadores compuestos Puede utilizar un componente como un identidicador de una clase entidad Su clase componente tiene que satisfacer ciertos requerimientos e Tiene que implementar java io Serializable e Tiene que re implementar equals Y hashCode consistentemente con la noci n de la base de datos de igualdad de clave compuesta y No puede utilizar un IdentifierGenerator para generar claves compuestas En cambio la aplicaci n debe asignar sus propios identificadores Use la etiqueta lt composite id gt con elementos anidados lt key property gt en lugar de la declaraci n usual lt id gt Por ejemplo la clase OrderLine tiene una clave principal que depende de la clave principal compuesta de Order lt class name OrderLine gt lt composite id name id class OrderLineld gt lt key property name lineld gt lt key property name orde
262. incluyendo la importaci n exportaci n de datos externalizaci n de datos de entidad por medio de JMS o SOAP y reportes basados en XSLT Un s lo mapeo se puede utilizar para mapear simult neamente las propiedades de una clase y los nodos de un documento XML a la base de datos o si no hay ninguna clase a mapear se puede utilizar para mapear s lo el XML 19 1 1 Especificaci n de los mapeos de XML y de clase en conjunto Este es un ejemplo del mapeo de un POJO y XML de manera simult nea lt class name Account table ACCOUNTS node account gt lt id name accountId column ACCOUNT_ID node id gt lt many to one name customer column CUSTOMER_ID node customer id embed xml false gt lt property name balance column BALANCE node balance gt 259 Cap tulo 19 Mapeo XML lt class gt 19 1 2 Especificaci n de s lo un mapeo XML Este es un ejemplo donde no hay ninguna clase POJO lt class entity name Account table ACCOUNTS node account gt lt id name id column ACCOUNT_ID node id type string gt lt many to one name customerld column CUSTOMER_ID node customer id embed xml false entity name Customer gt lt property name balance column BALANCE node balance type big_decimal gt lt class gt Este mapeo le permite acceder a los datos como un rbol dom4j o como un grafo de parejas nombre valor de propiedad OM
263. ing filterName Y disableFilter String filterName Por defecto 255 Cap tulo 18 Filtraci n de datos los filtros no est n habilitados para una sesi n dada Los filtros deben ser habilitados expl citamente por medio del uso del m todo Session enableFilter el cual retorna una instancia de la interfaz Fi1ter Si se utiliza el filtro simple definido anteriormente esto se ver a as session enableFilter myFilter setParameter myFilterParam some value Los m todos en la interfaz org hibernate Filter permiten el encadenamiento de m todos lo cual es bastante com n en gran parte de Hibernate Este es un ejemplo completo utilizando datos temporales con un patr n efectivo de fechas de registro lt filter def name effectiveDate gt lt filter param name asOfDate type date gt lt filter def gt lt class name Employee gt lt many to one name department column dept_id class Department gt lt property name effectiveStartDate type date column eff_start_dt gt lt property name effectiveEndDate type date column eff_end_dt gt gles Note that this assumes non terminal records have an eff_end_dt set to a max db date for simplicity sake gt lt filter name effectiveDate condition asOfDate BETWEEN eff_start_dt and eff_end_dt gt lt class gt lt class name Department gt lt set name employees lazy true gt lt key column dept_id gt lt one to
264. instanciaci n por ejemplo en inicializadores o constructores por defecto entonces esos recursos ser n adquiridos tambi n por el proxy La clase del proxy es una subclase real de la clase persistente Estos problemas se deben a limitaciones fundamentales en el modelo de herencia nica de Java Si desea evitar estos problemas cada una de sus clases persistentes deben implementar una interfaz que declare sus m todos de negocio Debe especificar estas interfaces en el archivo de mapeo en donde cat Imp1 implementa la interfaz Cat y DomesticCat Imp1 implementa la interfaz DomesticCat Por ejemplo lt class name CatImpl proxy Cat gt lt subclass gt lt class Entonces los proxies para las instancias de Cat y Domest icCat pueden ser retornadas por load O iterate Cat cat Cat session load CatImpl class catid Iterator iter session createQuery from CatImpl as cat where cat name fritz iterate Cat fritz Cat iter next 269 Cap tulo 20 Mejoramiento del Nota list usualmente no retorna proxies Las relaciones tambi n son inicializadas perezosamente Esto significa que debe declarar cualquier propiedad como de tipo Cat NO Cat Impl Ciertas operaciones no requieren inicializaci n de proxies equals S la clase persistente no sobrescribe equals hashCode si la clase persistente no sobrescribe hashCode El m todo getter del identificador Hibernate detect
265. interfaces que no est n mapeadas expl citamente lt import class java lang Object rename Universe gt lt import class ClassName oo rename ShortName Hee class El nombre de clase completamente calificado de cualquier clase Java rename opcional por defecto es el nombre de clase sin calificar Un nombre que se puede utilizar en el lenguaje de consulta 5 1 24 Any Hay un tipo m s de mapeo de propiedad El elemento de mapeo lt any gt define una asociaci n polim rfica a clases desde m ltiples tablas Este tipo de mapeo necesita m s de una columna 98 Any La primera columna contiene el tipo de la entidad asociada Las columnas restantes contienen el identificador Es imposible especificar una restricci n de clave for nea para este tipo de asociaci n Esta no es la manera usual de mapear asociaciones polim rficas y s lamente debe usar esto en casos especiales Por ejemplo para registros de auditor a datos de sesi n de usuario etc El atributo meta type le permite especificar a la aplicaci n un tipo personalizado que mapea los valores de columnas de la base de datos a clases persistentes que tengan propiedades identificadoras del tipo especificado por id type Tiene que especificar el mapeo de valores del meta tipo a nombres de clase lt any name being id type long meta type string gt lt meta value value TBL_ANIMAL class Animal gt lt meta value value TBL_HUMAN clas
266. ion foo setProperty bar t commit session close La propiedad version se mapea utilizando lt version gt e Hibernate la incrementar autom ticamente durante la limpieza si la entidad est desactualizada Si est operando un entorno de baja concurrencia de datos y no requiere chequeo de versiones puede usar este enfoque y simplemente saltarse el chequeo de versiones En ese caso el ltimo que guarda gana y ser la estrategia por defecto para conversaciones largas Tenga en mente 195 Cap tulo 12 Transacciones y que esto podr a confundir a los usuarios de la aplicaci n pues podr an experimentar p rdidas de actualizaciones sin mensajes de error ni oportunidad de fusionar los cambios conflictivos El chequeo manual de versiones es factible s lamente en circunstancias muy triviales y no es pr ctico para la mayor a de las aplicaciones Con frecuencia se tienen que chequear no s lamente las intancias s las sino tambi n grafos completos de objetos modificados Hibernate ofrece el chequeo de versiones autom tico con el paradigma de dise o de Session larga o de instancias separadas 12 3 2 Sesi n extendida y versionado autom tico Una s la instancia de Session y sus instancias persistentes se utilizan para toda la convervsaci n conocida como sesi n por conversaci n Hibernate chequea las versiones de instancia en el momento de vaciado lanzando una excepci n si se detecta una modificaci n
267. iones consultas y regiones de cach s recuperando la lista de nombres de entidades colecciones consultas y regiones de cach s con los siguientes m todos get Queries getEntityNames getCollectionRoleNames y getSecondLevelCacheRegionNames 285 286 Manual del conjunto de herramientas La ingenier a compatible con Hibernate es posible utilizando un conjunto de plugins de Eclipse herramientas de la l nea de comandos as como tareas Ant Las herramientas de Hibernate actualmente incluyen plugins la IDE de Eclipse as como tareas Ant para la ingenier a inversa de bases de datos existentes Editor de Mapeo Un editor de archivos de mapeo XML que soporta autocompleci n y resaltado de sint xis Tambi n soporta la autocompleci n sem ntica de nombres de clases y nombres de campos propiedades haci ndolo mucho m s vers til que un editor normal de XML Consola La consola es una nueva vista en Eclipse Adem s de la vista de rbol de sus configuraciones de la consola tambi n tiene una vista interactiva de sus clases persistentes y sus relaciones La consola le permite ejecutar consultas HQL en su base de datos y navegar el resultado directamente en Eclipse Asistentes de desarrollo Se proporcionan muchos asistentes junto con las herramientas Eclipse de Hibernate Puede utilizar un asistente para generar r pidamente los archivos de configuraci n de Hibernate cfg xml o incluso puede realiza
268. iones intenten actualizar el mismo tem simult neamente y no se requiere de un aislamiento de transacciones estricto un cach nonstrict read write podr a ser apropiado Si se utiliza el cach en un entorno JTA tiene que especificar hibernate transaction manager_lookup_class En otros entornos debe asegurarse que se haya completado la transacci n cuando se llame a Session close O Session disconnect 20 2 5 Estrategia transaccional La estrategia de cach transactional brinda soporte a provedores de cach s completamente transaccionales como JBoss TreeCache Un cach as s lo se puede utilizar en un entorno JTA y tiene que especificar hibernate transaction manager_lookup_class 277 Cap tulo 20 Mejoramiento del 20 2 6 Compatibilidad de proveedor de cach estrategia de concurrencia gt Importante Ninguno de los provedores de cach soporta todas las estrategias de concurrencia al cach La siguiente tabla muestra qu provedores son compatibles con qu estrategias de concurrencia Tabla 20 2 Soporte a Estrategia de Concurrencia a Cach Cach read only nonstrict read read write transactional write Hashtable no yes yes yes fue pensado para la utilizaci n en producci n EHCache yes yes yes OSCache yes yes yes SwarmCache yes yes JBoss Cache 1 x yes yes JBoss Cache2 yes yes 20 3 Gesti n de cach s Siempre que pase un objeto a save update
269. iones unidireccionales son m s dif ciles de consultar En una aplicaci n grande casi todas las asociaciones deben ser navegables en ambas direcciones en consultas 323 324 Consideraciones de la portabilidad de la base de datos 26 1 Aspectos b sicos de la portabilidad Uno de los aspectos que m s vende de Hibernate y realmente del mapeo objeto relacional en s es la noci n de portabilidad de la base de datos Podr a ser el caso de un administrador de sistemas migrando de una base de datos de un vendedor a otro o podr a ser un marco de trabajo o una aplicaci n desplegable consumiendo Hibernate para que apunte simult neamente a m ltiples productos de bases de datos Sin importar el escenario exacto la idea b sica es que quiere que Hibernate le ayude a ejecutar frente a cualquier n mero de bases de datos sin cambiar el c digo e idealmente sin cambiar los metadatos de mapeo 26 2 Dialecto La primera l nea de portabilidad para Hibernate es el dialecto el cual es una especializaci n del contrato org hibernate dialect Dialect Un dialecto encapsula todas las diferencias en la manera en que Hibernate debe comunicarse con una base de datos en particular para lograr alguna tarea como el obtener un valor de secuencia o el estructurar una petici n SELECT Hibernate reune un gran rango de dialectos para muchas de las bases de datos m s populares Si encuentra que su base de datos en particular no se encuentra entre est
270. ios de sincronizaci n La aplicaci n no necesita sincronizar sobre ning n objeto empresarial siempre que se mantenga un solo hilo por Session Dentro de una Session la aplicaci n puede usar con seguridad para comparar objetos Sin embargo una aplicaci n que usa fuera de una Session podr a ver resultados inesperados Esto podr a ocurrir incluso en sitios algo inesperados Por ejemplo si pone dos instancias separadas dentro del mismo set ambas podr an tener la misma identidad de la base de datos por ejemplo representar la misma fila Sin embargo la identidad MVJ por definici n no est garantizada para las instancias en estado separado El desarrollador tiene que sobrescribir los m todos equals Y hashCode en las clases persistentes e implementar su propia noci n 188 Temas com nes de igualdad de objetos Hay una advertencia nunca use el identificador de la base de datos para implementar la igualdad Use una clave de negocio una combinaci n de atributos nicos usualmente inmutables El identificador de la base de datos cambiar si un objeto transitorio es hecho persistente Si la instancia transitoria usualmente junto a las instancias separadas es mantenida en un set cambiar el c digo hash rompe el contrato del set Los atributos para las claves empresariales no tienen que ser tan estables como las claves principales de la base de datos s lo tiene que garantizar estabilidad en tanto los objetos est n en
271. istente en particular La Session es una f brica de instancias de Criteria Criteria crit sess createCriteria Cat class crit setMaxResults 50 List cata CEIL LISE 0 16 2 L mitando el conjunto de resultados Un criterio individual de consulta es una instancia de la interfaz org hibernate criterion Criterion La clase org hibernate criterion Restrictions define m todos de f brica para obtener ciertos tipos incorporados de Criterion List cats sess createCriteria Cat class add Restrictions like name Fritz add Restrictions between weight minWeight maxWeight Lists Las restricciones se pueden agrupar l gicamente List cats sess createCriteria Cat class add Restrictions like name Fritz add Restrictions or Restrictions eq age new Integer 0 Restrictions isNull age ie Lista List cats sess createCriteria Cat class sadd Restrictions in name new Stringi Fritz Izi Pk y add Restrictions disjunction add Restrictions isNull age add Restrictions eq age new Integer 0 add Restrictions eq age new Integer 1 add Restrictions eq age new Integer 2 ee alng Oy 233 Cap tulo 16 Consultas por cr Hay un rango de tipos de criterios incorporados subclases de Restrictions Uno de los m s tiles le permite especificar SQL directamente List cats sess createCriteria Cat class ada Restrictions sqlRe
272. ity methods Ak The EntityNameResolver implementation IMPL NOTE An EntityNameResolver really defines a strategy for how entity names should be resolved Since this particular impl can handle resolution for all of our entities we want to take advantage of the fact that SessionFactoryImpl keeps these in a Set so that we only ever have one instance registered Why Well when it comes time to resolve an entity name Hibernate must iterate over all the registered resolvers So keeping that number down helps that process be as speedy as possible Hence the equals and hashCode impls A public class MyEntityNameResolver implements EntityNameResolver public static final MyEntityNameResolver INSTANCE new MyEntityNameResolver public String resolveEntityName Object entity return ProxyHelper extractEntityName entity public boolean equals Object obj return getClass equals obj getClass public int hashCode return getClass hashCode public class MyEntityTuplizer extends PojoEntityTuplizer public MyEntityTuplizer EntityMetamodel entityMetamodel PersistentClass mappedEntity super entityMetamodel mappedEntity public EntityNameResolver getEntityNameResolvers return new EntityNameResolver MyEntityNameResolver INSTANCE 62 EntityNameResolvers public String determineConcreteSubclassEntityName Object entityInstance SessionFactoryImplementor factory String ent
273. ityName ProxyHelper extractEntityName entityInstance if entityName null entityName super determineConcreteSubclassEntityName entityInstance factory return entityName Con el fin de registrar un org hibernate EntityNameResolver los usuarios deben 1 Implementar un Tuplizerpersonalizado implementando el m todo getEnt it yNameResolvers 2 Registrarlo con el org hibernate impl SessionFactoryImp1 el cual es la clase de implementaci n para org hibernate SessionFactory usando el m todo registerEntityNameResolver 63 64 Mapeo O R B sico 5 1 Declaraci n de mapeo Los mapeos objeto relacional usualmente se definen en un documento XML El documento de mapeo est dise ado para que se pueda leer y editar a mano El lenguaje de mapeo est centrado en Java lo que significa que los mapeos se construyen alrededor de declaraciones de clases persistentes y no alrededor de declaraciones de tablas Observe que incluso aunque muchos de los usuarios de Hibernate eligen escribir el XML a mano existe un n mero de herramientas para generar el documento de mapeo incluyendo XDoclet Middlegen y AndroMDA Este es un ejemplo de mapeo lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC _ Hibernate Hibernate Mapping DTD 3 0 EN http hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt class name Cat table cats dis
274. iva de otra manera aparecer un error no se encontr la columna espec fico a la base de datos Se devolver n autom ticamente las columnas adicionales cuando se utiliza la anotaci n pero preferimos ser tan expl citos as como lo muestra el siguiente ejemplo para una many to one a Un Dog 242 Manejo de asociaciones y colecciones sess createSQLQuery SELECT ID NAME BIRTHDATE DOG_ID FROM CATS addEntity Cat class Esto permitira que cat getDog funcione apropiadamente 17 1 3 Manejo de asociaciones y colecciones Es posible unir de manera temprana en el Dog para evitar el posible viaje de ida y vuelta para iniciar el proxy Esto se hace por medio del m todo addJoin el cual le permite unirse en una asociaci n o colecci n sess createSQLQuery SELECT c ID NAME BIRTHDATE DOG_ID D_ID D_NAME FROM CATS c DOGS d WHERE c DOG_ID d D_ID addEntity cat Cat class sadddoin cat dog En este ejemplo los cats retornados tendran su propiedad dog completamente iniciada sin ningun viaje extra de ida y vuelta a la base de datos Observe que agreg un nombre alias cat para poder especificar la ruta de la propiedad de destino de la uni n Es posible hacer la misma uni n temprana para colecciones por ejemplo si el cat tuviese en lugar un Dog uno a muchos sess createSQLQuery SELECT ID NAME BIRTHDATE D_ID D_NAME CAT_ID FROM CATS c DOGS d WHERE E iD dA CAT ID addEntity cat Cat c
275. la Session autom ticamente sino expl citamente Tanto la sesi n por petici n con objetos separados como la sesi n por conversaci n tienen ventajas y desventajas Estas desventajas las discutimos m s adelante en este cap tulo en el contexto del control optimista de concurrencia 12 1 3 Consideraci n de la identidad del objeto Una aplicaci n puede acceder simult neamente al mismo estado persistente en dos Sessiones diferentes Sin embargo una instancia de una clase persistente nunca se comparte entre dos instancias de Session Por lo tanto existen dos nociones diferentes de identidad Identidad de Base de Datos foo getId equals bar getId Identidad JVM foo bar Para los bjetos unidos a una Session en particular por ejemplo en el ambito de una Session las dos nociones son equivalentes y la identidad de la MVJ para la identidad de la base de datos se encuentra garantizada por Hibernate Mientras la aplicaci n acceda simult neamente al mismo objeto empresarial identidad persistente en dos sesiones diferentes las dos instancias ser n realmente diferentes identidad MVJ Los conflictos se resuelven usando un enfoque optimista y el versionado autom tico en tiempo de vaciado al guardar Este enfoque deja que Hibernate y la base de datos se preocupen de la concurrencia Adem s provee la mejor escalabilidad ya que garantizando la identidad en unidades de trabajo monohilo no se necesitan bloqueos caros u otros med
276. la herramienta SchemaExport lt property name serialNumber unique true type string column SERIAL_ NUMBER gt Entonces el mapeo para orderItem puede utilizar 86 One to one lt many to one name product property ref serialNumber column PRODUCT_SERIAL_NUMBER gt Sin embargo esto ciertamente no se aconseja Si la clave Unica referenciada abarca m ltiples propiedades de la entidad asociada debe mapear las propiedades dentro de un elemento nombrado lt properties gt Si la clave nica referenciada es propiedad de un componente usted puede especificar una ruta de propiedad lt many to one name owner property ref identity ssn column OWNER_SSN gt 5 1 13 One to one Una asociaci n uno a uno one to one a otra clase persistente se declara utilizando un elemento one to one SONESEOSONE o 0000 name propertyName class ClassName cascade cascade_style constrained true false fetch join select property ref propertyNameFromAssociatedClass access field property ClassName formula any SQL expression lazy proxy no proxy false 600000000808 entity name EntityName node element name attribute name element attribute embed xml true false foreign key foreign_key_name name El nombre de la propiedad class opcional por defecto es el tipo de la propiedad determinado por reflecci n El nombre de la clase asociada cascade opcional especifica qu
277. lass addJoin cat dogs En este punto estamos alcanzando los l mites de lo que es posible con las consultas nativas sin empezar a mejorar las consultas sql para hacerlas utilizables en Hibernate Los problemas empiezan a surgir cuando las entidades m ltiples retornadas son del mismo tipo o cuando no son suficientes los nombres de las columnas alias predeterminados 17 1 4 Devoluci n de entidades m ltiples Hasta ahora se ha asumido que los nombres de las columnas del grupo de resultados son las mismas que los nombres de columnas especificados en el documento de mapeo Esto puede llegar a ser problem tico para las consultas SQL que unen m ltiples tablas ya que los mismos nombres de columnas pueden aparecer en m s de una tabla Se necesita una inyecci n de alias en las columnas en la siguiente consulta que con mucha probabilidad fallar sess createSQLQuery SELECT c m FROM CATS c CATS m WHERE c MOTHER_ID c ID addEntity cat Cat class addEntity mother Cat class 243 Cap tulo 17 SQL Nativo La intenci n de esta consulta es retornar dos instancias Cat por fila un gato y su mam Sin embargo esto fallar debido a que hay un conflicto de nombres las instancias se encuentran mapeadas a los mismos nombres de columna Tambi n en algunas bases de datos los alias de las columnas retornadas ser n con mucha probabilidad de la forma c IDENTIFICACION c NOMBRE etc los cuales no son iguales a las c
278. ldLid long getStartDated Date getNamed String setStartDatestartDate Date setNamelname String getEndDatel Date setEndDateLendDate Date getHourlyRated MonetoryAmount setHourlyRatelrate MonetoryAmount getld long setidLid long getEmployerd Employer setEmployertemp Employen qgetEmployeed Employee setEmployeelemp Employee Employee id long firstName String taxfileNumber String initial char getNamed Name lastName String s5etNamelname Name getFirstNameb String getld long setFirstNamel firstName String setldiid long getinitiald char getTaxfileNumberd String setinitialCinitial chan setTaxfileNumber taxfileNumberString getLastNamed String setLastNamel_lastName String employee J monona amount BigDecimal getAmount BigDecimal setAmountLamount BigDecimal getCurrencyd Currency setCurrencyl_currency Currency He aqui un posible documento de mapeo lt hibernate mapping gt lt class name Employer table employers gt lt id name id gt lt generator class sequence gt lt param name sequence gt employer_id_seq lt param gt lt generator gt lt id gt lt property name name gt lt class gt lt class name Employment table employment_periods gt lt id name id gt lt generator class sequence gt lt param name sequence gt employment_id_seq lt par
279. lecciones ordenadas Hibernate soporta colecciones implementando java util SortedMap y java util SortedSet Tiene que especificar un comparador en el archivo de mapeo lt set name aliases table person_aliases sort natural gt lt key column person gt lt element column name type string gt lt set gt lt map name holidays sort my custom HolidayComparator gt lt key column year_id gt lt map key column hol_name type string gt lt element column hol_date type date gt lt map 119 Cap tulo 6 Mapeos de colecci n Los valores permitidos del atributo sort SON unsorted natural y el nombre de una clase que implemente java util Comparator Las colecciones ordenadas realmente se comportan como java util TreeSet 0 java util TreeMap Si quiere que la misma base de datos ordene los elementos de la colecci n utilice el atributo order by de los mapeos set bag O map Esta soluci n est disponible s lamente bajo el JDK 1 4 o superior y se implementa utilizando LinkedHashSet O LinkedHashMap Este realiza la ordenaci n en la consulta SQL y no en memoria lt set name aliases table person_aliases order by lower name asc gt lt key column person gt lt element column name type string gt lt set gt lt map name holidays order by hol_date hol_name gt lt key column year_id gt lt map key column hol_name type string gt lt element column hol_date type d
280. led gt true lt attribute gt lt attribute name AutoCloseSessionEnabled gt true lt attribute gt lt i Fetching options gt lt attribute name MaximumFetchDepth gt 5 lt attribute gt lt Second level caching gt lt attribute name SecondLevelCacheEnabled gt true lt attribute gt lt attribute name CacheProviderClass gt org hibernate cache EhCacheProvider lt attribute gt lt attribute name QueryCacheEnabled gt true lt attribute gt Silas Seba gt lt attribute name ShowSqlEnabled gt true lt attribute gt lt Mapping files gt lt attribute name MapResources gt auction Item hbm xml auction Category hbm xml lt attribute gt lt mbean gt lt server gt Este archivo se implementa en un directorio llamado mi en un archivo JAR con la extensi n sar archivo de s ookup lt attribute gt ETA INF y se encuentra empacado ervicio Tambi n necesita empacar Hibernate sus bibliotecas de terceros requeridas sus clases persistentes compiladas as como sus archivos de mapeo en el mismo archivo Sus beans empresariales usualmente beans de sesi n se pueden dejar en su propio archivo JAR pero puede incluir este archivo EJB JAR en el archivo de servicio principal para obtener una unidad desplegable en vivo sin apagarlo Consulte la documentaci n de JBoss AS para obtener m s informaci n sobre el servicio JMX y la implementaci n de EJB 52
281. les Este enfoque requiere instrumentaci n del c digo byte del tiempo estimado de construcci n y se necesita muy raramente e Recuperaci n perezosa de atributos un atributo o una asociaci n monovaluada se recuperan cuando se accede a la variable de la instancia Este enfoque requiere instrumentaci n del c digo byte en tiempo estimado de construcci n y se necesita muy raramente Aqu tenemos dos nociones ortogonales cu ndo se recupera la aplicaci n y c mo se recupera Es importante que no las confunda Utilizamos fetch para afinar el rendimiento Podemos usar lazy para definir un contrato sobre qu datos est n siempre disponibles en cualquier instancia separada de una clase en particular 20 1 1 Trabajo con asociaciones perezosas Por defecto Hibernate3 usa una recuperaci n perezosa por selecci n para colecciones y una recuperaci n por proxy perezosa para asociaciones monovaluadas Estas pol ticas predeterminadas tienen sentido para casi todas las asociaciones en la mayor a de las aplicaciones Si configura hibernate default_batch_fetch_size Hibernate utilizar la optimizaci n de recuperaci n en lotes para recuperaci n perezosa Esta optimizaci n tambi n se puede habilitar en un nivel m s detallado Note que el acceder a una asociaci n perezosa fuera del contexto de una sesi n de Hibernate abierta resultar en una excepci n Por ejemplo s sessions openSession Transaction tx s beginTransaction
282. lic void removeFromEvent Event event this getEvents remove event event getParticipants remove this Los m todos get y set para la colecci n ahora se encuentran protegidos Esto le permite a las clases en el mismo paquete y a las subclases acceder a n a los m todos pero impide a cualquier otro que desordene las colecciones directamente Repita los pasos para la colecci n del otro lado Y el atributo de mapeo inverse Para usted y para Java un enlace bidireccional es simplemente cuesti n de establecer correctamente las referencias en ambos lados Sin embargo Hibernate no tiene suficiente informaci n para organizar correctamente declaraciones INSERT Y UPDATE de SOL para evitar violaciones de restricciones El hacer un lado de la asociaci n inverse le dice a Hibernate que lo considere un espejo del otro lado Eso es todo lo necesario para que Hibernate resuelva todos los asuntos que surgen al transformar un modelo de navegaci n direccional a un esquema de base de datos SQL Las reglas son muy simples todas las asociaciones bidireccionales necesitan que uno de los lados sea inverse En una asociaci n uno a muchos debe ser el lado de muchos y en una asociaci n muchos a muchos puede escoger cualquier lado 21 Cap tulo 1 Tutorial 1 3 Part 3 La aplicaci n web EventManager Una aplicaci n web de Hibernate utiliza Session y Transaction Casi como una aplicaci n aut noma Sin embargo algunos patr
283. lizar una Session implica cuatro fases distintas e limpiar la sesi n e someter la transacci n e cerrar la sesi n manejar excepciones Anteriormente se discuti el vacido de la sesi n as que ahora vamos a mirar m s de cerca la demarcaci n de transacciones y el manejo de excepciones en los dos entornos administrado y no administrado 12 2 1 Entorno no administrado Si una capa de persistencia Hibernate se ejecuta en un entorno no administrado las conexiones de la base de datos se manejan usualmente por simples pools de conexi n por ejemplo no DataSource del cual Hibernate obtiene conexiones al ser necesario El idioma de manejo de sesi n transacci n se ve as Non managed environment idiom Session sess factory openSession Transaction tx null try 190 Entorno no administrado tx sess beginTransaction do some work Ex Commit iy catch RuntimeException e PE ts 1s pull ts rollback y throw e or display error message finally gesen aLose l No tiene que vaciar con flush la Session expl citamente la llamada a commit autom ticamente dispara la sincronizaci n dependiendo del FlushMode para la sesi n Una llamada a close marca el final de una sesi n La implicaci n principal de close es que la conexi n JDBC ser abandonada por la sesi n Este c digo Java es port til y ejecuta en entornos tanto no administrados como JTA Como se mencion ant
284. logItem createBlogItem Blog blog String title String text throws HibernateException Blogltem item new BlogItem item setTitle title item setText text item setBlog blog item setDatetime Calendar getInstance blog getItems add item Session session _sessions openSession Transaction tx null try tx session beginTransaction session update blog Ex commit catch HibernateException he af txt noll tx collback throw he finally session close return item public Blogltem createBlogItem Long blogid String title String text throws HibernateException BlogItem item new BlogItem item setTitle title item setText text item setDatetime Calendar getInstance Session session _sessions openSession Transaction tx null try tx session beginTransaction Blog blog Blog session load Blog class blogid item setBlog blog blog getItems add item EX COM catch HibernateException he FE txl nulil tx rollback throw he 305 Cap tulo 23 Ejemplo Aplicac finally session close return item public void updateBlogItem BlogItem item String text throws HibernateException item setText text Session session _sessions openSession Transaction tx null try tx session beginTransaction session update item Ex commits e catch HibernateException h
285. los responsables de administrar los contratos mencionados anteriormente en relaci n con las entidades mientras que los Component Tuplizers hacen lo mismo para los componentes Los usuarios tambi n pueden enchufar sus propios tuplizers Tal vez necesite que una implementaci n java util Map diferente de java util HashMap se utilice en el modo de entidad de mapeo din mico O quiz s necesite definir una estrategia de generaci n proxy diferente de la que se utiliza por defecto Se pueden obtener ambas al definir una implementaci n tuplizer personalizada Las definiciones de los tuplizers se encuentran sujetas a la entidad o componente de mapeo que se supone que tienen que administrar Regresando al ejemplo de nuestra entidad de cliente lt hibernate mapping gt lt class entity name Customer gt lle Override the dynamic map entity mode tuplizer for the customer entity gt lt tuplizer entity mode dynamic map class CustomMapTuplizerimpl gt lt id name id type long column ID gt lt generator class sequence gt lt id gt lt l other properties gt lt class gt lt hibernate mapping gt public class CustomMapTuplizerlmpl extends org hibernate tuple entity DynamicMapEntityTuplizer override the buildInstantiator method to plug in our custom map protected final Instantiator buildInstantiator org hibernate mapping PersistentClass mappingInfo return new CustomMapInstantiator mappingInfo
286. los nombres de las propiedades de Hibernate y su sem ntica est n definidas en la clase org hibernate cfg Environment Ahora describiremos las configuraciones m s importantes para la conexi n JDBC Hibernate obtendr y tendr en pool las conexiones utilizando java sql DriverManager Si configura las siguientes propiedades 34 Conexiones JDBC Tabla 3 1 Propiedades JDBC de Hibernate Nombre de la propiedad Prop sito hibernate connection driver_class JDBC driver class hibernate connection url JDBC URL hibernate connection username database user hibernate connection password database user password hibernate connection pool_size maximum number of pooled connections Sin embargo el algoritmo de pooling de la conexi n propia de Hibernate es algo rudimentario Est concebido para ayudarle a comenzar y no para utilizarse en un sistema de producci n ni siquiera para pruebas de rendimiento Para alcanzar un mejor rendimiento y estabilidad debe utilizar un pool de terceros S lo remplace la propiedad hibernate connection pool_size con configuraciones espec ficas del pool de conexiones Esto desactivar el pool interno de Hibernate Por ejemplo es posible utilizar C3PO C3P0 es un pool de conexiones JDBC de c digo abierto distribuido junto con Hibernate en el directorio 1ib Hibernate utilizar su org hibernate connection C3P0OConnectionProvider para pooling de conexiones si establece propiedades hibernate c3p0 Si q
287. lt El valor llave segmento para el segmento desde el cual queremos sacar los valores de incremento para este generador segment_value_length opcional por defecto es 255 Se utiliza para la generaci n de esquemas el tama o de la columna a crear esta columna de llave de segmento initial_value opcional por defecto es 1 El valor inicial a recuperar de la tabla increment_size opcional por defecto es 1 El valor por el cual deben diferir las llamadas subsecuentes a la tabla 77 Cap tulo 5 Mapeo O R B sico optimizer optional defaults to See Secci n 5 1 6 Optimizaci n del generador del identificador 5 1 6 Optimizaci n del generador del identificador For identifier generators that store values in the database it is inefficient for them to hit the database on each and every call to generate a new identifier value Instead you can group a bunch of them in memory and only hit the database when you have exhausted your in memory value group This is the role of the pluggable optimizers Currently only the two enhanced generators Secci n 5 1 5 Generadores mejorados del identificador support this operation none generalmente este el es valor predeterminado si no se especifica un optimizador esto no realizar ninguna optimizaci n y acceder a la base de datos para toda petici n hilo aplica un algoritmo hi lo a los valores recuperados de la base de datos Se espera que los valore
288. lte el sitio web de Hibernate y all encontrar una discusi n completa 56 Modelos din micos sobre este problema Este no es un problema de Hibernate sino de la sem ntica normal de Java de identidad de objeto e igualdad Le recomendamos implementar equals Y hashCode Utilizando igualdad de clave empresarial Business key equality Igualdad de clave empresarial significa que el m todo equals s lamente compara las propiedades que forman la clave empresarial Esta es una clave que podr a identificar nuestra instancia en el mundo real una clave candidata natural public class Cat public boolean equals Object other if this other return true if other instanceof Cat return false final Cat cat Cat other if cat getLitterId equals getLitterId return false if cat getMother equals getMother return false return true public int hashCode int result result getMother hashCode result 29 result getLitterId return result A business key does not have to be as solid as a database primary key candidate see Secci n 12 1 3 Consideraci n de la identidad del objeto Immutable or unique properties are usually good candidates for a business key 4 4 Modelos din micos Nota The following features are currently considered experimental and may change in the near future Las entidades persistentes no necesariamente tienen que estar r
289. ltros de Hibernate Hibernate3 tiene la habilidad de predefinir criterios de filtros y unir esos filtros tanto a nivel de clase como de colecci n Un criterio de filtro le permite definir una cl usula de restricci n muy similar al atributo existente where disponible en el elemento class y en varios elementos de colecci n Sin embargo las condiciones de estos filtros se pueden parametrizar La aplicaci n puede tomar la decisi n en tiempo de ejecuci n de si los filtros deben estar habilitados y cu les deben ser sus par metros Los filtros se pueden utilizar como vistas de la base de datos pero parametrizados dentro de la aplicaci n Para utilizar los filtros stos se deben definir primero y luego se unen a los elementos de mapeo apropiados Para definir un filtro utilice el elemento lt filter def gt dentro de un elemento lt hibernate mapping gt lt filter def name myFilter gt lt filter param name myFilterParam type string gt lt filter def gt Luego este filtro se puede adjuntar a una clase lt class name myClass gt lt filter name myFilter condition myFilterParam MY_FILTERED_COLUMN gt lt class gt O a una colecci n SEI 000 lt filter name myFilter condition myFilterParam MY_FILTERED_COLUMN gt lt set gt O incluso a ambos o m ltiples de cada uno al mismo tiempo Los m todos en Session son enableFilter String filterName getEnabledFilter Str
290. lumnas en key y many to many se intercambiaron en ambos documentos de mapeo La adici n m s importante aqu es el atributo inverse true en el elemento set del mapeo de colecci n de Event 20 Trabajo con enlaces bidireccionales Esto significa que Hibernate debe tomar el otro lado la clase Person cuando necesite encontrar informaci n sobre el enlace entre las dos Esto ser mucho m s f cil de entender una vez que vea como se crea el enlace bidireccional entre nuestras dos entidades 1 2 6 Trabajo con enlaces bidireccionales Primero recuerde que Hibernate no afecta la sem ntica normal de Java C mo creamos un enlace entre Person y un Event en el ejemplo unidireccional Agregue una instancia de Event a la colecci n de referencias de eventos de una instancia de Person Si quiere que este enlace funcione bidireccionalmente tiene que hacer lo mismo del otro lado a adiendo una referencia Person a la colecci n en un Event Este proceso de establecer el enlace en ambos lados es absolutamente necesario con enlaces bidireccionales Muchos desarrolladores programan a la defensiva y crean m todos de administraci n de enlaces para establecer correctamente ambos lados por ejemplo en Person protected Set getEvents return events protected void setEvents Set events this events events public void addToEvent Event event this getEvents add event event getParticipants add this pub
291. ly true works well when a single HQL query or criteria loads all the entities and intializes all the proxies and collections that the application needs to be read only When it is not possible to load and initialize all necessary entities in a single query or criteria you can temporarily change the session default to load entities as read only before the query is executed Then you can explicitly initialize proxies and collections before restoring the session default Session session factory openSession Transaction tx session beginTransaction j setDefaultReadOnly true Contract contract Contract session createQuery from Contract where customerName Sherman uniqueResult Hibernate initialize contract getPlan Hibernate initialize contract getVariations Hibernate initialize contract getNotes setDefaultReadOnly false oi O session close If Session isDefaultReadOnly returns true then you can use Query setReadOnly false and Criteria setReadOnly false to override this session setting and load entities that are not read only 11 1 4 Making a persistent entity read only Nota Persistent entities of immutable classes are automatically made read only 178 Read only affect on property type To make a persistent entity or proxy read only call Session setReadOnly entityOrProxy true To change a read only entity or proxy of a mutable class so it is no
292. ma a lock para ese objeto Session lock realiza un chequeo de n mero de versi n si el modo de bloqueo especificado es READ UPGRADE O UPGRADE_NOWAIT En el caso de UPGRADE O UPGRADE_NOWAIT Se USa SELECT FOR UPDATE Si la base de datos no soporta el modo de bloqueo solicitado Hibernate usa un modo opcional apropiado en lugar de lanzar una excepci n Esto asegura que las aplicaciones ser n port tiles 12 5 Modos de liberaci n de la conexi n La herencia 2x de Hibernate en relaci n con la administraci n de la conexion JDBC fue que una Session obtendr a una conexi n cuando se necesitara por primera vez y luego la mantendr a hasta que se cerrara la sesi n Hibernate 3 x introdujo la noci n de modos de liberaci n de conexi n para decirle a la sesi n como manejar sus conexiones JDBC La siguiente discusi n s lamente es pertinente para las conexiones provistas por medio de un ConnectionProvider configurado Las conexiones provistas por el usuario no se discuten aqu Los diferentes modos de liberaci n se identifican por los valores numerados de org hibernate ConnectionReleaseMode ON_CLOSE es el comportamiento heredado descrito anteriormente La sesi n de Hibernate obtiene una conexi n cuando necesita acceder a JDBC la primera vez y mantiene esa conexi n hasta que se cierra la sesi n AFTER_TRANSACTION libera las conecciones despu s de que se ha com
293. many class Employee gt lt filter name effectiveDate condition asOfDate BETWEEN eff_start_dt and eff_end_dt gt lt set gt lt class gt Con el fin de asegurarse de que siempre recibira los registros efectivos actualmente habilite el filtro en la sesi n antes de recuperar los datos de los empleados Session session session enableFilter effectiveDate setParameter asOfDate new Date List results session createQuery from Employee as e where e salary gt targetSalary setLong targetSalary new Long 1000000 256 Filtros de Hibernate LE En el HQL anterior aunque s lo mencionamos expl citamente una restricci n de salario en los resultados debido al filtro habilitado la consulta s lo retornar empleados actualmente activos que tengan un salario mayor a un mill n de d lares Si quiere utilizar filtros con uni n externa ya sea a trav s de HQL o bien de recuperaci n de carga tenga cuidado en la direcci n de expresi n de la condici n Lo m s seguro es configurar esto para una uni n externa izquierda Coloque el par metro primero seguido del nombre s de la s columna s despu s del operador Despu s de definir un filtro este se puede unir a m ltiples entidades y o colecciones cada una con su propia condici n Esto puede llegar a ser problem tico cuando las condiciones son las mismas As que el usar lt filter def gt le permite definir una condici n por defecto ya
294. many column addressId class Address gt lt array gt Un mapeo de indices de cadenas a fechas lt map name holidays 117 Cap tulo 6 Mapeos de colecci n table holidays schema dbo order by hol_name asc gt lt key column id gt lt map key column hol_name type string gt lt element column hol_date type date gt lt map gt Una lista de componentes se discuten en el siguiente cap tulo lt list name carComponents table CarComponents gt lt key column carld gt lt list index column sortOrder gt lt composite element class CarComponent gt lt property name price gt lt property name type gt lt property name serialNumber column serialNum gt lt composite element gt MESE gt 6 2 5 Asociaciones uno a muchos Una asociaci n uno a muchos enlaza las tablas de dos clases por medio de una clave for nea sin intervenci n de tabla de colecci n alguna Este mapeo pierde cierta sem ntica de colecciones Java normales Una instancia de la clase entidad contenida no puede pertenecer a m s de una instancia de la colecci n Una instancia de la clase entidad contenida no puede aparecer en m s de un valor del indice de colecci n Una asociaci n de Product a Part requiere la existencia de una columna clave for nea y posiblemente una columna ndice a la tabla Part Una etiqueta lt one to many gt indica que sta es una asociaci n uno a muchos
295. me customerId gt lt key gt lt one to many class OrderLine gt lt set gt El elemento lt one to many gt declara ninguna columna Si OrderLine posee una colecci n por s misma tiene tambi n una clave for nea compuesta lt class name OrderLine gt lt list name deliveryAttempts gt lt key gt lt l a collection inherits the composite key type gt lt column name lineld gt lt column name orderld gt lt column name customerld gt 146 Componentes din micos lt key gt lt list index column attemptId base 1 gt lt composite element class DeliveryAttempt gt lt composite element gt lt set gt elas gt 8 5 Componentes din micos Tambi n puede mapear una propiedad del tipo Map lt dynamic component name userAttributes gt lt property name foo column FOO type string gt lt property name bar column BAR type integer gt lt many to one name baz class Baz column BAZ_ID gt lt dynamic component gt La sem ntica de un mapeo lt dynamic component gt es dentica a la de lt component gt La ventaja de este tipo de mapeos es la habilidad para determinar las propiedades reales del bean en tiempo de despliegue s lo con editar el documento de mapeo La manipulaci n del documento de mapeo en tiempo de ejecuci n tambi n es posible usando un analizador DOM Tambi n puede acceder y cambiar el metamodelo de tiempo de configura
296. me groupName gt lt column name org gt lt key gt lt many to many class User gt lt column name userName gt lt formula gt org lt formula gt lt many to many gt lt set gt lt class gt 24 4 4 Discriminaci n basada en contenido lt class name Person discriminator value P gt lt id name id column person_id unsaved value 0 gt lt generator class native gt lt id gt lt discriminator 318 Asociaciones sobre claves alternativas type character gt lt formula gt case when title is not null then E when salesperson is not null then C else Me end lt formula gt lt discriminator gt lt property name name not null true length 80 gt lt property name sex not null true update false gt lt component name address gt lt property name address gt lt property name zip gt lt property name country gt lt component gt lt subclass name Employee discriminator value E gt lt property name title length 20 gt lt property name salary gt lt many to one name manager gt lt subclass gt lt subclass name Customer discriminator value C gt lt property name comments gt lt many to one name salesperson gt lt subclass gt elas lt class name Person gt lt id name id gt lt generator class hilo gt lt id gt lt property name name length 100 gt lt one to on
297. mentos occccccccnnnononaninnnaninononinananinnn 54 4 1 2 Proporcione una propiedad identificadora opcional oocococonnccnnnnnnccncnnnnc 55 4 1 3 Prefiera las clases no finales opcional 0 ccecceeeeeeeeeeeeeeeeeeeeeaeeaeees 55 4 1 4 Declare m todos de acceso y de modificaci n para los campos persistentes OPCIONAl voii id pl te IE 55 4 2 Implementaci n de herencia ocooocccccccccccnnonncnccnnnnccnnnonnnnccnnnnnnnnnnnnnncrn nan cnnnnnnnannin 56 4 3 Implementando equals y hashCode oooooocccccccccccoconococonnnnnonononnanccnnnncnnnnnnnancnnns 56 4 4 Modelos din micos cece ee eeeeeeee cette eee ee ee eee ee rr tees ee eee aa ee teeeeeeeeeaeaaeeeeeeeeeeeeaeaae 57 AO MUPIIZONS di iaa 59 4 6 EntityNameResolvVelS tev ceccnshegesctasivedsnaseasscninsaoecendedeestan lees sand EERE aa 61 5 Mapeo O R B SICO ccccccccccecccecececeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeneseseeereeeneneess 65 b 1 Declaraci n de Mapeo micras RARE 65 511 DOCIYPE iia e a ads Api 66 5 1 2 Mapeo de Hibernate ooocccccooncccccononnccccnnnnncconnnncnnnonnncnnnnnnnnncnnnnnnncnnnananes 67 HG Olas aia a 68 AO a A A 72 5 1 5 Generadores mejorados del identificador cococoniniccconnnncccononncnnnnnnnnnnns 76 5 1 6 Optimizaci n del generador del identificador oooo ccccnnnnccnnnnncccnnnnnnoo 78 D17 COMPOST IO soi Ee EREKE EEE REKE EROE RERA RIEA 78 5 18 DISCIIMMMAGOM viaria id 80 5 1
298. mesticCat cat where cat name in namesList q setParameterList namesList names List cats g Listy 10 4 1 5 Paginaci n Si necesita especificar enlaces sobre su conjunto de resultados el n mero m ximo de filas que quiere recuperar y o la primera fila que quiere recuperar puede utilizar los m todos de la interfaz Query Query q sess createQuery from DomesticCat cat q setFirstResult 20 q setMaxResults 10 List cats g list yy Hibernate sabe c mo traducir este l mite de consulta al SQL nativo de su DBMS 10 4 1 6 Iteraci n deslizable Si su controlador JDBC soporta Resultsets deslizables la interfaz Query se puede utilizar para obtener un objeto ScrollableResults que permite una navegaci n flexible de los resultados de consulta Query q sess createQuery select cat name cat from DomesticCat cat order by cat name SerollableResults cats q scroll sd CHES cis I ff find the first name on each page of an alphabetical list of cats by name firstNamesOfPages new ArrayList do String name cats getString 0 firstNamesOfPages add name while cats scroll PAGE_SIZE Now get the first page of cats pageOfCats new ArrayList cats beftcrerirst int i 0 while PAGE_SIZE gt itt amp amp cats next pageOfCats add cats get 1 cats closei 163 Cap tulo 10 Trabajo con objetos Note que se requiere una conexi
299. micSession close Continue on pojoSession Tenga en cuenta que la llamada a getSession utilizando un EntityMode est en la API de Session no en la de SessionFactory De esta forma la nueva Session comparte la conexi n JDBC la transacci n y otra informaci n de contexto Esto significa que no tiene que llamar a flush ni a close en la Session secundaria y tambi n tiene que dejar el manejo de la transacci n y de la conexi n a la unidad de trabajo primaria More information about the XML representation capabilities can be found in Cap tulo 19 Mapeo XML 4 5 Tuplizers org hibernate tuple Tuplizer y sus subinterfaces son las responsables de administrar una representaci n en particular de un dato dadas las representaciones de 59 Cap tulo 4 Clases persistentes org hibernate EntityMode Si un dato dado se considera como una estructura de datos entonces un tuplizer es la cosa que sabe como crear tal estructura de datos y sabe como extraer e insertar valores en dicha estructura de datos Por ejemplo para el modo de entidad POJO el tuplizer correspondiente sabe como crear el POJO por medio de su constructor Tambi n sabe como acceder a las propiedades POJO utilizando los accesores de propiedad definidos Hay dos tipos altos de niveles de Tuplizers representados por las interfaces org hibernate tuple entity EntityTuplizer y org hibernate tuple component ComponentTuplizer LOS EntityTuplizers son
300. mn name bal gt lt comment gt Balance in USD lt comment gt lt column gt 290 Ejecuci n de la herramienta lt property gt Esto da como resultado una declaraci n comment on table O comment on column en el DDL generado donde se encuentre soportado 21 1 2 Ejecuci n de la herramienta La herramienta SchemaExport escribe un script DDL a la salida est ndar y o ejecuta las declaraciones DDL La siguiente tabla presenta las opciones de la l nea de comandos de SchemaExport java cp hibernate_classpaths org hibernate tool hbm2ddl SchemaExport options mapping_files Tabla 21 2 Opciones de L nea de Comandos de schemaExport Opci n Descripci n quiet no envie el script a la salida estandar drop s lamente desechar las tablas create s lamente crear las tablas text no exportar a la base de datos output my_schema ddl enviar la salida del script ddl a un archivo naming eg MyNamingStrategy seleccione Un NamingStrategy config hibernate c g xml lee la configuraci n de Hibernate de un archivo XML lee las propiedades de base de datos de un archivo properties hibernate properties format formatea muy bien el SQL generado en el script delimiter establece un delimitador de fin de l nea para el script Inclusive puede incluir SchemaExport en su aplicaci n Contigurat ion GEg r esF new SchemaExport cfg create false true 21 1 3 Propiedades
301. mo este tutorial va a ser una aplicaci n web vamos a crear y a utilizar los directorios src main java src main resources Y src main webapp Cap tulo 1 Tutorial Vamos a usar Maven en este tutorial sacando ventaja de sus funcionalidades de administraci n de dependencias transitivas as como la habilidad de muchos IDEs para configurar autom ticamente un proyecto para nosotros con base en el descriptor maven lt project xmlns http maven apache org POM 4 0 0 xmlns xsi http www w3 org 2001 XMLSchema instance xsi schemaLocation http maven apache org POM 4 0 0 http maven apache org xsd maven 4 0 0 xsd gt lt modelVersion gt 4 0 0 lt modelVersion gt lt groupld gt org hibernate tutorials lt groupld gt lt artifactld gt hibernate tutorial lt artifactId gt lt version gt 1 0 0 SNAPSHOT lt version gt lt name gt First Hibernate Tutorial lt name gt lt build gt lt we dont want the version to be part of the generated war file name gt lt finalName gt artifactId lt finalName gt lt build gt lt dependencies gt lt dependency gt lt groupld gt org hibernate lt groupId gt lt sartitactIra gt hibernate core lt artifactId gt lt dependency gt ql Because Chis is a WeD dpp We also have a dependency on Ehe Servlet api gt lt dependency gt lt groupld gt javax servlet lt groupId gt lt artiftactid gt servlet api lt artifactld gt lt dependenc
302. more information La administraci n de la sesi n autom tica de Hibernate para contextos de persistencia es particularmente til en este contexto La opci n hbm2dd1 auto activa la generaci n autom tica de los esquemas de la base de datos directamente en la base de datos Esto se puede desactivar eliminando la opci n de configuraci n o redirigi ndolo a un archivo con la ayuda de la tarea de Ant SchemaExport Finalmente agregue a la configuraci n el los fichero s de mapeo para clases persistentes Guarde este archivo como hibernate c g xml en el directorio src main resources 1 1 5 Construcci n con Maven Ahora vamos a construir el tutorial con Maven Es necesario que tenga instalado Maven se encuentra disponible en la p gina de descargas Maven http maven apache org download html Maven leer el archivo pom xm1 que creamos anteriormente y sabr c mo realizar algunas tareas de proyectos b sicos Primero vamos a ejecutar la meta compile para asegurarnos de que podemos compilar todo hasta el momento Cap tulo 1 Tutorial N N hibernateTutorial mvn compile FO Scanning for projects FO II A _ _ _ _ A _ _ A A _ _ a _ MA _ _ A _ A _ _ _ gt _z _ FO Building First Hibernate Tutorial FO task segment compile FO pI_ A _ A _ A _ _ _ _ _ _ ___ ___ _ __ _ _ _ _ _ _ _ _ _ __ __ _ ___ _ _ _ _ __________ _ FO resources
303. n LRU cache expiry policy is never appropriate Como lo mencionamos anteriormente la mayor a de las consultas no se benefician del cach o de sus resultados de modo que por defecto las consultas individuales no se ponen en cach incluso despu s de habilitar el cach para peticiones Para habilitar el cach de resultados para una petici n en particular llame a org hibernate Query setCacheable true Esta llamada permite que la consulta busque resultados existentes en cach o que agregue sus resultados al cach cuando se ejecuta Nota El cach de peticiones no pone en cach el estado real de las entidades en el cach pone en cach solo los valores del identificador y los resultados de tipo valor Por esta raz n el cach de peticiones siempre se debe utilizar en conjunto con el cach de segundo nivel para aquellas entidades que se esperan poner en 280 Regiones de cach de consultas cach como parte de un cach de resultados de una petici n as como con el cach de colecci n 20 4 2 Regiones de cach de consultas Si necesita un control muy detallado sobre las pol ticas de expiraci n del cach de consultas puede especificar una regi n de cach con nombre para una consulta en particular llamando a Query setCacheRegion List blogs sess createQuery from Blog blog where blog blogger blogger setEntity blogger blogger setMaxResults 15 SsetCacheable true setCache
304. n la estrategia de tabla por subclase puede combinar el uso de lt subclass gt y lt join gt asi lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT_ID gt lt generator class native gt lt id gt lt discriminator column PAYMENT_TYPE type string gt lt property name amount column AMOUNT gt lt subclass name CreditCardPayment discriminator value CREDIT gt lt join table CREDIT_PAYMENT gt lt key column PAYMENT_ID gt lt property name creditCardType column CCTYPE gt lt Join gt lt subclass gt lt subclass name CashPayment discriminator value CASH gt lt join table CASH_PAYMENT gt lt key column PAYMENT_ID gt lt join gt lt subclass gt lt subclass name ChequePayment discriminator value CHEQUE gt lt join table CHEQUE_PAYMENT fetch select gt lt key column PAYMENT_ID gt lt join gt lt subclass gt lt class gt La declaraci n opcional fetch select le dice a Hibernate que no recupere los datos de la subclase ChequePayment Utilizando una uni n externa outer join al consultar la superclase 9 1 4 Mezcla de tabla por jerarqu a de clases con tabla por subclase Incluso puede mezclar las estrategias de tabla por jerarqu a y tabla por subclase utilizando este enfoque lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT_ID gt lt generator class native gt 1
305. n remplazo para los interceptores Todos los m todos de la interfaz Session se correlacionan con un evento Tiene un LoadEvent un FlushEvent etc Consulte el DTD del archivo de configuraci n XML o el paquete org hibernate event para ver la lista completa de los tipos de eventos definidos Cuando se realiza una petici n de uno de estos m todos la Session de Hibernate genera un evento apropiado y se lo pasa al escucha listener de eventos configurado para ese tipo Tal como vienen estos escuchas implementan el mismo procesamiento en aquellos m todos donde siempre resultan Sin embargo usted es libre de implementar una personalizaci n de una de las interfaces escuchas por ejemplo el LoadEvent es procesado por la implementaci n registrada de la interfaz LoadEventListener en cuyo caso su implementaci n ser a responsable de procesar cualquier petici n 1oaa realizada a la Session Los escuchas se deben considerar como singletons Esto significa que son compartidos entre las peticiones y por lo tanto no deben guardar ning n estado como variables de instancia Un escucha personalizado implementa la interfaz apropiada para el evento que quiere procesar y o extender una de las clases base de conveniencia o incluso los escuchas de eventos predeterminados utilizados por Hibernate de f brica al declararlos como no finales para este prop sito Los escuchas personalizados pueden ser registrados program ticamente a trav s del
306. n ser bastante sencillos Por ejemplo lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN http hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt class name Blog table BLOGS gt lt id name id column BLOG_ID gt lt generator class native gt lt id gt lt property name name column NAME not null true 302 Mapeos de Hibernate unique true gt lt bag name items inverse true order by DATE_TIME cascade al1 gt lt key column BLOG_ID gt lt one to many class Blogltem gt lt bag gt lt class gt lt hibernate mapping lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN http hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt class name Blogltem table BLOG_ITEMS dynamic update true gt lt id name id column BLOG_ITEM_ID gt lt generator class native gt lt id gt lt property name title column TITLE not null true gt lt property name text column TEXT not null true gt lt property name datetime column DATE_TIME not null true gt lt many to one name blog column BLOG_ID not null true gt 303 Cap tulo 23 Ejemplo Aplicac lt class gt
307. n tipo Java de una biblioteca que necesita hacerse persistente pero que no provee los m todos de acceso necesarios para mapearlo como un componente Debe considerar el implementar org hibernate UserType Este enfoque libera al c digo de aplicaci n de implementar transformaciones a desde un tipo Hibernate 321 Cap tulo 25 Pr cticas recome Utilice JDBC codificado a mano cuando se encuentre atascado En reas de rendimiento cr tico del sistema algunos tipos de operaciones podr an beneficiarse del JDBC directo Sin embargo no asuma que JDBC es necesariamente m s r pido Por favor espere hasta que sepa que se encuentra realmente atascado Si necesita utilizar JDBC directo puede abrir una Session de Hibernate envuelva su operaci n JDBC como un objeto org hibernate jdoc Work usando esa conexi n JDBC De esta manera puede usar a n la misma estrategia de transacci n y el mismo proveedor de conexiones subyacente Comprenda el vaciado de Session A veces la sesi n sincroniza su estado persistente con la base de datos El rendimiento se ver afectado si este proceso ocurre con demasiada frecuencia A veces puede minimizar el vaciado innecesario deshabilitando el vaciado autom tico o incluso cambiando el orden de las consultas u otras operaciones en una transacci n en particular En una arquitectura con tres niveles considere el utilizar objetos separados Al usar una arquitectura de servlet sesi n puede pasar objet
308. nciadas por un objeto persistente y se borran autom ticamente al desreferenciarse Si una colecci n se pasa de un objeto persistente a otro puede que sus elementos se muevan de una tabla a otra Dos entidades no pueden compartir una referencia a la misma instancia de colecci n Debido al modelo relacional subyacente las 111 Cap tulo 6 Mapeos de colecci n propiedades valuadas en colecci n no soportan la sem ntica de valor nulo Hibernate no distingue entre una referencia de colecci n nula y una colecci n vac a Utilice las colecciones persistentes de la misma forma en que utiliza colecciones de Java ordinarias Sin embargo aseg rese de que entiende la sem ntica de las asociaciones bidireccionales se discuten m s adelante 6 2 Mapeos de colecci n Sugerencia Hay bastantes rangos de mapeos que se pueden generar para colecciones que cubren muchos modelos relacionales com nes Le recomendamos que experimente con la herramienta de generaci n de esquemas para comprender c mo se traducen varias declaraciones de mapeo a tablas de bases de datos El elemento de mapeo de Hibernate usado para mapear una colecci n depende del tipo de la interfaz Por ejemplo un elemento lt set gt se utiliza para mapear propiedades de tipo set lt class name Product gt lt id name serialNumber column productSerialNumber gt lt set name parts gt lt key column productSerialNumber not null true gt lt one to many
309. ndo Nivel for more information 3 4 5 Sustituci n de Lenguaje de Consulta Puede definir nuevos tokens de consulta de Hibernate utilizando hibernate query substitutions Por ejemplo hibernate query substitutions true 1 false 0 Esto causar a que los tokens true y false sean traducidos a literales enteros en el SQL generado hibernate query substitutions toLowercase LOWER Esto le permitir a renombrar la funci n Lower de SQL 45 Cap tulo 3 Configuraci n 3 4 6 Estad sticas de Hibernate Si habilita hibernate generate_statistics Hibernate expondr un n mero de m tricas que son tiles al afinar un sistema en ejecuci n por medio de SessionFactory getStatistics Incluso se puede configurar Hibernate para exponer estas estad sticas por medio de JMX Lea el Javadoc de las interfaces en org hibernate stats para obtener m s informaci n 3 5 Registros de mensajes Logging Hibernate utiliza Simple Logging Facade for Java http www slf4j org SLF4J con el fin de registrar varios eventos del sistema SLF4J puede direccionar su salida de registro a varios marcos de trabajo de registro NOP Simple log4j versi n 1 2 JDK 1 4 logging JCL o logback dependiendo de su enlace escogido Con el fin de configurar el registro necesitar s1 43 api jar en su ruta de clase junto con el archivo jar para su enlace preferido s1f 43 log4312 jar en el caso de Log4J Consulte la documentaci n http www slf4j o
310. ne Sydney AND sc store_id store id AND sc cust_id cust id AND prod id ALL SELECT item prod_id FROM line_items item orders o WHERE item order_id o id AND cust current_order o id 15 11 La cl usula order by La lista retornada por una consulta se puede ordenar por cualquier propiedad de una clase retornada o componentes from DomesticCat cat order by cat name asc cat weight desc cat birthdate Los asc O desc opcionales indican ordenamiento ascendente o descendente respectivamente 225 Cap tulo 15 HQL El lenguaje 15 12 La cl usula group by Una consulta que retorna valores agregados se puede agrupar por cualquier propiedad de una clase retornada o componentes select cat color sum cat weight count cat from Cat cat group Dy cat coLlor select foo id avg name max name from Foo foo join foo names name group by foo id Se permite tambi n una cl usula having select cat color sum cat weight count cat from Cat cat group by cat color having cat color in eg Color TABBY eg Color BLACK Las funciones SQL y las funciones de agregaci n SQL est n permitidas en las cl usulas having y order by si est n soportadas por la base de datos subyacente por ejemplo no lo est n en MySQL select cat from Cat cat join cat kittens kitten group by cat id cat name cat other cat properties having avg kitten weight gt 100 order by count kitten asc sum kitten weight desc
311. nerados sin ning n significado empresarial Identifique las llaves naturales Identifique las claves naturales de todas las entidades y map elas usando lt natural id gt Implemente equals Y hashCode para comparar las propiedades que componen la clave natural Coloque cada mapeo de clase en su propio fichero No use un s lo documento monol tico de mapeo Mapee com eg Foo en el archivo com eg Foo hbm xml Esto tiene sentido particularmente en un entorno de equipo Cargue los mapeos como recursos Despliegue los mapeos junto a las clases que mapean Considere el externalizar las cadenas de petici n Esta es una buena pr ctica si sus consultas llaman a funciones SQL que no son del est ndar ANSI Externalizar las cadenas de consulta a archivos de mapeo har la aplicaci n m s port til Use variables de vinculaci n Al igual que en JDBC siempre remplace los valores no constantes con No use la manipulaci n de cadenas para enlazar un valor no constante en una consulta Tambi n considere utilizar par metros con nombre en las consultas No administre sus propias conexiones JDBC Hibernate deja a la aplicaci n administrar las conexiones JDBC pero este enfoque debe considerarse como el ltimo recurso Si no puede utilizar los provedores de conexi n incorporados considere proveer su propia implementaci n de org hibernate connection ConnectionProvider Considere utilizar un tipo personalizado Sup nga que tiene u
312. nes JDBC y recursos JTA sin agregar ning n comportamiento de bloqueo adicional Le recomendamos bastante que tome algo de tiempo con la especificaci n de JDBC ANSI y el aislamiento de transacciones de su sistema de gesti n de base de datos Hibernate no bloquea objetos en la memoria Su aplicaci n puede esperar el comportamiento definido por el nivel de aislamiento de sus transacciones de las bases de datos Gracias a la Session la cual tambi n es un cach con alcance de transacci n Hibernate proporciona lecturas repetidas para b squedas del identificador y consultas de entidad y no consultas de reporte que retornan valores escalares Adem s del versionado del control de concurrencia optimista autom tico Hibernate tambi n ofrece una API menor para bloqueo pesimista de filas usando la sint xis SELECT FOR UPDATE Esta API y el control de concurrencia optimista se discuten m s adelante en este cap tulo Comenzamos la discusi n del control de concurrencia en Hibernate con la granularidad de Configuration SessionFactory Y Session as como las transacciones de la base de datos y las conversaciones largas 12 1 mbitos de sesi n y de transacci n Una SessionFactory es un objeto seguro entre hilos y costoso de crear pensado para que todas las hebras de la aplicaci n lo compartan Se crea una sola vez usualmente en el inicio de la aplicaci n a partir de una instancia Configuration Una Session es un objeto d
313. nes UPDATE y DELETE masivas HQL now supports update delete and insert select Statements See Secci n 14 4 Operaciones de estilo DML for more information 15 16 Consejos y Trucos Puede contar el numero de resultados de una consulta sin retornarlos Integer session createQuery select count from iterate next intValue Para ordenar un resultado por el tama o de una colecci n utilice la siguiente consulta select usr id usr name from User as usr left join usr messages as msg group by usr id usr name order by count msg Si su base de datos soporta subselecciones puede colocar una condici n sobre el tama o de selecci n en la cl usula where de su consulta from User usr where size usr messages gt 1 Si su base de datos no soporta subselecciones utilice la siguiente consulta select usr id usr name from User usr join usr messages msg group by usr id usr name having count msg gt 1 Como esta soluci n no puede retornar un User con cero mensajes debido a la uni n interior la siguiente forma tambi n es til select usr id usr name from User as usr left join usr messages as msg group by usr id usr name having count msg 0 230 Componentes Las propiedades de un JavaBean pueden ser ligadas a los par metros de consulta con nombre Query q s createQuery from foo Foo as foo where foo name name and foo size size q setProperties fooBean
314. nes indexadas puede referirse a los indices maximo y minimo utilizando las funciones minindex Y maxindex De manera similar se puede referir a los elementos maximo y m nimo de una colecci n de tipo b sico utilizando las funciones minelement y maxelement Por ejemplo from Calendar cal where maxelement cal holidays gt current_date from Order order where maxindex order items gt 100 from Order order where minelement order items gt 10000 Las funciones SQL any some all exists in estan soportadas cuando se les pasa el conjunto de elementos o ndices de una colecci n las funciones elements indices O el resultado de una subconsulta vea a continuaci n select mother from Cat as mother Cat as kit where kit in elements foo kittens select p from NameList list Person p where p name some elements list names 223 Cap tulo 15 HQL El lenguaje from Cat cat where exists elements cat kittens from Player p where 3 gt all elements p scores from Show show where fizard in indices show acts Note que estas construcciones size elements indices minindex maxindex minelement maxelement solo se pueden utilizar en la cl usula where en Hibernate3 Los elementos de colecciones indexadas arrays listas mapas se pueden referir por ndice s lamente en una cl usula where from Order order where order items 0 id 1234 select person from Person person Calendar calendar where
315. nnconnnnnnnnons 136 19 2 UNO AUNO das 137 7 5 3 MUCHOS 2 MUCHOS ccscccccccecseseseccsesiae cca stcuecccsdecdccssstecccsstsadecestedeccestonecees 138 7 6 Mapeos de asociaci n m s complejos ocoooooconnccccnnconcnnnnnncncnancnnnnnnonnancnancnnnnnns 139 8 Mapeo de componentes occcocoocccccccocccccnnnococononnccnonnnnconnnnnncnnnnnnncnnnnnnnccnnnnnncnnnnnanccnns 141 HIBERNATE Persistencia rela 8 1 Objetos dependientes ocococcccoconoonccnccnccncnnnnonancnnnnnncnnnnnnnncnnnnn cn nn nnnnannnnnnncnnnnnnnans 141 8 2 Colecciones de objetos dependientes occcccccocococcccnccnconcnnnnonccnnanconnnnnnancnncancnnns 143 8 3 Componentes como ndices de Mapeo cooococccnccnccoccnnnonnnnccncnnconcnnnnancnccancnnnnnns 144 8 4 Componentes como identificadores COMpuestoS oooooococncccccnconcnnnnnncnccnncanonnnnnns 145 8 5 Componentes dIN MICOS ooccccccccccononcccccnnnnncnnnonnancnnnnnnnnnnnnnancnnnnnnnnnnnnnancnncnncinna 147 9 Mapeo de herencias ooocccccoonncccconococcconononnnonnnnnnonnnncnononnnnnnnnnnnnncnnnnnnnennnrnnncnnnanas 149 9 1 Las tres OStrateglas iscoiidcoia flo rentes ld TAREE EERS RAAEN 149 9 1 1 Tabla por jerarqu a de clases ooocncococoncccccnnnoncnononncnccnnnnnonononnanccnnnnnnnnns 149 9 1 2 Tabla por subclase cocinada 150 9 1 3 Tabla por subclase utilizando un discriminador ooooccccnnncccccnoncccccnnnaccnns 151 9 1 4 Mezcla de tabla por jerarqu a de clases con tabla por subclase
316. no se aplica a las colecciones mapeadas inverse true 20 6 Control del rendimiento La optimizaci n no es de mucho uso sin el monitoreo y el acceso a n meros de rendimiento Hibernate brinda un rango completo de n meros sobre sus operaciones internas Las estad sticas en Hibernate est n disponibles por SessionFactory 20 6 1 Control de una SessionFactory Puede acceder a las m tricas de SessionFactory de dos formas Su primera opci n es llamar a sessionFactory getStatistics y leer o mostrar por pantalla la statistics por s mismo Hibernate tambi n puede utilizar JMX para publicar las m tricas si habilita el MBean StatisticsService Puede habilitar un s lo MBean para todas sus SessionFactory O Una por f brica V a el siguiente c digo para ver ejemplos de configuraci n minimalistas MBean service registration for a specific SessionFactory Hashtable tb new Hashtable EbRpUEICHEY pe 7 sSibabast ues tb put sessionFactory myFinancialApp ObjectName on new ObjectName hibernate tb MBean object name StatisticsService stats new StatisticsService MBean implementation stats setSessionFactory sessionFactory Bind the stats to a SessionFactory server registerMBean stats on Register the Mbean on the server MBean service registration for all SessionFactory s Hashtable tb new Hashtable PORPuUt UEy pelis pales io Ss E tb put sessronbactory Mall ObjectName on new O
317. nonnnnnnnnanins 104 5 5 1 Utilizaci n de marcado de XDOCIet ooncccoccccconicoconicccnnconnnconononnnnnnnanos 104 5 5 2 Utlizaci n de Anotaciones JDK 5 0 ooccccconccoconccccncononncncnnconnnnnonnnononcnnnos 106 5 6 Propiedades generadas essri oenina nanen AAKRE RE SAAE ERANA 107 5 7 Expresiones de lectura y escritura de columnas oococcococononoccncnnnoncnnnnnncnncnnnnncnnna 108 5 8 Objetos de bases de datos auxiliares oooooncnnnnoncccccncnnccnnnonncncnncnncononnnnancnnnancnnns 108 6 Mapeos de Colecci n stissespaccstandociesnnnpeceennyncdbansnnecannadosibsunaeeceetieccebanteneeatendaseasmeas 111 6 1 Colecciones persistentes oooncoconononnccnccncononnnnnncancnncnnnnnnnanannrnnconcnnnnanannrancnncnnns 111 6 2 Mapeos de colecci n oooooooccccnccccccnnnonancnnnnncnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnannnnnnncnnna 112 6 2 1 Claves for neas de colecci n ooccccoccccconicocnnccocnconnnnconononanoconononnnncnnnnns 114 6 2 2 Elementos de collecci n sacinandana aiaa 114 6 2 3 Colecciones indexadas ooocccoccccconcccoconocncncnonnnonnnnnonnnnnnnnonnnnonannnonannnonnnos 114 6 2 4 Colecciones de valores y asociaciones Muchos a MuchosS ccccccocccnnnnnncos 116 6 2 5 Asociaciones UNO A MUCHOS occocccccncncncncncnnnnononnnnnnnnonnconnnnnnonnnonnnnannnnnnnos 118 6 3 Mapeos de colecci n avanzados ocooccccccncoccconnoncnccnnnononnnnnnanccnnnnnnnnnnananccnncnnnnnns 119 6 3 1 Colecciones ordenadas cccoccccocnn
318. nos de que decida especificar lock O all como un estilo de cascada para la asociaci n Es posible volver a cargar un objeto y todas sus colecciones en cualquier momento utilizando el m todo refresh Esto es util cuando se usan disparadores de base de datos para inicializar algunas de las propiedades del objeto sess save cat sess flush force the SOL INSERT sess refresh cat re read the state after the trigger executes How much does Hibernate load from the database and how many SQL sELEcTs will it use This depends on the fetching strategy This is explained in Secci n 20 1 Estrategias de recuperaci n 10 4 Consultas Si no conoce los identificadores de los objetos que est buscando necesita una consulta Hibernate soporta un lenguaje de consulta orientado a objetos HQL f cil de usar pero potente a la vez Para la creaci n de consultas program ticas Hibernate soporta una funcionalidad sofisticada de consulta de Criteria y Example QBC y QBE Tambi n puede expresar su consulta en el SQL nativo de su base de datos con soporte opcional de Hibernate para la conversi n del conjunto de resultados a objetos 10 4 1 Ejecuci n de consultas Las consultas HQL y SQL nativas son representadas con una instancia de org hibernate Query Esta interfaz ofrece m todos para ligar par metros manejo del conjunto resultado y para la ejecuci n de la consulta real Siempre obtiene una Query utilizando la Ses
319. ns 36 3 4 1 Dialectos de SQL comidas linde ade es 44 3 4 2 Recuperaci n por Uni n Externa Outer Join Fetching ccccconcccnnccnoc 45 3 4 3 Flujos BINAMOS viole lit 45 3 4 4 Cach de segundo nivel y de lectura ooooocococccicccoconcnonncnconcnnconononnannnncanos 45 3 4 5 Sustituci n de Lenguaje de Consulta ooooooconcccccnnccccnnnonncnconnnncnnnnnnnancnnnanos 45 3 4 6 Estad sticas de Hibernate cccccccceceeeeeeeeeeeeeeeaeeeeeeeeeeeeeeeaeaaeeneeeeeeees 46 3 5 Registros de mensajes Logging ooocccococcccccnoncnnccnonnnncnnonnnncnnnanancnnnnnnnnnnnnnannnnns 46 3 6 Implementaci n de una NamingStrategy coooooooccccnccnconcnnnnnnconcnncononononnancnancnnnnnns 47 3 7 Archivo de configuraci n XML 00ooooccccncocococonococcnnnnnonnnnnncnccnnnnn non nnnnan cen nnn cnn 47 3 8 Integraci n con Servidores de Aplicaciones J2EE ooooonococccccccncincnnnonnccccnncnncnnnnnns 48 3 8 1 Configuraci n de la estrategia de transacci n oooonoccccccnnciccnnnccncnccnnnnncnnns 49 HIBERNATE Persistencia rela 3 8 2 SessionFactory enlazado a INDI 0 00 0 eee cece cece cece cece ea eeeeeeeeeeeeeeaaeaeenees 50 3 8 3 Administraci n de contexto de Sesi n Actual Con JTA naese 51 3 8 4 Despliegue JMX cocoa ii 51 4 Clases persistentes oia dei 53 4 1 Ejemplo simple de POJO 0ooooooccccccnconononconccnnoncononnnnancnncnncononnnnancnnran nono nnnnananacanes 53 4 1 1 Implemente un constructor sin argu
320. nstructor de valores por fila HQL soporta la utilizaci n de la sintaxis row value constructor de SQL ANSI que a veces se denomina sintaxis tuple aunque puede que la base de datos subyacentes no soporte esa noci n Aqu estamos refiri ndonos generalmente a las comparaciones multivaluadas que se asocian t picamente con los componentes Considere una entidad Persona la cual define un componente de nombre from Person p where p name first John and p name last Jingleheimer Schmidt Esa es una sintaxis v lida aunque un poco verbosa Puede hacerlo un poco m s conciso utilizando la sintaxis row value constructor from Person p where p name John Jingleheimer Schmidt Tambi n puede ser til especificar esto en la cl usula select select p name from Person p Tambi n puede ser beneficioso el utilizar la sintaxis row value constructor Cuando se utilizan subconsultas que necesitan compararse con valores m ltiples trom Cat as cat where not cat name cat color in select cat name cat color from DomesticCat cat Algo que se debe tomar en consideraci n al decidir si quiere usar esta sintaxis es que la consulta depender del orden de las sub propiedades componentes en los metadatos 232 Consultas por criterios Acompa a a Hibernate una API de consultas por criterios intuitiva y extensible 16 1 Creaci n de una instancia criteria La interfaz org hibernate Criteria representa una consulta contra una clase pers
321. nsulta nombrada en un mapeo de clase lt class name Person gt lt id name id gt lt generator class increment gt y alos lt property name name not null true gt lt loader query ref person gt lt class gt Esto funciona inclusive con procedimientos almacenados Puede incluso definir una consulta para la carga de colecci n lt set name employments inverse true gt lt key gt lt one to many class Employment gt lt loader query ref employments gt lt set gt 252 Personalice SQL para cargar lt sql query name employments gt lt load collection alias emp role Person employments gt SELECT emp FROM EMPLOYMENT emp WHERE EMPLOYER id ORDER BY STARTDATE ASC EMPLOYEE ASC lt sql query gt Tambi n puede definir un cargador de entidad que cargue una colecci n con una uni n temprana lt sql query name person gt lt return alias pers class Person gt lt return join alias emp property pers employments gt SELECT NAME AS pers emp FROM PERSON pers LEFT OUTER JOIN EMPLOYMENT emp ON pers ID emp PERSON_ID WHERE ID lt sql query gt 253 254 Filtraci n de datos Hibernate3 proporciona un nuevo enfoque innovador para manejar datos con reglas de visibilidad Un filtro Hibernate es un filtro global con nombre y parametrizado que puede ser habilitado o deshabilitado para una sesi n de Hibernate especifica 18 1 Fi
322. nta estas relaciones de manera correcta lt hibernate mapping gt lt class name Work table works discriminator value 5W gt lt id name id column id gt lt generator class native gt ds lt discriminator column type type character gt lt property name title gt lt set name authors table author_work gt lt key column name work_id gt lt many to many class Author column name author_id gt lt set gt 311 Cap tulo 24 Ejemplo mapeos lt subclass name Book discriminator value B gt lt property name text gt lt subclass gt lt subclass name Song discriminator value S gt lt property name tempo gt lt property name genre gt lt subclass gt lt class gt lt class name Author table authors gt lt id name id column id gt lt The Author must have the same identifier as the Person gt lt generator class assigned gt as lt property name alias gt lt one to one name person constrained true gt lt set name works table author_work inverse true gt lt key column author_id gt lt many to many class Work column work_id gt lt set gt lt class gt lt class name Person table persons gt lt id name id column id gt lt generator class native gt lt id gt lt property name name gt lt class gt lt hibernate mapping gt Hay cuatro tablas en este mapeo work
323. ntorno administrado como EJB que nunca es proporcionado para un c digo no administrado es el tiempo de espera de la transacci n Estos tiempos de espera se aseguran de que ninguna transacci n que se comporte inapropiadamente pueda vincular recursos mientras no devuelva una respuesta al usuario Fuera de un entorno administrado JTA Hibernate no puede proporcionar completamente esta funcionalidad Sin embargo Hibernate puede por lo menos controlar las operaciones de acceso de datos asegur ndose de que los bloqueos a nivel de base de datos y las consultas con grandes grupos de resultados se encuentran limitados por un tiempo de espera definido En un entorno administrado Hibernate puede delegar el tiempo de espera de la transacci n a JTA Esta funcionalidad es abstra da por el objeto Transaction de Hibernate Session sess factory openSession try set transaction timeout to 3 seconds sess getTransaction setTimeout 3 sess getTransaction begin do some work sess getTransaction commit 194 Control de concurrencia optimista catch RuntimeException e sess getTransaction rollback throw e or display error message finally sess close set Timeout no se puede llamar en un bean CMT en donde se deben definir declarativamente los tiempos de espera de las transacciones 12 3 Control de concurrencia optimista El nico enfoque consistente con una alta concurrencia y una alta e
324. nts Antes de mapear esta asociaci n considere el otro lado Podriamos mantener esto unidireccional o podr amos crear otra colecci n en el Event si queremos tener la habilidad de navegarlo desde ambas direcciones Esto no es necesario desde un punto de vista funcional Siempre puede 15 Cap tulo 1 Tutorial ejeutar un pedido expl cito para recuperar los participantes de un evento en particular Esta es una elecci n de dise o que depende de usted pero lo que queda claro de esta discusi n es la multiplicidad de la asociaci n muchos valuada en ambos lados denominamos esto como una asociaci n muchos a muchos Por lo tanto utilizamos un mapeo muchos a muchos de Hibernate lt class name Person table PERSON gt lt id name id column PERSON_ID gt lt generator class native gt lt id gt lt property name age gt lt property name firstname gt lt property name lastname gt lt set name events table PERSON_EVENT gt lt key column PERSON_ID gt lt many to many column EVENT_ID class Event gt lt set gt lt class gt Hibernate soporta un amplio rango de mapeos de colecci n el mas com n set Para una asociaci n muchos a muchos o la relaci n de entidad n m se necesita una tabla de asociaci n Cada fila en esta tabla representa un enlace entre una persona y un evento El nombre de esta tabla se declara con el atributo tab1e del elemento set El nombre de la columna id
325. o defina un id del nombre de la propiedad no identificadora e Si la entidad define una propiedad identificadora nombrada puede utilizar ese nombre de propiedad Las referencias a propiedades identificadoras compuestas siguen las mismas reglas de nombramiento Si la entidad no tiene un id del nombre de la propiedad no identificadora la propiedad identificadora compuesta s lamente puede ser referenciada por su nombre definido De otra manera se puede utilizar la propiedad id especial para referenciar la propiedad identificadora Importante Observe que esto ha cambiado bastante desde la version 3 2 2 En versiones previas idsiempre se refer a a la propiedad identificadora sin importar su nombre real Una ramificaci n de esa decisi n fue que las propiedades no identificadoras nombradas id nunca podr an ser referenciadas en consultas de Hibernate 15 6 La cl usula select La cl usula select escoge qu objetos y propiedades devolver en el conjunto de resultados de la consulta Considere lo siguiente 216 La cl usula select select mate from Cat as cat inner join cat mate as mate La consulta seleccionar mates de otros cats Puede expresar esta consulta de una manera m s compacta as select cat mate from Cat cat Las consultas pueden retornar propiedades de cualquier tipo de valor incluyendo propiedades del tipo componente select cat name from DomesticCat cat where cat name like fri5 select cu
326. o existe ning n alias puede referirse a las propiedades por nombre from Cat where name Fritz Si existe un alias use un nombre de propiedad calificado from Cat as cat where cat name Fritz Esto retorna instancias de cat llamadas Fritz La siguiente petici n select foo 219 Cap tulo 15 HQL El lenguaje from Foo foo Bar bar where foo startDate bar date retornar todas las instancias de Foo con una instancia de bar con una propiedad date igual a la propiedad startDate del Foo Las expresiones de ruta compuestas hacen la cl usula where extremadamente potente Tome en consideraci n lo siguiente from Cat cat where cat mate name is not null Esta consulta se traduce a una consulta SQL con una uni n de tabla interna Por ejemplo from Foo foo where foo bar baz customer address city is not null terminar a con una consulta que requerir a cuatro uniones de tablas en SQL El operador se puede utilizar para comparar no s lamente propiedades sino tambi n instancias from Cat cat Cat rival where cat mate rival mate select cat mate from Cat cat Cat mate where cat mate mate The special property lowercase ia can be used to reference the unique identifier of an object See Secci n 15 5 Referencia a la propiedad identificadora for more information from Cat as cat where cat id 123 from Cat as cat where cat mate id 69 La segunda consulta es eficiente y no se necesita
327. o impl cito en la estrategia de mapeo de tabla por clase concreta Existen limitaciones un poco menos restrictivas a los mapeos lt union subclass gt La siguiente tabla muestra las limitaciones de los mapeos de tabla por clase concreta y del polimorfismo impl cito en Hibernate Tabla 9 1 Funcionalidades de los mapeos de herencia Estrategi Polim rfi Polim rfi Polimorfi Polim rfi Polim rfi Consulta Uniones Recuperaci n de muchos uno a uno a muchos 1oad polim rfi polim rfi por herencia a uno uno muchos a get uni n muchos externa tabla por lt many lt one lt one lt many s get Payfeont clas amp om supported jerarquia to one gt to on to to id Payment Order de many gt many gt p o join clases o payment pP table per lt many lt one lt one lt many s get Payfreont clas amp om supported subclass to one gt to on to to id Payment Order many gt many gt p o join o payment p tabla por lt many lt one lt one lt many s get Payfeomt clas amp om supported clase to one gt to on to to id Payment Order concreta many gt many gt p o join union solo o payment subclass para p inverse true tabla por lt any gt not not lt many s createCfrideria MOtment cNOts add Restrictions clase concreta polimorfismo impl cito supported supported to any gt Payment supported supported p 155 156 Trabajo con objetos Hibernate
328. o nivel lt class name User gt lt cache usage read write gt lt id name id gt lt generator class increment gt lt id gt lt natural 1d gt lt property name name gt lt property name org gt lt natural id gt lt property name password gt lt class Esta funcionalidad no esta pensada para uso con entidades con claves naturales mutables Una vez que haya habilitado el cach de consulta de Hibernate Restrictions naturalla le permite hacer uso del algoritmo de cach mas eficiente session createCriteria User class add Restrictions naturalld set name gavin set org hb setCacheable true uniqueResult 240 SQL Nativo Tambi n puede expresar sus consultas en el dialecto SQL nativo de su base de datos Esto es til si quiere utilizar las caracter sticas especificas de la base de datos tales como hints de consulta O la palabra clave connEcT en Oracle Tambi n proporciona una ruta de migraci n limpia desde una aplicaci n basada en SQL JDBC a Hibernate Hibernate3 le permite especificar SQL escrito a mano incluyendo procedimientos almacenados para todas las operaciones create update delete y load 17 1 Uso de una sotouery La ejecuci n de consultas SQL nativas se controla por medio de la interfaz soLQuery la cual se obtiene llamando a Session createSQLQuery Las siguientes secciones describen c mo utilizar esta API para consultas 17 1 1
329. objeto configuration o especificados en el XML de configuraci n de Hibernate No se soporta la configuraci n declarativa a trav s del archivo de propiedades Este es un ejemplo de un escucha personalizado de eventos load public class MyLoadListener implements LoadEventListener this is the single method defined by the LoadEventListener interface public void onLoad LoadEvent event LoadEventListener LoadType loadType throws HibernateException if MySecurity isAuthorized event getEntityClassName event getEntityld throw MySecurityException Unauthorized access 203 Cap tulo 13 Interceptores y Tambi n necesita una entrada de configuraci n dici ndole a Hibernate que utilice el oyente en vez del oyente por defecto lt hibernate configuration gt lt session factory gt lt event type load gt lt listener class com eg MyLoadListener gt lt listener class org hibernate event def DefaultLoadEventListener gt lt event gt lt session factory gt lt hibernate configuration gt En cambio puede registrarlo program ticamente Configuration cfg new Configuration LoadEventListener stack new MyLoadListener new DefaultLoadEventListener cfg EventListeners setLoadEventListeners stack Los oyentes registrados declarativamente no pueden compartir instancias Si se utiliza el mismo nombre de clase en m ltiples elementos lt 1istener gt cada referencia resultar
330. obtenida por Hibernate ser parte de la transacci n JTA global de manera autom tica Tambi n puede instalar una implementaci n JTA aut noma y utilizarla sin EJB Hibernate ofrece dos estrategias para esta integraci n JTA Si usa transacciones gestionadas por bean BMT Hibernate le dir al servidor de aplicaciones que comience y finalice una transacci n BMT si usa la API de Transaction De modo que el c digo de gesti n de la transacci n es id ntico al de un entorno no administrado BMT idiom Session sess factory openSession Transaction tx null try tx sess beginTransaction do some work EL Comma tiO catch RuntimeException e TENE n ll tz rollback J throw e or display error message finally sess close Si quiere utilizar un v nculo de transacci n Session es decir la funcionalidad getCurrentSession para propagaci n de contexto de manera f cil tendr que utilizar el API UserTransaction del JTA directamente BMT idiom with getCurrentSession try UserTransaction tx UserTransaction new InitialContext lookup java comp UserTransaction tx begin Do some work on Session bound to transaction factory getCurrentSession load factory getCurrentSession persist Ex committi catch RuntimeException e tx rollback throw e or display error message 192 Manejo de excepciones Con CMT la demarcaci n de transac
331. olecci n de direcciones o cadenas sus ciclos de vida depender an del padre y no se requerir a ninguna otra acci n para el tratamiento apropiado en cascada de los cambios de estado Cuando se guarda el padre los objetos hijo tipificados en valor tambi n se guardan cuando se borra el padre se borran los hijos etc Esto funciona incluso para operaciones tales como el retiro de un hijo de la colecci n Hibernate detectar esto y ya que los objetos tipificados en valor no pueden tener referencias compartidas entonces borrar el hijo de la base de datos Ahora considere el mismo escenario con los objetos padre e hijos siendo entidades no tipos de valor por ejemplo categor as e items o gatos padres e hijos Las entidades tienen su propio ciclo de vida y soportan referencias compartidas El eliminar una entidad de una colecci n no significa que se pueda borrar y no hay por defecto ning n tratamiento en cascada del estado de una entidad a otras entidades asociadas Hibernate no implementa por defecto la persistencia por alcance Para cada operaci n b sica de la sesi n de Hibernate incluyendo persist merge saveOrUpdate delete lock refresh evict replicate existe un estilo de cascada correspondiente Respectivamente los estilos de cascada se llaman create merge save update delete lock refresh evict replicate Si quiere que una operaci n sea tratada en cascada a lo largo de una asociaci n debe indica
332. olumnas especificadas en los mapeos IDENTIFICACION y NOMBRE La siguiente forma no es vulnerable a la duplicaci n de nombres de columnas sess createSQlQuery SELECT cat mother FROM CATS c CATS m WHERE c MOTHER_ID c ID addEntity cat Cat class addEntity mother Cat class Se especifica esta consulta e la cadena de consultas SQL con un espacio reservado para que Hibernate inserte alias de columnas e las entidades devueltas por la consulta La anotaci n cat y mother que se utiliz anteriormente es la abreviatura para todas las propiedades Opcionalmente puede enumerar las columnas expl citamente pero inclusive en este caso Hibernate inyecta los alias de columnas SQL para cada propiedad El espacio para un alias de columna es s lamente el nombre calificado de la propiedad del alias de la tabla En el siguiente ejemplo recuperamos Cats y sus madres desde una tabla diferente cat_log a la declarada en los meta datos de mapeo Inclusive puede utilizar los alias de propiedad en la cl usula where String sql SELECT ID as c id NAME as c name BIRTHDATE as c birthDate MOTHER_ID as c mother mother FROM CAT_LOG c CAT_LOG m WHERE c mother c ID List loggedCats sess createSQLQuery sql addEntity cat Cat class addEntity mother Cat class list 17 1 4 1 Referencias de propiedad y alias Para la mayor a de los casos se necesita la inyecci n del alias
333. ones comunes son tiles Ahora puede escribir un EventManagerServlet Este servlet puede enumerar todos los eventos almacenados en la base de datos y proporciona una forma HTML para ingresar eventos nuevos 1 3 1 Escritura de un servlet b sico Primero necesitamos crear nuestro servlet de procesamiento b sico Ya que nuestro servlet solo maneja pedidos cet HTTP s lamente solo implementaremos el m todo doGet package org hibernate tutorial web Imports public class EventManagerServlet extends HttpServlet protected void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException SimpleDateFormat dateFormatter new SimpleDateFormat dd MM yyyy tery i Begin unit of work HibernateUtil getSessionFactory getCurrentSession beginTransaction Process request and render page End unit of work HibernateUtil getSessionFactory getCurrentSession getTransaction commit catch Exception ex HibernateUtil getSessionFactory getCurrentSession getTransaction rollback if ServletException class isInstance ex throw ServletException ex else throw new ServletException ex Guarde este servlet como src main java org hibernate tutorial web EventManagerServlet java El patr n aplicado aqui se llama sesi n por petici n Cuando una petici n llega al servlet se abre una nueva Session de Hibernate por medio de la
334. ones son definidos para ser proyecciones agrupadas que adem s aparecen en la cl usula SQL group by Puede asignar un alias a una proyecci n de modo que el valor proyectado pueda ser referido en restricciones u ordenamientos Aqu hay dos formas diferentes de hacer esto 237 Cap tulo 16 Consultas por cr List results session createCriteria Cat class setProjection Projections alias Projections groupProperty color colr naddOrder Order asc Mco Let i alise e List results session createCriteria Cat class setProjection Projections groupProperty color as colr addOrder Order asc colr PO Gs aa ee Los m todos alias Y as simplemente envuelven una instancia de proyecci n en otra instancia de Projection con alias Como atajo puede asignar un alias cuando agregue la proyecci n a una lista de proyecciones List results session createCriteria Cat class setProjection Projections projectionList Projections rowCount catCountByColor Projections avg weight avgWeight Projections max weight maxWeight Proyections grouprroperty Meolor color add rder Order desc catCountByColor addOrder Order desc avgWeight a List results session createCriteria Domestic class cat CreateAlias kittens kit setProjection Projections projectionList add Projections property cat name catName add Projections property kit name
335. onto como la Session se cierre ser n separados y estar n libres para utilizarlos en cualquier capa de aplicaci n por ejemplo directamente como objetos de transferencia de datos hacia y desde la presentaci n Objetos y colecciones transitorios y separados Instancias de clases persistentes que no se encuentran actualmente asociadas con una Session Pueden haber sido instanciadas por la aplicaci n y a n no haber sido persistidas o pueden haber sido instanciadas por una Session cerrada Transaction org hibernate Transaction Opcional Un objeto de corta vida mono hebra que la aplicaci n utiliza para especificar unidades at micas de trabajo Abstrae la aplicaci n de las transacciones subyacentes JDBC JTA o CORBA En algunos casos una Session puede extenderse sobre varias Transactiones Sin embargo la demarcaci n de la transacci n ya sea utilizando la API subyacente 0 Transaction nunca es opcional ConnectionProvider org hibernate connection ConnectionProvider Opcional Una f brica y pool de conexiones JDBC Abstrae a la aplicaci n del Datasource O DriverManager subyacente No se expone a la aplicaci n pero puede ser extendido implementado por el desarrollador TransactionFactory org hibernate TransactionFactory Opcional Una f brica de instancias de Transaction No se expone a la aplicaci n pero puede ser extendido implementado por el desarrollador Extension Interfaces Hibernate ofrece un rango de interfaces de
336. ontra la interfaz Payment lt class name CreditCardPayment table CREDIT_PAYMENT gt lt id name id type long column CREDIT_PAYMENT_ID gt lt generator class native gt lt id gt lt discriminator column CREDIT_CARD type string gt lt property name amount column CREDIT_AMOUNT gt lt subclass name MasterCardPayment discriminator value MDC gt lt subclass name VisaPayment discriminator value VISA gt lt class gt lt class name NonelectronicTransaction table NONELECTRONIC_TXN gt lt id name id type long column TXN_ID gt lt generator class native gt lt id gt lt joined subclass name CashPayment table CASH_PAYMENT gt lt key column PAYMENT_ID gt lt property name amount column CASH_AMOUNT gt lt joined subclass gt lt joined subclass name ChequePayment table CHEQUE_PAYMENT gt lt key column PAYMENT_ID gt lt property name amount column CHEQUE_AMOUNT gt lt joined subclass gt lt class gt Una vez mas no mencionamos a Payment explicitamente Si ejecutamos una consulta frente a la interfaz Payment por ejemplo from Payment Hibernate retorna automaticamente instancias de CreditCardPayment y sus subclases ya que ellas tambi n implementan Payment CashPayment Y ChequePayment pero no las instancias de NonelectronicTransaction 154 Limitaciones 9 2 Limitaciones Existen ciertas limitaciones al enfoque de polimorfism
337. ontrar muchos otros mapeos de ejemplos tiles en la carpeta test de la distribuci n de Hibernate 24 4 1 Asociaci n uno a uno Tipificada lt class name Person gt lt id name name gt lt one to one name address cascade al1 gt lt formula gt name lt formula gt lt formula gt HOME lt formula gt lt one to one gt lt one to one name mailingAddress cascade al1 gt lt formula gt name lt formula gt lt formula gt MAILING lt formula gt lt one to one gt lt class gt lt class name Address batch size 2 check addressType in MAILING HOME BUSINESS gt lt composite id gt lt key many to one name person column personName gt lt key property name type column addressType gt lt composite id gt lt property name street type text gt lt property name state gt lt property name zip gt lt class gt 24 4 2 Ejemplo de clave compuesta lt class name Customer gt 315 Cap tulo 24 Ejemplo mapeos lt id name customerld length 10 gt lt generator class assigned gt lt id gt lt property name name not null true length 100 gt lt property name address not null true length 200 gt lt list name orders inverse true cascade save update gt lt key column customerld gt lt index column orderNumber gt lt one to many class Order gt SASE gt lt class gt lt class name Orde
338. operaciones deben ir en cascada desde el objeto padre hasta el objeto asociado constrained opcional especifica que una restricci n de clave for nea en la clave principal de la tabla mapeada referencia la tabla de la clase asociada Esta opci n afecta el orden en que van en la cascada save Y delete y determina si la asociaci n puede ser virtualizada por proxies La herramienta de exportaci n de esquemas tambi n lo utiliza 87 Cap tulo 5 Mapeo O R B sico fetch opcional por defecto es select Escoge entre la recuperaci n de uni n exterior outer join o la recuperaci n por selecci n secuencial property ref opcional El nombre de una propiedad de la clase asociada que est unida a la clave principal de esta clase Si no se especifica se utiliza la clave principal de la clase asociada access opcional por defecto es property La estrategia que Hibernate utiliza para acceder al valor de la propiedad formula opcional Casi todas las asociaciones uno a uno mapean a la clave principal de la entidad propietaria Si este no es el caso puede especificar otra columna o columnas o una expresi n para unir utilizando una f rmula SQL Para un obtener un ejemplo consulte org hibernate test onetooneformula lazy opcional por defecto es proxy Por defecto las asociaciones de punto nico van con proxies lazy no proxy especifica que esta propiedad debe ser tra da perezosamente cuando se acceda po
339. oradas Los nombres de atajo para los generadores incorporados son los siguientes increment genera indentificadores de tipo long short O int que s lamente son nicos cuando ning n otro proceso est insertando datos en la misma tabla No lo utilice en un cl ster identity soporta columnas de identidad en DB2 MySQL MS SQL Server Sybase y HypersonicSQL El identificador devuelto es de tipo long short O int sequence usa una secuencia en DB2 PostgreSQL Oracle SAP DB McKoi o un generador en Interbase El identificador devuelto es de tipo long short O int hilo utiliza un algoritmo alto bajo para generar eficientemente identificadores de tipo long short O int dada una tabla y columna como fuente de valores altos por defecto hibernate_unique_key Y next_hi respectivamente El algoritmo alto bajo genera identificadores que son nicos s lamente para una base de datos particular seghilo utiliza un algoritmo alto bajo para generar eficientemente identificadores de tipo long short O int dada una secuencia de base de datos 73 Cap tulo 5 Mapeo O R B sico uuid utiliza un algoritmo UUID de 128 bits para generar identificadores de tipo cadena nicos dentro de una red se utiliza la direcc n IP El UUID se codifica como una cadena hexadecimal de 32 d gitos de largo guid utiliza una cadena GUID generada por base de datos en MS SQL Server y MySQL native selecciona identity sequence O hilo dependiendo d
340. oramiento del Si quiere cambiar la estrategia de recuperaci n utilizada por get O load utilice una consulta Criteria Por ejemplo User user User session createCriteria User class setFetchMode permissions FetchMode JOIN add Restrictions idEq userld uniqueResult Esto es el equivalente de Hibernate de lo que otras soluciones ORM denominan un plan de recuperaci n Un enfoque completamente diferente de evitar problemas con selecciones N 1 es usar el cach de segundo nivel 20 1 3 Proxies de asociaciones de un s lo extremo La recuperaci n perezosa de colecciones est implementada utilizando la implementaci n de colecciones persistentes propia de Hibernate Sin embargo se necesita un mecanismo diferente para un comportamiento perezoso en las asociaciones de un s lo extremo La entidad destino de la asociaci n se debe tratar con proxies Hibernate implementa proxies de inicializaci n perezosa para objetos persistentes utilizando la mejora del c digo byte en tiempo de ejecuci n por medio de la biblioteca CGLIB En el arranque Hibernate3 genera proxies por defecto para todas las clases persistentes y los usa para habilitar la recuperaci n perezosa de asociaciones muchos a uno Y uno a uno El archivo de mapeo puede declarar una interfaz a utilizar como interfaz de proxy para esa clase con el atributo proxy Por defecto Hibernate usa una subclase de la clase La clase tratada con proxies debe im
341. ore update disminuir el rendimiento Es muy til prevenir que se llame innecesariamente a un disparador de actualizaci n de la base de datos al volver a unir un gr fico de instancias separadas a una Session Si activa dynamic update usted tendr la opci n de estrategias de bloqueo optimistas version chequea las columnas de versi n sello de fecha all chequea todas las columnas dirty chequea las columnas modificadas permitiendo algunas actualizaciones concurrentes none no utilice bloqueo optimista Le recomendamos mucho que utilice columnas de versi n sello de fecha para el bloqueo optimista con Hibernate Esta estrategia optimiza el rendimiento y maneja correctamente las modificaciones realizadas a las instancias separadas por ejemplo cuando se utiliza Session merge Para un mapeo de Hibernate no hay diferencia entre una vista y una tabla base Esto es transparente a nivel de base de datos aunque algunos DBMS no soportan correctamente las vistas especialmente con las actualizaciones A veces usted quiere utilizar una vista pero no puede crear una en la base de datos por ejemplo con un esquema heredado En este caso usted puede mapear una entidad inmutable de s lo lectura a una expresi n de subconsulta SQL dada lt class name Summary gt lt subselect gt select item name max bid amount count from item 71 Cap tulo 5 Mapeo O R B sico lt ielk gt Dec join bid on bi
342. ores oooocccocononoconcnnconononnancnncnncnnnnonnnnnnncnnnnnnnnnonnnnrnnnancnnns 18 1 2 5 Asociaciones bidireccionales oooocicccncnnococonococcnnnnncnononnnnccnnnn cn corn nnanannnanos 20 1 2 6 Trabajo con enlaces bidireccionales ooonoocccccnnnicoccnccnccncnncnnononnancnnnancnnns 21 1 3 Part 3 La aplicaci n web EventManager oooocccccccccccnnonncoccnnnnncnnnnnnancnnnnn cn nn nnnnanos 22 1 3 1 Escritura de un servlet D SICO oooocococononoccccncnnconcnnnnanccnnancnnnonnnananccnncnncnnns 22 1 3 2 Procesamiento y entrega cccccoonccccccnnnncccnonenccnnnnnncnnonnnncnnnnnnncnrnnnnnacnnananas 23 1 3 3 Despliegue Y prueba cooccocccononoccccnnnononononncnccnnnnnonnnnnnancnnnnnnnnnnnanincrnncnnnnnns 25 1 4 RESUMEN sito 26 2 Arquitectura E A diia ica 27 2 SINOPSIS sariren a betel sensnndeenas Eia aae eek vaneesaeedeg ERa Kaaa 27 2 2 Estados de INStanClal 10m 30 2 3 Integraci n JMX socios lr tdo cn 30 2 47 Soporte Aci Aa 31 2 5 Sesiones CONtextuales siinid nerien nii eeii adaini aaa aaa ina 31 3 COMPQUIACION cinnara Dd a dalla 33 3 1 Configuraci n program tica occoccocococonccoccnnnoncnnnonnnnccnnnnnnnnnnnnanrnnnnnnnnnnnnnancannancinns 33 3 2 Obtenci n de una SessionFactory oooooocccccccnconcnnnnnnconcnncononnnnancnnnancnnnnonnnncannancnnns 34 3 9 Conexiones JDBC iironde aonaid ienaa eai ea aa eiaa i aaaea 34 3 4 Par metros de configuraci n opcionales oooooonoccccnccncincnnnncncnncnnconcnnnnanancnancnncnn
343. os no es demasiado dificil es escribir el propio 26 3 Resoluci n del dialecto Originalmente Hibernate siempre requer a que los usuarios especificaran qu dialecto utilizar En el caso de aquellos usuarios que buscaban apuntar a m ltiples bases de datos de manera simult nea con su construcci n eso representaba un problema Generalmente esto requer a que los usuarios configuraran el dialecto de Hibernate o que definieran su propio m todo para establecer ese valor Empezando con la versi n 3 2 Hibernate introdujo la noci n de detectar autom ticamente el dialecto a utilizar con base en los java sql DatabaseMetaData que se obtuvieron de una java sql Connection a esa base de datos Esto era mucho mejor pero esta resoluci n estaba limitada a las bases de datos que Hibernate conoce por adelantado y de ninguna manera era configurable ni se pod a sobreescribir Starting with version 3 3 Hibernate has a fare more powerful way to automatically determine which dialect to should be used by relying on a series of delegates which implement the org hibernate dialect resolver DialectResolver which defines only a single method public Dialect resolveDialect DatabaseMetaData metaData throws JDBCConnectionException 325 Cap tulo 26 Consideraciones The basic contract here is that if the resolver understands the given database metadata then it returns the corresponding Dialect if not it returns null and the process continue
344. os persistentes en el bean de sesi n hacia y desde la capa del servlet JSP Use una sesi n nueva para atender el servicio de cada petici n Use Session merge O Session saveOrUpdate para sincronizar los objetos con la base de datos En una arquitectura con dos niveles considere el utilizar contextos largos de persistencia Las transacciones de la base de datos tienen que ser tan cortas como sea posible para obtener una mejor escalabilidad Sin embargo con frecuencia es necesario implementar transacciones de aplicaci n de larga ejecuci n una sola unidad de trabajo desde el punto de vista de un usuario Una transacci n de aplicaci n puede abarcar muchos ciclos de petici n respuesta del cliente Es com n usar objetos separados para implementar transacciones de aplicaci n Una alternativa apropiada en arquitecturas de dos niveles es mantener una sesi n de un s lo contacto de persistencia abierto para todo el ciclo de vida de la transacci n de aplicaci n Luego simplemente desconectar de la conexi n JDBC al final de cada petici n y reconectar al comienzo de la petici n subsecuente Nunca comparta una sesi n nica a trav s de m s de una transacci n de aplicaci n o estar trabajando con datos desactualizados No trate las excepciones como recuperables Esto es m s bien una pr ctica necesaria m s que una pr ctica recomendada Cuando ocurra una excepci n deshaga la Transaction y cierre la Session Si no lo hace Hiberna
345. ount all Puede utilizar operadores aritm ticos concatenaci n y funciones SQL reconocidas en la cl usula select select cat weight sum kitten weight from Cat cat join cat kittens kitten group by cat id cat weight select firstName initial upper lastName from Person Las palabras clave distinct y all se pueden utilizar y tienen las misma semantica que en SQL select distinct cat name from Cat cat 218 Consultas polim rficas select count distinct cat name count cat from Cat cat 15 8 Consultas polim rficas Una consulta como from Cat as cat devuelve instancias no s lamente de cat sino tambi n de subclases como DomesticCat Las consultas de Hibernate pueden nombrar cualquier clase o interfaz Java en la cl usula from La consulta retornar instancias de todas las clases persistentes que extiendan esa clase o implementen la interfaz La siguiente consulta retornar a todos los objetos persistentes from java lang Object o La interfaz Named se podr a implementar por varias clases persistentes from Named n Named m where n name m name Las dos ltimas consultas requerir n m s de un SELECT SQL Esto significa que la cl usula order by no ordenar correctamente todo el conjunto que resulte Tambi n significa que no puede llamar estas consulta usando Query scroll 15 9 La cl usula where La cl usula where le permite refinar la lista de instancias retornadas Si n
346. peciales elements indices las cuales se pueden cuantificar utilizando some all exists any in e Cualquier funci n escalar SQL soportada por la base de datos como sign trunc rtrim Y sin e par metros posicionales JDBC par metros con nombre name start_date y x1 e literales SQL foo 69 6 66E 2 1970 01 01 10 00 01 0 e constantes Java public static finaleg Color TABBY in Y between pueden utilizarse as from DomesticCat cat where cat name between A and B from DomesticCat cat where cat name in Foo Bar Baz Las formas negadas se pueden escribir asi from DomesticCat cat where cat name not between A and B from DomesticCat cat where cat name not in Foo Bar Baz De manera similar is null y is not null se pueden utilizar para probar valores nulos Los valores booleanos se pueden utilizar f cilmente en expresiones declarando substituciones de consulta HQL en la configuraci n de Hibernate lt property name hibernate query substitutions gt true 1 false 0 lt property gt Esto remplazar las palabras clave true y false con los literales 1 y 0 en el SQL traducido de este HQL 222 Expresiones from Cat cat where cat alive true Puede comprobar el tama o de una colecci n con la propiedad especial size o la funci n especial size from Cat cat where cat kittens size 0 from Cat cat where size cat kittens gt 0 Para las coleccio
347. piedad mapea a la columna de la llave principal de la tabla de la base de datos La propiedad podr a llamarse de cualquier manera y su tipo podr a haber sido cualquier tipo primitivo cualquier tipo de wrapper primitivo java lang String O java util Date Si su tabla de base de datos heredada tiene claves compuestas puede utilizar una clase definida por el usuario con propiedades de estos tipos vea la secci n sobre identificadores compuestos m s adelante en este cap tulo La propiedad identificadora es estriciamente opcional Puede olvidarla y dejar que Hibernate siga internamente la pista de los identificadores del objeto Sin embargo no recomendamos que esto suceda De hecho algunas funcionalidades se encuentran disponibles s lamente para clases que declaran una propiedad identificadora e Transitive reattachment for detached objects cascade update or cascade merge see Secci n 10 11 Persistencia transitiva e Session saveOrUpdate e Session merge Le recomendamos que declare propiedades identificadoras nombradas consistentemente en clases persistentes y que utilice un tipo nulable por ejemplo no primitivo 4 1 3 Prefiera las clases no finales opcional Un aspecto central de Hibernate los proxies dependen de que las clases persistentes sean no finales o de la implementaci n de una interfaz que declare todos los m todos p blicos Con Hibernate puede persistir las clases finales que no implementen una
348. plementar un constructor por defecto con al menos visibilidad de paquete Recomendamos este constructor para todas las clases persistentes Hay problemas potenciales que se deben tener en cuenta al extender este enfoque a las clases polim rficas Por ejemplo lt class name Cat proxy Cat gt lt subclass gt lt elass Primero las instancias de cat nunca seran objeto de un cast a DomesticCat incluso aunque la instancia subyacente sea una instancia de Domest icCat Cat cat Cat session load Cat class id instantiate a proxy does not hit the db if cat isDomesticCat hit the db to initialize the proxy 268 Proxies de asociaciones de un s lo extremo DomesticCat dc DomesticCat cat ESO Segundo es posible romper el proxy Cat cat Cat session load Cat class id instantiate a Cat proxy DomesticCat de DomesticCat session load DomesticCat class id acquire new DomesticCat proxy System out println cat dc false Sin embargo la situaci n no es en absoluto tan mala como parece Aunque tenemos ahora dos referencias a objetos proxy diferentes la instancia subyacente ser a n el mismo objeto cat setWeight 11 0 hit the db to initialize the proxy System out println dc getWeight 11 0 Tercero no puede usar un proxy CGLIB para una clase final o una clase con alg n m todo final Finalmente si su objeto persistente adquiere cualquier recurso bajo
349. pletado una org hibernate Transaction AFTER_STATEMENT tambi n se conoce como una liberaci n agresiva libera conexiones despu s de cada ejecuci n de una declaraci n Se salta esta liberaci n agresiva si la declaraci n deja abiertos recursos asociados con la sesi n dada Actualmente la nica situaci n donde ocurre esto es por medio del uso de org hibernate ScrollableResults 199 Cap tulo 12 Transacciones y El par metro de configuraci n hibernate connection release_mode se utiliza para especificar el modo de liberaci n a utilizar Los valores posibles son los siguientes auto predeterminado esta opci n delega al modo de liberaci n devuelto por el m todo org hibernate transaction TransactionFactory getDefaultReleaseMode Para JTATransactionFactory esto devuelve ConnectionReleaseMode AFTER_STATEMENT para JDBCTransactionFactory esto devuelve ConnectionReleaseMode AFTER_TRANSACTION No cambie este comportamiento predeterminado ya que las fallas debido a este valor de esta configuraci n tienden a indicar errores y o suposiciones en el c digo del usuario on_close usa ConnectionReleaseMode ON_CLOSE Esta configuraci n se deja para la compatibilidad con versiones anteriores pero no se recomienda para nada su utilizaci n after_transaction utiliza ConnectionReleaseMode AFTER_TRANSACTION Esta configuraci n no se debe utilizar en entornos JTA Tambi n note que con ConnectionRel
350. ployment llena de datos hist ricos de empleo Entonces se puede mapear una asociaci n al empleador m s reciente del empleado el que tiene la startDate m s reciente de esta manera lt join gt lt key column employeeId gt lt subselect gt select employeeld orgld from Employments group by orgld having startDate max startDate lt subselect gt lt many to one name mostRecentEmployer class Organization column orgId gt O 139 Cap tulo 7 Mapeos de asociaci n Esta funcionalidad le permite cierto grado de creatividad y flexibilidad pero usualmente es m s pr ctico manejar esta clase de casos utilizando HQL o una petici n de criterio 140 Mapeo de componentes La noci n de un componente se reutiliza en muchos contextos diferentes para prop sitos diferentes a trav s de Hibernate 8 1 Objetos dependientes Un componente es un objeto contenido que es persistido como un tipo de valor no una referencia de entidad El t rmino componente hace referencia a la noci n orientada a objetos de composici n y no a componentes a nivel de arquitectura Por ejemplo puede modelar una persona as public class Person private java util Date birthday private Name name private String key public String getKey return key private void setKey String key this key key public java util Date getBirthday return birthday public void setBirthday java util Date
351. posite name Establece una profundidad maxima del rbol de recuperaci n por uni n externa outer join para asociaciones de un s lo extremo uno a uno muchos a uno Un o deshabilita la recuperaci n por uni n externa predeterminada ej los valores recomendados entre 0 y 3 Establece un tama o por defecto para la recuperaci n en lote de asociaciones de Hibernate 37 Cap tulo 3 Configuraci n Nombre de la propiedad hibernate default_entity_mode hibernate order_updates hibernate generate_statistics Prop sito ej valores recomendados 4 8 16 Establece un modo predeterminado de representaci n de entidades para todas las sesiones abiertas desde esta SessionFactory dynamic map dom43 pojo Obliga a Hibernate a ordenar las actualizaciones SQL por el valor de la clave principal de los items a actualizar Esto resultar en menos bloqueos de transacci n en sistemas altamente concurrentes e g true false De habilitarse Hibernate colectar estad sticas tiles para la afinaci n de rendimiento e g true false hibernate use_identifier_rollback hibernate use_sql_comments De habilitarse cuando se borren los objetos las propiedades identificadoras generadas se resetear n a losvalores establecidos por defecto e g true false De activarse Hibernate generar comentarios dentro del SQL para una depuraci n m s f cil por defecto es false e g true false Tabla
352. pre demarca expl citamente las transacciones Con seguridad una transacci n nica de base de datos va a funcionar mejor que muchas transacciones peque as inclusive para leer datos Una aplicaci n Hibernate puede ejecutarse en entornos no administrados por ejemplo aplicaciones simples Web o Swing aut nomas y entornos administrados por J2EE En un entorno no administrado Hibernate es usualmente responsable de su propio pool de conexiones de la base de datos El desarrollador de aplicaciones tiene que establecer manualmente los l mites de transacci n inicar guardar o deshacer las transacciones de la base de datos por s mismo Un entorno administrado usualmente proporciona transacciones gestionadas por contenedor con el ensamble de transacci n definido declarativamente por ejemplo en descriptores de despliegue de beans de sesi n EJB La demarcaci n program tica de transacciones ya no es necesaria Sin embargo com nmente se quiere mantener su capa de persistencia port til entre entornos locales de recursos no administrados y sistemas que pueden confiar en JTA pero utilizar BMT en vez de CMT En ambos casos utilizar a la demarcaci n de transacci n program tica Hibernate ofrece una API de envoltura llamada Transaction que se traduce al sistema de transacciones nativo de su entorno de despliegue Esta API es de hecho opcional pero le recomendamos bastante su uso salvo que est en un bean de sesi n CMT Usualmente el fina
353. primera llamada a getCurrent Session en el SessionFactory Entonces se inicia una transacci n de la base de datos Todo acceso a 22 Procesamiento y entrega los datos tiene que suceder dentro de una transacci n sin importar que los datos sean le dos o escritos No utilice el modo auto commit en las aplicaciones No utilice una nueva Session de Hibernate para cada operaci n de base de datos Utilice una Session Hibernate que cubra el campo de todo el pedido Utilice getCurrentSession para vincularlo autom ticamente al hilo de Java actual Despu s se procesan las acciones posibles del pedido y se entrega la respuesta HTML Llegaremos a esa parte muy pronto Finalmente la unidad de trabajo termina cuando se completa el procesamiento y la entrega Si surgi alg n problema durante el procesamiento o la entrega se presentar una excepci n y la transacci n de la base de datos se deshar Esto completa el patr n session per request En vez del c digo de demarcaci n de la transacci n en todo servlet tambi n podr a escribir un filtro de servlet V a el sitio web de Hibernate y el Wiki para obtener m s informaci n sobre este patr n llamado sesi n abierta en vista Lo necesitar tan pronto como considere representar su vista en JSP no en un servlet 1 3 2 Procesamiento y entrega Ahora puede implementar el procesamiento del pedido y la representaci n de la p gina Write HTML header PrintWriter out
354. public DataProxyHandler String entityName Serializable id this entityName entityName data put ld 20 public Object invoke Object proxy Method method Object args throws Throwable String methodName method getName if methodName startsWith set String propertyName methodName substring 3 data put propertyName args 0 else if methodName startsWith get String propertyName methodName substring 3 return data get propertyName else if toString equals methodName return entityName data get Id else if hashCode equals methodName return new Integer this hashCode return null public String getEntityName return entityName public HashMap getData 61 Cap tulo 4 Clases persistentes return data Ak GYA public class ProxyHelper public static String extractEntityName Object object Our custom java lang reflect Proxy instances actually bundle their appropriate entity name so we simply extract it from there if this represents one of our proxies otherwise we return null if Proxy isProxyClass object getClass InvocationHandler handler Proxy getInvocationHandler object if DataProxyHandler class isAssignableFrom handler getClass DataProxyHandler myHandler DataProxyHandler handler return myHandler getEntityName return null various other util
355. queo optimista Sin embargo a veces la aplicaci n puede usar los sellos de fecha de otras maneras 81 Cap tulo 5 Mapeo O R B sico lt timestamp Go O O9 column timestamp_column name propertyName access field property ClassName unsaved value null undefined source vm db 000000 generated never always node element name attribute name element attribute column opcional por defecto es el nombre de la propiedad El nombre de una columna que tiene el sello de fecha name El nombre de una propiedad del estilo JavaBeans de tipo Java Date 0 Timestamp de la clase persistente access opcional por defecto es property La estrategia que Hibernate utiliza para acceder al valor de la propiedad unsaved value opcional por defecto es nu11 Un valor de propiedad de versi n que indica que una instancia est reci n instanciada sin guardar distingui ndola de instancias separadas que hayan sido guardadas o cargadas en una sesi n previa Undefined especifica que debe utilizarse el valor de la propiedad identificadora source opcional por defecto es vm Desde d nde debe recuperar Hibernate el valor del sello de fecha Desde la base de datos o desde la MVJ actual Los sellos de fecha con base en la base de datos provocan un gasto general debido a que Hibernate tiene que llegar hasta la base de datos para poder determinar el siguiente valor Es m s seguro utilizarlo en entornos con cl
356. r table CustomerOrder lazy true gt lt synchronize table Lineltem gt lt synchronize table Product gt lt composite id name id class Order Id gt lt key property name customerld length 10 gt lt key property name orderNumber gt lt composite id gt lt property name orderDate type calendar_date not null true gt lt property name total gt lt formula gt select sum li quantity p price from Lineltem li Product p where li productId p productld and li customerId customerld and li orderNumber orderNumber lt formula gt lt property gt lt many to one name customer column customerld insert false update false not null true gt lt bag name lineltems fetch join inverse true cascade save update gt lt key gt lt column name customerld gt lt column name orderNumber gt lt key gt lt one to many class Lineltem gt lt bag gt 316 Ejemplo de clave compuesta lt class gt lt class name Lineltem gt lt composite id name id class LineItem Id gt lt key property name customerld length 10 gt lt key property name orderNumber gt lt key property name productId length 10 gt lt composite id gt lt property name quantity gt lt many to one name order insert false update false not null true gt lt column name customerld gt lt column name orderNumber gt lt many to one gt
357. r eso en el documento de mapeo Por ejemplo lt one to one name person cascade persist gt 171 Cap tulo 10 Trabajo con objetos Los estilos de cascada pueden combinarse lt one to one name person cascade persist delete lock gt Incluso puede utilizar cascade a11 para especificar que todas las operaciones deben ser tratadas en cascada a lo largo de la asociaci n La cascade none predeterminada especifica que ninguna operaci n se tratar en cascada Un estilo de cascada especial delete orphan se aplica s lamente a asociaciones uno a muchos e indica que la operaci n delete debe aplicarse a cualquier objeto hijo que se elimine de la asociaci n Recomendaciones e Usualmente no tiene sentido habilitar el tratamiento en cascada en una asociaci n lt many to one gt O lt many to many gt El tratamiento en cascada es frecuentemente til para las asociaciones lt one to one gt Y lt one to many gt e Si el periodo de vida de los objetos hijos est ligado al periodo de vida del objeto padre h galo un objeto de ciclo de vida especificando cascade a11 delete orphan e En otro caso puede que usted no necesite tratamiento en cascada en absoluto Pero si piensa que va a estar trabajando frecuentemente con padre e hijos juntos en la misma transacci n y quiere ahorrarse algo de escritura en computador considere el utilizar cascade persist merge save update Mapear una asociaci n ya
358. r primera vez la variable de instancia Requiere instrumentaci n del c digo byte en tiempo de compilaci n 1azy false especifica que la asociaci n siempre ser recuperada tempranamente Observe que Si constrained false la aplicaci n de proxies es imposible e Hibernate recuperar tempranamente la asociaci n entity name opcional El nombre de entidad de la clase asociada Existen dos variedades de asociaciones uno a uno asociaciones de clave primaria asociaciones de clave for nea nica Las asociaciones de claves principales no necesitan una columna extra de la tabla Si dos filas est n relacionadas por la asociaci n entonces las dos filas de tablas comparten el mismo valor de clave principal Para que dos objetos est n relacionados por una asociaci n de clave principal aseg rese de que se les asigne el mismo valor de identificador Para una asociaci n de clave principal agregue los siguientes mapeos a Employee Y Person respectivamente lt one to one name person class Person gt lt one to one name employee class Employee constrained true gt Aseg rese de que las claves principales de las filas relacionadas en las tablas PERSON y EMPLOYEE sean iguales Utilizamos una estrategia especial de generaci n de identificador de Hibernate denominada foreign lt class name person table PERSON gt lt id name id column PERSON_ID gt lt generator class foreign gt 88 Natural id
359. r tomar un grafo de la instancias persistentes y hacerlas persistentes en un almacenamiento de datos diferente sin regenerar los valores identificadores retrieve a cat from one database Session sessionl factoryl openSession Transaction txl sessionl beginTransaction Cat cat sessionl get Cat class catld alo come loe sessionl close reconcile with a second database Session session2 factory2 openSession Transaction tx2 session2 beginTransaction session2 replicate cat ReplicationMode LATEST_VERSION EZ COmmi ye session2 close El ReplicationMode determina c mo replicate tratar los conflictos con filas existentes en la base de datos ReplicationMode IGNORE ignora el objeto cuando existe una fila de la base de datos con el mismo identificador ReplicationMode OVERWRITE sobrescribe cualquier fila de la base de datos existente con el mismo identificador 169 Cap tulo 10 Trabajo con objetos ReplicationMode EXCEPTION lanza una excepci n si existe una fila de la base de datos con el mismo identificador ReplicationMode LATEST_VERSION sobrescribe la fila si su n mero de versi n es anterior al n mero de versi n del objeto o de lo contrario ignora el objeto Los casos de uso para esta funcionalidad incluyen reconciliar datos ingresados en instancias diferentes de bases de datos actualizar informaci n de configuraci n del sistema
360. r una ingenier a inversa completa de un esquema de la base de datos existente en los archivos de c digo fuente de POJO y los archivos de mapeo de Hibernate El asistente de ingenier a inversa soporta plantillas personalizables Por favor refi rase al paquete de documentaci n de las Herramientas de Hibernate para obtener m s informaci n Sin embargo el paquete principal de Hibernate viene con una herramienta integrada SchemaExport tambi n conocida como hbm2dd1 Incluso se puede utilizar dentro de Hibernate 21 1 Generaci n autom tica de esquemas Una de las funciones de Hibernate puede generar DDL desde sus archivos de mapeo El esquema generado incluye restricciones de integridad referencial claves principales y for neas para las tablas de entidades y colecciones Tambi n se creen tablas y secuencias para los generadores de identificadores mapeados Tiene que especificar un Dialecto SQL por medio de la propiedad hibernate dialect al usar esta herramienta ya que el DDL es altamente espec fico de acuerdo con el vendedor Primero debe personazar sus archivos de mapeo para mejorar el esquema generado La siguiente secci n aborda la personalizaci n del esquema 287 Cap tulo 21 Manual del conju 21 1 1 Personalizaci n del esquema Muchos elementos de mapeo de Hibernate definen atributos opcionales denominados length precision y scale Con estos atributos puede establecer el tama o la precisi n y la escal
361. raci n La recuperaci n por selecci n la preestablecida es extremadamente vulnerable a problemas de selecci n N 1 de modo que puede que queramos habilitar la recuperaci n por uni n join fetching en el documento de mapeo lt set name permissions fetch join gt lt key column userld gt lt one to many class Permission gt lt set lt many to one name mother class Cat fetch join gt La estrategia de recuperaci n definida en el documento de mapeo afecta a e las recuperaciones por medio de get O load e las recuperaciones que ocurren impl citamente cuando se navega una asociaci n recuperaci n perezosa las consultas de Criteria e las consultas HQL si se utiliza la recuperaci n subselect Sin importar que estrategia de recuperaci n utilice se garantiza que la gr fica no perezoza definida ser cargada en la memoria Sin embargo esto puede causar la utilizaci n de varias selecciones inmediatas para ejecutar una consulta HQL en particular Usualmente no utilizamos el documento de mapeo para personalizar la recuperaci n En cambio mantenemos el comportamiento por defecto y lo sobrescribimos para una transacci n en particular utilizando left join fetch en HQL Esto le dice a Hibernate que recupere la asociaci n tempranamente en la primera selecci n usando una uni n externa En la API de consulta de criteria usted utilizar a setFetchMode FetchMode JOIN 267 Cap tulo 20 Mej
362. rceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt class name Cat table CATS gt lt id name id column uid type long gt lt generator class hilo gt lt dl gt lt property name birthdate type date gt lt property name color not null true gt lt property name sex not null true gt lt property name weight gt lt many to one name mate gt lt set name kittens gt lt key column MOTHER gt lt one to many class Cat gt lt set gt lt joined subclass name DomesticCat table DOMESTIC_CATS gt lt key column CAT gt lt property name name type string gt lt joined subclass gt lt class gt lt class name eg Dog gt lt mapping for Dog could go here gt lt class gt lt hibernate mapping gt For information about inheritance mappings see Cap tulo 9 Mapeo de herencias 5 1 19 Union subclass Una tercera opci n es mapear s lo las clases concretas de una jerarqu a de herencia a tablas Esta se llama la estrategia clase concreta por tabla Cada tabla define todos los estados persistentes de la clase incluyendo el estado heredado En Hibernate no es necesario mapear dichas jerarqu as de herencia Puede mapear cada clase con una declaraci n lt class gt separada Sin embargo si desea utilizar asociaciones polim rficas por ejemplo una asociaci n a la superclase de su jerarqu a necesita utilizar el mapeo lt union
363. resources FO Using default encoding to copy filtered resources FO compiler compile FO Compiling 1 source file to home steve projects sandbox hibernateTutorial target classes FO _ _ _ _ __ _ _ _ _ a _ a _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a FO BUILD SUCCESSFUL FO A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A AAA FO Total time 2 seconds FO Finished at Tue Jun 09 12 25 25 CDT 2009 FO Final Memory 5M 547M FO A A SS 1 1 6 Inicio y ayudantes Es el momento de cargar y almacenar algunos objetos Event pero primero tiene que completar la configuraci n con algo de c digo de infraestructura Tiene que iniciar Hibernate construyendo un objeto org hibernate SessionFactory global y almacenarlo en alg n lugar de f cil acceso en el c digo de la aplicaci n Una org hibernate SessionFactory se utiliza para obtener instancias org hibernate Session Una org hibernate Session representa una unidad de trabajo mono hilo La org hibernate SessionFactory es un objeto global seguro entre hilos que se instancia una s la vez Vamos a crear una clase de ayuda HibernateUtil que se encargue del inicio y haga m s pr ctico el acceso a org hibernate SessionFactory package org hibernate tutorial util import org hibernate SessionFactory import org
364. rg manual html SLF4J para obtener mayores detalles Para usar Log4j tambi n necesitar poner un archivo log4j properties en su ruta de clase Un archivo de propiedades de ejemplo se distribuye junto con Hibernate en el directorio src Le recomendamos bastante que se familiarice con los mensajes de registro de Hibernate Se ha trabajado bastante para hacer que los registros de Hibernate sean tan detallados como sea posible sin hacerlos ilegibles Es un dispositivo esencial en la resoluci n de problemas Las categor as de registro m s interesantes son las siguientes Tabla 3 9 Categor as de Registro de Hibernate Categor a Funci n org hibernate SOL Registra todas las declaraciones DML de SQL a medida que se ejecutan org hibernate type Registra todos los par metros JDBC org hibernate tool hbmAtegistra todas las declaraciones DDL de SQL a medida que se ejecutan org hibernate pretty Registra el estado de todas las entidades m ximo 20 entidades asociadas con la sesi n en tiempo de limpieza flush org hibernate cache Registra toda la actividad del cach de segundo nivel org hibernate transactiRegistra la actividad relacionada con la transacci n org hibernate jdbc Registra toda adquisici n de recursos JDBC org hibernate hql ast ABegista los ASTs de HQL y SQL durante an lisis de consultas org hibernate secure Registra todas las peticiones de autorizaci n JAAS org hibernate Registra todo Hay mucha informaci n
365. rias lt class name Parent gt lt id name id column parent_id gt lt map name children gt lt key column parent_id not null true gt lt map key column name type string gt lt one to many class Child gt lt map gt lt class gt lt class name Child gt lt id name id column child_id gt lt many to one name parent class Parent column parent_id insert false update false not null true gt lt class gt Note que en este mapeo el extremo de la asociaci n valuado en colecci n es responsable de las actualizaciones de la clave for nea 6 3 4 Asociaciones ternarias Hay tres enfoques posibles para mapear una asociaci n ternaria Una es utilizar un Map con una asociaci n como su ndice lt map name contracts gt lt key column employer_id not null true gt lt map key many to many column employee_id class Employee gt lt one to many class Contract gt lt map gt lt map name connections gt lt key column incoming_node_id gt lt map key many to many column outgoing_node_id class Node gt lt many to many column connection_id class Connection gt lt map gt Un segundo enfoque es remodelar la asociaci n como una clase de entidad Este es el enfoque m s com n La ltima opci n es utilizar elementos compuestos que discutiremos m s adelante 123 Cap tulo 6 Mapeos de colecci n 6 3 5 Using an lt id
366. rio ra z de la ruta de clase 3 Establecer propiedades system Utilizando java Dproperty value 4 Incluir los elementos lt property gt en hibernate cfg xml esto se discute m s adelante Si quiere empezar r pidamente hibernate properties es el enfoque m s f cil La org hibernate cfg Configuration est concebida como un objeto de tiempo de inicio que se va a descartar una vez se crea una SessionFactory 3 2 Obtenci n de una SessionFactory Cuando la org hibernate cfg Configuration ha analizado sint cticamente todos los mapeos la aplicaci n tiene que obtener una f brica para las instancias org hibernate Session Esta f brica est concebida para que todos los hilos de la aplicaci n la compartan SessionFactory sessions cfg buildSessionFactory Hibernate permite que su aplicaci n instancie m s de una org hibernate SessionFactory Esto es til si est utilizando mas de una base de datos 3 3 Conexiones JDBC e j Ue la org hibernate SessionFactory eya n n ol conexione Se aconseja que hib cre Imacene en pool con nes JDBC por usted Si adopta este enfoque el abrir una org hibernate Session es tan simple como Session session sessions openSession open a new Session En el momento en que inicie una tarea que requiera acceso a la base de datos se obtendr una conexi n JDBC del pool Para que esto funcione primero necesita pasar algunas las propiedades de conexi n JDBC a Hibernate Todos
367. rld gt lt key property name customerId gt lt composite id gt lt property name name gt lt many to one name order class Order insert false update false gt lt column name orderId gt lt column name customerld gt lt many to one gt lt class gt Cualquier clave for nea que referencie la tabla de orderLine tambi n es compuesta Declare esto en sus mapeos de otras clases Una asociaci n a OrderLine se mapea as lt many to one name orderLine class OrderLine gt lt the class attribute is optional as usual gt lt column name lineld gt 145 Cap tulo 8 Mapeo de componentes lt column name orderld gt lt column name customerld gt lt many to one gt Sugerencia El elemento column es una alternativa al atributo column en cualquier lugar El uso del elemento column simplemente le da m s opciones de declaraci n las cuales son tiles al utilizar hom2dd1 Una asociaci n muchos a muchos a OrderLine tambi n usa la clave for nea compuesta lt set name undeliveredOrderLines gt lt key column name warehouseld gt lt many to many class OrderLine gt lt column name lineld gt lt column name orderld gt lt column name customerld gt lt many to many gt lt set gt La colecci n de OrderLines en Order utilizar a lt set name orderLines inverse true gt lt key gt lt column name orderld gt lt column na
368. rnate esto se llama un elemento compuesto name String date Date serialNumber String getld long getld long setQuantityl_quantity int getld long setldtid long setldtid long getProduct Product setidCid long getNamed String getLineltemsd List setProductiproduct Product getSerialNumberb String setNamel_name String setlineltemsilineltems List setSerialNumber serialNumber String getOrdersd Set getCustomerd Customer customer orders setOrderstorders Set setCustomericustomer Customen getDated Date setDate date Date El documento de mapeo se ver asi lt hibernate mapping gt lt class name Customer table customers gt lt id name id gt lt generator class native gt lt a gt lt property name name gt lt set name orders inverse true gt lt key column customer_id gt lt one to many class Order gt lt set gt lt class gt 313 Cap tulo 24 Ejemplo mapeos lt class name Order table orders gt lt id name id gt lt generator class native gt lt id gt lt property name date gt lt many to one name customer column customer_id gt lt list name lineltems table line_items gt lt key column order_id gt lt list index column line_number gt lt composite element class Lineltem gt lt property name quantity gt lt many to one name product column produc
369. rnate mapping gt Por otro lado si un hijo tiene m ltiples padres una asociaci n muchos a muchos es apropiada lt hibernate mapping gt lt class name Parent gt lt id name id gt 126 Ejemplos de colecci n lt generator class sequence gt lt id gt lt set name children table childset gt lt key column parent_id gt lt many to many class Child column child_id gt lt set gt lt class gt lt class name Child gt lt id name id gt lt generator class sequence gt lt id gt lt property name name gt lt class gt lt hibernate mapping gt Definiciones de tabla create table parent id bigint not null primary key create table child id bigint not null primary key name varchar 255 create table childset parent_id bigint not null chila id bigint not null primary key parent_id child id alter table childset add constraint childsetfk0 parent_id references parent alter table childset add constraint childsetfk1 child_id references child For more examples and a complete explanation of a parent child relationship mapping see Cap tulo 22 Ejemplo Padre Hijo for more information En el pr ximo cap tulo abordaremos los mapeos de asociaciones m s complejas 127 128 Mapeos de asociaci n 7 1 Introducci n Los mapeos de asociaci n son frecuentemente lo m s dif cil de implementar correctamente En esta secci n r
370. ropia estrategia Sugerencia Lay native is no longer consider the best strategy in terms of portability for further discussion see Por ltimo es necesario decirle a Hibernate sobre las porpiedades de clase de entidad que quedan Por defecto ninguna propiedad de la clase se considera persistente lt hibernate mapping package org hibernate tutorial domain gt lt class name Event table EVENTS gt lt id name id column EVENT_ID gt lt generator class native gt tas lt property name date type timestamp column EVENT_DATE gt lt property name title gt lt class gt lt hibernate mapping gt Al igual que con el elemento ia el atributo name del elemento property le dice a Hibernate que m todos getter y setter utilizar As que en este caso Hibernate buscar los m todos getDate setDate getTitle Y setTitle O Configuraci n de Hibernate El mapeo de title carece de un atributo type Los tipos que declaramos y utilizamos en los archivos de mapeo no son tipos de datos Java Tampoco son tipos de base de datos SQL Estos tipos se llaman tipos de mapeo Hibernate convertidores que pueden traducir de tipos de datos de Java a SQL y viceversa De nuevo Hibernate tratar de determinar el tipo correcto de conversi n y de mapeo por s mismo si el atributo type no se encuentra presente en el mapeo En algunos casos esta detecci n autom tica utilizando Reflection en la clase
371. rsistente tiene que sobrescribir equals y hashCode para implementar la igualdad del identificador compuesto Tambi n tiene que implementar Serializable Desafortunadamente este enfoque significa que un objeto persistente es su propio identificador No existe otra asa conveniente m s que el objeto mismo Debe instanciar una instancia de la clase persistente y poblar sus propiedades identificadoras antes de que pueda loaa el estado persistente asociado a una clave compuesta Este enfoque lo denominamos un identificador compuesto inclu do y no lo recomendamos para aplicaciones serias Un segundo enfoque es lo que denominamos un identificador compuesto mapeado en donde las propiedades del identificador nombradas dentro del elemento lt composite id gt son duplicadas tanto en la clase persistente como en la clase identificadora separada lt composite id class Medicareld mapped true gt lt key property name medicareNumber gt lt key property name dependent gt lt composite id gt En este ejemplo tanto la clase identificadora compuesta medicareIa como la clase de entidad misma tienen propiedades denominadas medicareNumber Y dependent La clase identificadora tiene que sobrescribir equals Y hashCode e implementar Serializable La desventaja principal de este enfoque es la duplicaci n de c digo Los siguientes atributos se utilizan para especificar un identificador compuesto mapeado mapped opcional por de
372. s return parts void setParts Set parts this parts parts public String getSerialNumber return serialNumber void setSerialNumber String sn serialNumber sn La interfaz real puede ser java util Set java util Collection java util List java util Map java util SortedSet java util SortedMap O lo que usted quiera donde lo que usted quiera significa que tendr que escribir una implementaci n de org hibernate usertype UserColl ctionType Note c mo se inicializ la variable de instancia con una instancia de Hashset Esta es la mejor forma de inicializar las propiedades valuadas en colecci n de instancias reci n instanciadas no persistentes Cuando hace persistente la instancia llamando a persist por ejemplo Hibernate realmente remplazar el Hashset con una instancia de una implementaci n de Set propia de Hibernate Observe los siguientes errores Cat cat new DomesticCat Cat kitten new DomesticCat Set kittens new HashSet kittens add kitten cat setKittens kittens session persist cat kittens cat getKittens Okay kittens collection is a Set HashSet cat getKittens Error Las colecciones persistentes inyectadas por Hibernate se comportan como HashMap HashSet TreeMap TreeSet O ArrayList dependiendo del tipo de interfaz Las instancias de colecciones tienen el comportamiento usual de los tipos de valor Son autom ticamente persistidas al ser refere
373. s Human gt lt meta value value TBL_ALIEN class Alien gt lt column name table_name gt lt column name id gt lt any gt lt any name propertyName id type idtypename meta type metatypename cascade cascade_style access field property ClassName 0000090 optimistic lock truelfalse lt meta value gt lt meta value gt ZCC aoro MF lt LColuma n agag ie name el nombre de la propiedad id type el tipo del identificador discriminador O e O meta type opcional por defecto es string Cualquier tipo que se permita para un mapeo cascade opcional por defecto es none el estilo de cascada 6 access opcional por defecto es property La estrategia que Hibernate utiliza para acceder al valor de la propiedad 99 Cap tulo 5 Mapeo O R B sico GO optimistic 1ock opcional por defecto es true Especifica si las actualizaciones de esta propiedad requieren o no de la adquisici n del bloqueo optimista Define si debe ocurrir un incremento de versi n cuando esta propiedad est desactualizada 5 2 Tipos de Hibernate 5 2 1 Entidades y Valores En relaci n con el servicio de persistencia los objetos a nivel de lenguaje Java se clasifican en dos grupos Una entidad existe independientemente de cualquier otro objeto que referencie a la entidad Compare esto con el modelo habitual de Java en donde un objeto no referenciado es recolectado como bas
374. s authors y persons tienen los datos de obra autor y persona respectivamente author_work es una tabla de asociaci n enlazando los autores a las obras Este es el esquema de tablas tal como fue generado por SchemaExport create table works id BIGINT not null generated by default as identity tempo FLOAT genre VARCHAR 255 text INTEGER title VARCHAR 255 type CHAR 1 not null primary key id create table author_work author_id BIGINT not null work_id BIGINT not null 312 Cliente Orden Producto primary key work_id author_id create table authors id BIGINT not null generated by default as identity alias VARCHAR 255 primary key id create table persons id BIGINT not null generated by default as identity name VARCHAR 255 primary key id alter table authors add constraint authorsFKO foreign key id references persons alter table author_work add constraint author_workFKO foreign key author_id references authors alter table author_work add constraint author_workFK1 foreign key work_id references works 24 3 Cliente Orden Producto En esta secci n consideramos un modelo de las relaciones entre Customer Order Line Itemy Product Hay una asociaci n uno a muchos entre Customer y Order pero c mo deber amos representar Order LineItem Product En el ejemplo LineItem se mapea como una clase de asociaci n representando la asociaci n muchos a muchos entre Order y Product En Hibe
375. s lo es til para prototipos y para tutoriales como este M s adelante discutiremos con m s detalles el rastreo de sesi n actual Una org hibernate Session se inicia cuando se realiza la primera llamada a getCurrentSession para el hilo actual Luego Hibernate la vincula al hilo actual Cuando termina la transacci n ya sea por medio de guardar o deshacer los cambios Hibernate desvincula autom ticamente la org hibernate Session del hilo y la cierra por usted Si llama a 12 Carga y almacenamiento de objetos getCurrentSession de nuevo obtiene una org hibernate Session nueva y obtiene una nueva org hibernate Session unidad de trabajo En relaci n con la unidad del campo de trabajo Se deber a utilizar org hibernate Session de Hibernate para ejecutar una o varias operaciones de la base de datos El ejemplo anterior utiliza una org hibernate Session para una operaci n Sin embargo esto es pura coincidencia el ejemplo simplemente no es lo suficientemente complicado para mostrar cualquier otro enfoque El mbito de una org hibernate Session de Hibernate es flexible pero nunca debe dise ar su aplicaci n para que utilice una nueva org hibernate Session de Hibernate para cada operaci n de la base de datos Aunque lo utilizamos en los siguientes ejemplos considere la sesi n por operaci n como un anti patr n M s adelante en este tutorial se muestra una aplicaci n web real lo cual le ayudar a ilustrar esto See C
376. s de la base de datos para este optimizador sean secuenciales Los valores recuperados de la estructura de la base de datos para este optimizador indican el n mero del grupo El increment_size se multiplica por ese valor en la memoria para definir un grupo hi value pooled como en el caso de hilo este optimizador trata de minimizar el n mero de hits a la base de datos Sin embargo aqu simplemente almacenamos el valor inicial para el siguiente grupo en la estructura de la base de datos en lugar de un valor secuencial en combinaci n con un algoritmo de agrupamiento en memoria Aqu increment_size ser refiere a los valores que provienen de la base de datos 5 1 7 composite id lt composite id name propertyName class ClassName mapped true false access field property ClassName gt node element name lt key property name propertyName type typename column column_name gt lt key many to one name propertyName class ClassName column column_name gt lt composite id gt Una tabla con clave compuesta se puede mapear con m ltiples propiedades de la clase como propiedades identificadoras El elemento lt composite id gt acepta los mapeos de propiedad lt key property gt y los mapeos lt key many to one gt COMO elementos hijos lt composite 1d gt lt key property name medicareNumber gt lt key property name dependent gt lt composite id gt 78 composite id La clase pe
377. s estrategias de transacci n por ejemplo para un servicio de transacci n CORBA Algunas funcionalidades en Hibernate por ejemplo el cach de segundo nivel las sesiones contextuales etc requieren acceso al TransactionManager de JTA en un entorno administrado En un servidor de aplicaciones tiene que especificar c mo Hibernate debe obtener una referencia al TransactionManager ya que J2EE no estandariza un s lo mecanismo Tabla 3 10 TransactionManagers de JTA Transaction Factory Servidor de Aplicaciones org hibernate transaction JBossTransactionManagerLookup JBoss org hibernate transaction WeblogicTransactionManagerLookup Weblogic org hibernate transaction WebSphereTransactionManagerLookup WebSphere org hibernate transaction WebSphereExtendedJTATransact ionLookWWebSphere 6 org hibernate transaction OrionTransactionManagerLookup Orion org hibernate transaction ResinTransactionManagerLookup Resin org hibernate transaction JOTMTransactionManagerLookup JOTM org hibernate transaction JOnASTransactionManagerLookup JOnAS org hibernate transaction JRun4TransactionManagerLookup JRun4 org hibernate transaction BESTransactionManagerLookup Borland ES 3 8 2 SessionFactory enlazado a JNDI Una sessionFactory de Hibernate vinculada a JNDI puede simplificar la b squeda de la f brica y la creaci n de nuevas Sessiones Sin embargo esto no se relaciona con un Datasource vinculado
378. s mecanismos LockMode WRITE se adquiere autom ticamente cuando Hibernate actualiza o inserta una fila LockMode UPGRADE Se puede ser adquirir bajo petici n expl cita del usuario usando SELECT FOR UPDATE en bases de datos que soporten esa sint xis LockMode UPGRADE_NOWAIT se puede adquirir bajo petici n expl cita del usuario usando un SELECT FOR UPDATE NOWAIT bajo Oracle 198 Modos de liberaci n de la conexi n LockMode READ se adquiere autom ticamente cuando Hibernate lee los datos bajo los niveles de aislamiento de lectura repetible o serializable Se puede readquirir por pedido expl cito del usuario LockMode NONE representa la ausencia de un bloqueo Todos los objetos se pasan a este modo de bloqueo al final de una Transaction Los objetos asociados con una sesi n por medio de una llamada a update O saveOrUpdate tambi n comienzan en este modo de bloqueo La petici n expl cita del usuario se expresa en una de las siguientes formas e Una llamada a Session load especificando un LockMode Una llamada a Session lock Una llamada a Query setLockMode Si se llama a Session load CON UPGRADE O UPGRADE_NOWAIT y el objeto pedido no ha sido cargado todav a por la sesi n el objeto es cargado usando SELECT FOR UPDATE Si se llama a load para un objeto que ya est cargado con un bloqueo menos restrictivo que el pedido Hibernate lla
379. s name from Payment as payment join payment currentStatus as status where payment status name lt gt PaymentStatus AWAITING_APPROVAL or payment statusChanges maxIndex payment statusChanges user lt CUrrTentUser group by status name status sortOrder order by status sortOrder La pr xima consulta utiliza la funci n isnu11 de MS SQL Server para devolver todas las cuentas y pagos a n no cancelados de la organizaci n a la que pertenece el usuario actual Se traduce como una consulta SQL con tres uniones interiores una uni n exterior y una subselecci n contra las tablas ACCOUNT PAYMENT PAYMENT_STATUS ACCOUNT_TYPE ORGANIZATION Y ORG_USER select account payment from Account as account left outer join account payments as payment where currentUser in elements account holder users and PaymentStatus UNPAID isNull payment currentStatus name PaymentStatus UNPAID order by account type sortOrder account accountNumber payment dueDate Para algunas bases de datos necesitar amos eliminar la subselecci n correlacionada select account payment from Account as account join account holder users as user left outer join account payments as payment where currentUser user and PaymentStatus UNPAID isNull payment currentStatus name PaymentStatus UNPAID order by account type sortOrder account accountNumber payment dueDate 229 Capitulo 15 HQL El lenguaje 15 15 Declaracio
380. s of the mapping file for associations and collections See Secci n 20 1 Estrategias de recuperaci n for more information from Cat as cat inner join fetch cat mate left join fetch cat kittens Usualmente no se necesita asign rsele un alias a una uni n de recuperaci n ya que los objetos asociados no se deben utilizar en la cl usula where ni en cualquier otra cl usula Los objetos asociados no se retornan directamente en los resultados de la consulta En cambio se pueden acceder por medio del objeto padre La nica raz n por la que necesitar amos un alias es si estamos uniendo recursivamente otra colecci n from Cat as cat inner join fetch cat mate left join fetch cat kittens child left join fetch child kittens La construcci n fet ch no puede utilizarse en consultas llamadas que usen iterate aunque se puede utilizar scro11 Fetch se debe usar junto con setMaxResults O setFirstResult ya que estas operaciones se basan en las filas de resultados las cuales usualmente contienen duplicados para la recuperaci n de colecci n temprana por lo tanto el n mero de filas no es lo que se esperar a Fetch no se debe usar junto con una condici n with improvisadas Es posible crear un producto cartesiano por medio de una recuperaci n por union m s de una colecci n en una consulta as que tenga cuidado en este caso La recuperaci n por uni n de m ltiples roles de colecci n tambi n da resultados a veces inesperados
381. s tipos de valor Por ejemplo puede que quiera persistir propiedades del tipo java lang BigInteger a columnas VARCHAR Hibernate no provee un tipo incorporado para esto Los tipos personalizados no est n limitados a mapear una propiedad o elemento de colecci n a una sola columna de tabla As por ejemplo podr a tener una propiedad Java getName setName de tipo java lang String que es persistida a las columnas FIRST_NAME INITIAL SURNAME Para implementar un tipo personalizado implemente org hibernate UserType 0 org hibernate CompositeUserType y declare las propiedades utilizando el nombre de clase completamente calificado del tipo Revise org hibernate test DoubleStringType para ver qu clases de cosas son posibles lt property name twoStrings type org hibernate test DoubleStringType gt lt column name first_string gt lt column name second_string gt lt property gt Observe el uso de etiquetas lt column gt para mapear una propiedad a multiples columnas Las interfaces CompositeUserType EnhancedUserType UserCollectionType y UserVersionType brindan soporte para usos m s especializados Incluso usted puede proporcionar par metros a un UserType en el archivo de mapeo Para hacer esto su UserType tiene que implementar la interfaz org hibernate usertype ParameterizedType Para brindar par metros a su tipo personalizado puede utilizar el elemento lt t ype gt en sus archivos de mapeo
382. s to other entities you would enable join fetching not only of the collection itself but also with this attribute on the lt many to many gt nested element unique optional enables the DDL generation of a unique constraint for the foreign key column This makes the association multiplicity effectively one to many not found optional defaults to exception specifies how foreign keys that reference missing rows will be handled ignore will treat a missing row as a null association ent ity name optional the entity name of the associated class as an alternative to class 0 0 0 property ref optional the name of a property of the associated class that is joined to this foreign key If not specified the primary key of the associated class is used Aqu tiene algunos ejemplos Un grupo de cadenas lt set name names table person_names gt lt key column person_id gt lt element column person_name type string gt lt set Un bag que contiene enteros con un orden de iteraci n determinado por el atributo order by lt bag name sizes table item_sizes order by size asc gt lt key column item_id gt lt element column size type integer gt lt bag gt Una lista de entidades en este caso una asociaci n muchos a muchos lt array name addresses table PersonAddress cascade persist gt lt key column personld gt lt list index column sortOrder gt lt many to
383. s to the next resolver The signature also identifies org hibernate exception JDBCConnectionException as possibly being thrown A JDBCConnectionException here is interpreted to imply a non transient aka non recoverable connection problem and is used to indicate an immediate stop to resolution attempts All other exceptions result in a warning and continuing on to the next resolver La parte divertida de estos resolvedores es que los usuarios tambi n pueden registrar sus propios resolvedores personalizados los cuales se procesar n antes de los inclu dos en Hibernate Esto puede llegar a ser til en un n mero de situaciones diferentes permite una f cil integraci n para la auto detecci n de dialectos m s all de los que se env an junto con Hibernate le permite especificar el uso de un dialecto personalizado cuando se reconoce una base de datos en particular etc Para registrar uno o m s resolvedores simplemente especifiquelos separados por comas o espacios usando la configuraci n hibernate dialect_resolvers consulte la constante DIALECT_RESOLVERS N org hibernate cfg Environment 26 4 Generaci n del identificador When considering portability between databases another important decision is selecting the identifier generation stratagy you want to use Originally Hibernate provided the native generator for this purpose which was intended to select between a sequence identity or table strategy depending
384. scalabilidad es el control de concurrencia optimista con versionamiento El chequeo de versi n utiliza n meros de versi n o sellos de fecha timestamps para detectar actualizaciones en conflicto y para prevenir la p rdida de actualizaciones Hibernate proporciona tres enfoques posibles de escribir c digo de aplicaci n que utilice concurrencia optimista Los casos de uso que mostramos se encuentran en el contexto de conversaciones largas pero el chequeo de versiones tiene adem s el beneficio de prevenir la p rdida de actualizaciones en transacciones individuales de la base de datos 12 3 1 Chequeo de versiones de la aplicaci n En una implementaci n que no tiene mucha ayuda de Hibernate cada interacci n con la base de datos ocurre en una nueva Session y el desarrollador es el responsable de recargar todas las intancias persistentes desde la base de datos antes de manipularlas Este enfoque fuerza a la aplicaci n a realizar su propio chequeo de versiones para asegurar el aislamiento de transacciones de conversaciones Este enfoque es el menos eficiente en t rminos de acceso a la base de datos Es el enfoque m s similar a los EJBs de entidad foo is an instance loaded by a previous Session session factory openSession Transaction t session beginTransaction int oldVersion foo getVersion session load foo foo getKey load the current state if oldVersion foo getVersion throw new StaleObjectStateExcept
385. sea como atributo o como CDATA lt filter def name myFilter condition abc gt kyz gt lt filter def gt lt filter def name myOtherFilter gt abc xyz lt filter def gt Esta condici n predeterminada se utilizar cuando se una el filtro a algo sin especificar una condici n Esto significa que usted le puede dar una condici n especifica como parte del anexo del filtro el cual substituye la condici n por defecto en ese caso en particular 257 258 Mapeo XML XML Mapping is an experimental feature in Hibernate 3 0 and is currently under active development 19 1 Trabajo con datos XML Hibernate le permite trabajar con datos XML persistentes en casi de la misma forma que trabaja con POJOs persistentes Un rbol XML analizado sem ticamente se puede considerar como otra manera de representar los datos relacionales a nivel de objetos en lugar de POJOs Hibernate soporta dom4j como API para manipular rboles XML Puede escribir consultas que recuperen rboles dom4j de la base de datos y puede tener cualquier modificaci n que realice al rbol sincronizada autom ticamente con la base de datos Incluso puede tomar un documento XML analizarlo sint cticamente utilizando dom4j y escribirlo a la base de datos con cualquiera de las operaciones b sicas de Hibernate persist saveOrUpdate merge delete replicate merge a n no est soportado Esta funcionalidad tiene muchas aplicaciones
386. selecci n de base de datos Es til si quiere tener una vista en vez de una tabla base Vea a continuaci n para obtener m s informaci n Bl abstract opcional Utilizado para marcar superclases abstractas en las jerarqu as E E lt union subclass gt Es perfectamente aceptable que la clase persistente mencionada sea una interfaz Puede declarar clases que implementan esa interfaz utilizando el elemento lt subclass gt Puede persistir cualquier clase interna est tica Debe especificar el nombre de la clase utilizando la forma est ndar por ejemplo e y Foo Bar Las clases inmutables mutable false no pueden ser actualizadas o borradas por la aplicaci n Esto le permite a Hibernate realizar ciertas optimizaciones menores de rendimiento El atributo opcional proxy activa la inicializaci n perezosa de instancias persistentes de la clase Hibernate inicialmente retornar proxies CGLIB que implementan la interfaz mencionada El objeto persistente real ser cargado cuando se invoque un m todo del proxy Vea Inicializaci n de colecciones y proxies a continuaci n Por polimorfismo impl cito se entiende que las instancias de la clase ser n devueltas por una consulta que mencione cualquier superclase o interfaz implementada o la clase misma y que las instancias de cualquier subclase de la clase ser n retornadas por una petici n que nombra a la clase misma Por polimorfismo expl cito se entiende que las instancias de la clas
387. shed persistent entity will only be read only if it was read only before refreshing persistent entities added by the application via Session persist Session save and Session update Session saveOrUpdate 11 1 3 Loading read only entities from an HQL query criteria Nota Entities of immutable classes are automatically loaded as read only If Session isDefaultReadOnly returns false the default when an HQL query or criteria executes then entities and proxies of mutable classes loaded by the query will not be read only You can override this behavior so that entities and proxies loaded by an HQL query or criteria are automatically made read only For an HQL query call Query setReadOnly true Query setReadOnly true must be called before Query list Query uniqueResult Query scroll Of Query iterate For an HQL criteria call 177 Cap tulo 11 Read only entities Criteria setReadOnly true Criteria setReadonly true must be called before Criteria list Criteria uniqueResult Of Criteria scroll Entities and proxies that exist in the session before being returned by an HQL query or criteria are not affected Uninitialized persistent collections returned by the query are not affected Later when the collection is initialized entities loaded into the session will be read only if Session isDefaultReadOnly returns true Using Query setReadOnly true Of Criteria setReadOn
388. siderados resultados escalares y no entidades en estado persistente Iterator results sess createQuery select cat color min cat birthdate count cat from Cat cat tgroup by iat coror alatat iterator while results hasNext Object row Object results next Color type Color row 0 i Date oldest Date row 1 Integer count Integer row 2 10 4 1 4 Ligado de par metros Los m todos en Query se proporcionan para enlazar valores a los par metros con nombre o par metros de estilo JDBC Al contrario de JDBC Hibernate numera los par metros desde cero Los par metros con nombre son identificadores de la forma name en la cadena de la consulta Las ventajas de los par metros con nombre son las siguientes los par metros con nombre son insensibles al orden en que aparecen en la cadena de consulta pueden aparecer m ltiples veces en la misma petici n son auto documentados named parameter preferred Query q sess createQuery from DomesticCat cat where cat name name gq SetSstring name Fritz Iterator cats q iterate positional parameter Query q sess createQuery from DomesticCat cat where cat name q setString 0 SEZ Iterator cats q iterate named parameter list 162 Ejecuci n de consultas List names new ArrayList names add Izi names add Fritz Query q sess createQuery from Do
389. sion actual List cats session createQuery from Cat as cat where cat birthdate lt setDate 0 date Last List mothers session createQuery select mother from Cat as cat join cat mother as mother where cat name setString 0 name Listo List kittens session createQuery from Cat as cat where cat mother setEntity 0 pk hise 5 Cat mother Cat session createQuery select cat mother from Cat as Cat where cat 2 setEntity 0 izi 160 Ejecuci n de consultas uniqueResult Query mothersWithKittens Cat session createQuery select mother from Cat as mother left join fetch mother kittens Set uniqueMothers new HashSet mothersWithKittens list Una consulta se ejecuta usualmente invocando a 1ist El resultado de la consulta ser cargado completamente dentro de una colecci n en memoria Las instancias de entidad recuperadas por una consulta se encuentran en estado persistente El m todo uniqueresult ofrece un atajo si sabe que su consulta retornar s lamente un objeto Las consultas que hacen uso de una recuperaci n temprana de colecciones usualmente retornan duplicados de los objetos ra z pero con sus colecciones inicializadas Puede filtrar estos duplicados a trav s de un set 10 4 1 1 Iteracion de resultados Ocasionalmente puede lograr un mejor rendimiento al ejecutar la consulta utilizando el m todo iterate Esto ocurrir usualmente si espera que
390. sistentes a la aplicaci n La arquitectura m nima hace que la aplicaci n proporcione sus propias conexiones JDBC y que administre sus propias transacciones Este enfoque utiliza un subgrupo m nimo de las APIs de Hibernate 27 Cap tulo 2 Arquitectura La arquitectura completa abstrae la aplicaci n de las APIs de JDBC JTA y permite que Hibernate se encargue de los detalles He aqu algunas definiciones de los objetos en los diagramas 28 Sinopsis SessionFactory org hibernate SessionFactory Un cach threadsafe inmutable de mapeos compilados para una sola base de datos Una f brica de Session y un cliente de ConnectionProvider SessionFactory puede mantener un cach opcional de segundo nivel de datos reusables entre transacciones a nivel de proceso o de cl ster Session org hibernate Session Un objeto mono hebra de corta vida que representa una conversaci n entre la aplicaci n y el almacenamiento persistente Envuelve una conexi n JDBC y es una f brica de Transaction Session mantiene un cach requerido de primer nivel de objetos persistentes que se utiliza cuando se navega el gr fico de objetos o mientras se buscan objetos por identificador Objetos y colecciones persistentes Objetos de corta vida mono hebra contienen un estado persistente as como una funcionalidad empresarial Estos pueden ser JavaBeans POJOs normales Estos se encuentran asociados con exactamente una Session Tan pr
391. sname aliasname molj element coll ey 17 1 5 Devolucion de entidades no administradas Es posible aplicar un ResultTransformer para consultas SQL nativas permiti ndole retornar entidades no administradas sess createSQLQuery SELECT NAME BIRTHDATE FROM CATS setResultTransformer Transformers aliasToBean CatDTO class Se especifica esta consulta la cadena de consulta SQL 245 Cap tulo 17 SQL Nativo un transformador de resultado La consulta anterior devolver una lista de catpTo a la cual se ha instanciado e inyectado los valores de NOMBRE y FECHA DE NACIMIENTO en su propiedades o campos correspondientes 17 1 6 Manejo de herencias Las consultas SQL nativas las cuales consultan por entidades que son mapeadas como parte de una herencia tienen que incluir todas las propiedades para la clase base y todas sus subclases 17 1 7 Par metros Las consultas SQL nativas soportan par metros nombrados as como posicionales Query query sess createSQLQuery SELECT FROM CATS WHERE NAME like addEntity Cat class List pusList query setString 0 Pus list query sess createSQLQuery SELECT FROM CATS WHERE NAME like name addEntity Cat class List pusList query setString name Pus list 17 2 Consultas SQL nombradas Las consultas SQL nombradas se pueden definir en el documento de mapeo y se pueden llamar de la misma manera que una consul
392. ssId not null true unique true gt lt join gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt Sto lt join table PersonAddress optional true inverse true gt lt key column addressld unique true gt 137 Cap tulo 7 Mapeos de asociaci n lt many to one name person column personld not null true unique true gt lt join gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personld bigint not null primary key addressId bigint not null unique create table Address addressId bigint not null primary key 7 5 3 Muchos a muchos Este es un ejemplo de una asociaci n bidireccional muchos a muchos lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt set name addresses table PersonAddress gt lt key column personld gt lt many to many column addressld class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressld gt lt generator class native gt lt id gt lt set name people inverse true table PersonAddress gt lt key column addressId gt lt many to many column personld class Person gt lt set gt elas gt create table Person personId bigint not null primary key create table
393. st name firstName from Customer as cust Las consultas pueden retornar m ltiples objetos y o propiedades como un array de tipo Object select mother offspr mate name from DomesticCat as mother inner join mother mate as mate left outer join mother kittens as offspr O como una List select new list mother offspr mate name from DomesticCat as mother inner join mother mate as mate left outer join mother kittens as offspr O asumiendo que la clase Family tiene un constructor apropiado como un objeto Java de tipo seguro select new Family mother mate offspr from DomesticCat as mother join mother mate as mate left join mother kittens as offspr 217 Cap tulo 15 HQL El lenguaje Puede asignar alias para expresiones seleccionadas utilizando as select max bodyWeight as max min bodyWeight as min count as n from Cat cat Esto es lo m s til cuando se usa junto con select new map select new map max bodyWeight as max min bodyWeight as min count as n from Cat Cat Esta consulta devuelve un Map de alias a valores seleccionados 15 7 Funciones de agregaci n Las consultas HQL pueden incluso retornar resultados de funciones de agregaci n sobre propiedades select avg cat weight sum cat weight max cat weight count cat from Cat cat Las funciones de agregaci n soportadas son avg sum Min maX count count count distinct c
394. sters No todos los Dialects soportan la recuperaci n del sello de fecha actual de la base de datos Los otros pueden ser poco seguros para utilizarlos como bloqueo debido a la falta de precisi n por ejemplo Oracle 8 generated opcional por defecto es never Especifica que este valor de la propiedad del sello de fecha en realidad es generado por la base de datos Consulte la discusi n de las propiedades generadas para obtener mayor informaci n Nota lt Timestamp gt eS equivalente a lt version type timestamp gt Y lt timestamp source db gt es equivalente a lt version type dbtimestamp gt 5 1 11 Propiedad El elemento lt property gt declara una propiedad persistente estilo JavaBean de la clase lt property name propertyName 82 Propiedad es column column_name type typename update true false insert true false formula arbitrary SQL expression access field property ClassName lazy tr e false unique true false not null truel false optimistic lock truelfalse 9400000000090 generated never insert always node element name attribute name element attribute index index_name unique_key unique_key_id length L precision P scales name el nombre de la propiedad con la letra inicial en min scula column opcional por defecto es el nombre de la propiedad El nombre de la columna de la tabla de base de datos mapeada Esto se puede especific
395. striction lower alias name like lower Fritz Hibernate STRING Lists El sitio alias ser remplazado por el alias de fila de la entidad consultada Tambi n puede obtener un criterio de una instancia Property Puede crear una Property llamando a Property forName Property age Property forName age List cats sess createCriteria Cat class add Restrictions disjunction add age isNull add age eq new Integer 0 add age eq new Integer 1 add age eq new Integer 2 ine add Property forName name int new String Fritz TIZ Pk O St 16 3 Orden de los resultados Puede ordenar los resultados usando org hibernate criterion Order List cats sess createCriteria Cat class add Restrictions like name F addOrder Order asc name addOrder Order desc age setMaxResults 50 ES AE List cats sess createCriteria Cat class add Property forName name like F addOrder Property forName name asc addOrder Property forName age desc setMaxResults 50 SA 234 Asociaciones 16 4 Asociaciones Al navegar asociaciones usando createCriteria puede especificar restricciones en entidades relacionadas List cats sess createCriteria Cat class add Restrictions like name FS CreateCriteria kittens add Restrictions like name F ASEO El segundo createCriteria retorna un
396. t 2370 34 lt balance gt lt account gt lt name gt lt first name gt Gavin lt first name gt lt initial gt AS ainie ral lt last name gt King lt last name gt lt name gt lt customer gt 19 3 Manipulaci n de datos XML Puede releer y actualizar documentos XML en la aplicaci n Puede hacer esto obteniendo una sesi n dom4j Document doo sses Session session factory openSession Session dom4jSession session getSession EntityMode DOM4J Transaction tx session beginTransaction List results dom4jSession 262 Manipulaci n de datos XML CreateQuery from Customer c left join fetch c accounts where PESE E for MINERA O e resul tsrs ize A il add the customer data to the XML document Element customer Element results get i doc add customer EX commit session close Session session factory openSession Session dom4jSession session getSession EntityMode DOM4J Transaction tx session beginTransaction j Element cust Element dom43jSession get Customer customerld for int i 0 i lt results size i itt 4 Element customer Element results get i change the customer name in the XML and database Element name customer element name name element first name setText firstName name element initial setText initial name element last name setText lastName tx commit session close c last
397. t float double character byte boolean yes_no true_false Mapeos de tipos de primitivos de Java o de clases de envoltura a los tipos de columna SQL espec fica del vendedor boolean yes_no y true_false son codificaciones alternativas a boolean de Java O java lang Boolean string Un mapeo del tipo java lang String a VARCHAR u Oracle VAARCHAR2 date time timestamp Mapeos de tipo desde java util Date y sus subclases a tipos SQL DATE TIME y TIMESTAMP o equivalente calendar calendar_date Mapeos de tipo desde java util Date y tipos SQL TIMESTAMP y DATE 0 equivalente big_decimal big_integer Mapeos de tipo desde java math BigDecimal y java math BigInteger A NUMERIC o NUMBER de Oracle locale timezone currency Mapeos de tipo desde java util Locale java util TimeZone Y java util Currency a VARCHAR O VARCHAR2 de Oracle Las instancias de Locale y Currency son mapeadas a sus c digos ISO Las instancias de TimeZone son mapeadas a sus ID class Un mapeo de tipo java lang Class a VARCHAR O VARCHAR2 de Oracle Una Class es mapeada a su nombre completamente calificado binary Mapea arreglos de bytes a un tipo binario SQL apropiado text Mapea cadenas largas de Java al tipo SQL cLos O T El XT serializable Mapea tipos serializables Java a un tipo binario SQL apropiado Tambi n puede indicar el tipo serializable de Hibernate con el nombre de una clase o interfaz serializa
398. t id gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null primary key addressId bigint not null unique create table Address addressId bigint not null primary key 7 3 4 Muchos a muchos Finalmente este es un ejemplo de una asociaci n unidireccional muchos a muchos lt class name Person gt lt id name id column personId gt lt generator class native gt lt a gt lt set name addresses table PersonAddress gt lt key column personld gt lt many to many column addressld class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressId gt 133 Cap tulo 7 Mapeos de asociaci n lt generator class native gt lt id gt lt class gt Create table Person personld bigint not null primary key create table PersonAddress personId bigint not null addressId bigint not null primary key personld addressId create table Address addressId bigint not null primary key 7 4 Asociaciones bidireccionales 7 4 1 uno a muchos muchos a uno Una asociaci n bidireccional muchos a uno es el tipo de asociaci n mas com n El siguiente ejemplo ilustra la relaci n est ndar padre hijo lt class name Person gt lt id name id column personld gt lt generator class native gt lt id gt lt many to one name address column
399. t sess load DomesticCat class new Long id Alternativamente puede cargar estado dentro de una instancia dada Cat cat new DomesticCat load pk s state into cat sess load cat new Long pkld Set kittens cat getKittens Note que load lanzar una excepci n irrecuperable si no hay una fila correspondiente en la base de datos Si la clase se mapea con un proxy load s lo retorna un proxy no inicializado y no llamar realmente a la base de datos hasta que invoque un m todo del proxy Este comportamiento es muy til si desea crear una asociaci n a un objeto sin cargarlo realmente de la base de datos Adem s permite que m ltiples instancias sean cargadas como un lote si se define batch size para el mapeo de la clase Si no tiene la certeza de que existe una fila correspondiente debe utilizar el m todo get que llama a la base de datos inmediatamente y devuelve nulo si no existe una fila correspondiente Cat cat Cat sess get Cat class id if cat null cat new Cat sess save cat id return cat Incluso puede cargar un objeto utilizando un SELECT FOR UPDATE de SQL usando un LockMode Consulte la documentaci n de la API para obtener m s informaci n Cat cat Cat sess get Cat class id LockMode UPGRADE 159 Cap tulo 10 Trabajo con objetos Ninguna instancia asociada o colecci n contenida es seleccionada para actualizacion FOR UPDATE a me
400. t idbag gt 143 Cap tulo 8 Mapeo de componentes Un caso especial de un elemento compuesto es un elemento compuesto con un elemento anidado lt many to one gt Este mapeo le permite mapear columnas extra de una tabla de asociaci n muchos a muchos a la clase del elemento compuesto La siguiente es una asociaci n muchos a muchos de Order a Item donde purchaseDate price y quantity son propiedades de la asociaci n lt class name eg Order n s gt lt set name purchasedltems table purchase_items lazy true gt lt key column order_id gt lt composite element class eg Purchase gt lt property name purchaseDate gt lt property name price gt lt property name quantity gt lt many to one name item class eg Item gt lt class attribute is optional gt lt composite element gt lt set gt lt class gt No puede haber una referencia a la compra del otro lado para la navegaci n bidireccional de la asociaci n Los componentes son tipos de valor y no permiten referencias compartidas Una sola Purchase puede estar en el conjunto de una Order pero no puede ser referenciada por el Item al mismo tiempo Incluso son posibles las asociaciones ternarias o cuaternarias etc lt class name eq Order gt lt set name purchasedltems table purchase_items lazy true gt lt key column order_id gt lt composite element class eg OrderLine gt lt many to one name purchaseDeta
401. t_id gt lt composite element gt ses lt class gt lt class name Product table products gt lt id name id gt lt generator class native gt lt td gt lt property name serialNumber gt lt class gt lt hibernate mapping gt customers orders line_items Y products tienen los datos de cliente orden ftem de l nea de orden y producto respectivamente Adem s line_items tambi n act a como una tabla de asociaci n enlazando rdenes con productos create table customers id BIGINT not null generated by default as identity name VARCHAR 255 primary key id create table orders id BIGINT not null generated by default as identity customer_id BIGINT date TIMESTAMP primary key id create table line_items line_number INTEGER not null order_id BIGINT not null product_id BIGINT quantity INTEGER primary key order_id line_number create table products id BIGINT not null generated by default as identity serialNumber VARCHAR 255 primary key id 314 Mapeos varios de ejemplo alter table orders add constraint ordersFKO foreign key customer_id references customers alter table line_items add constraint line_itemsFKO foreign key product_id references products alter table line_items add constraint line_itemsFK1 foreign key order_id references orders 24 4 Mapeos varios de ejemplo Estos ejemplos estan disponibles en la suite de pruebas de Hibernate All enc
402. ta HQL nombrada En este caso no necesitamos llamar a addEntity lt sql query name persons gt lt return alias person class eg Person gt SELECT person NAME AS person name person AGE AS person age person SEX AS person sex FROM PERSON person WHERE person NAME LIKE namePattern lt sql query gt List people sess getNamedQuery persons setString namePattern namePattern setMaxResults 50 RS AO El elemento lt return join gt se utiliza para unir asociaciones y el elemento lt load collection gt se usa para definir consultas las cuales dan inicio a colecciones lt sql query name personsWith gt lt return alias person class eg Person gt 246 Consultas SQL nombradas lt return join alias address property person mailingAddress gt SELECT person NAME AS person name person AGE AS person age person SEX AS person sex address STREET AS address street address CITY AS address city address STATE AS address state address ZIP AS address zip FROM PERSON person JOIN ADDRESS address ON person ID address PERSON_ID AND address TYPE MAILING WHERE person NAME LIKE namePattern lt sql query gt Una consulta SQL nombrada puede devolver un valor escalar Tiene que declarar el alias de la columna y el tipo de Hibernate utilizando el elemento lt return scalar gt lt sql query name mySqlQuery gt lt return scalar column name type string gt lt return
403. tancia esta reci n instanciada sin guardar distingui ndola de las instancias separadas que fueron guardadas o cargadas en una sesi n previa access opcional por defecto es property La estrategia que Hibernate debe utilizar para acceder al valor de la propiedad Si se omite el atributo name se asume que la clase no tiene propiedad identificadora 72 El atributo unsaved value Casi nunca se necesita en Hibernate3 Hay una declaraci n lt composite id gt opcional para permitir acceso a los datos heredados con claves compuestas Le disuadimos seriamente de su utilizaci n para cualquier otra cosa 5 1 4 1 Generador El elemento hijo opcional lt generator gt nombra una clase Java utilizada para generar identificadores nicos para instancias de la clase persistente De requerirse alg n par metro para configurar o inicializar la instancia del generador se pasa utilizando el elemento lt param gt lt id name id type long column cat_id gt lt generator class org hibernate id TableHiLoGenerator gt lt param name table gt uid_table lt param gt lt param name column gt next_hi_value_column lt param gt lt generator gt Jaia gt Todos los generadores implementan la interfaz org hibernate id IdentifierGenerator Esta es una interfaz muy simple Algunas aplicaciones pueden decidir brindar sus propias implementaciones especializadas Sin embargo Hibernate provee un rango de implementaciones ya incorp
404. tando el conjunto de resultados oooocooncccccnnccccnnonnccccnncnncnonnnnnnccnnnnncnnnnnns 233 16 3 Orden de los resultados oooocicccncoconococccconcnccnnnnnnnnccnnnncnnnnnnnnncnnnnncnnnnnnnanannnnnes 234 16 4 ASOCIACIONES cs foe ccc es cinc cil rana UENEN de a A AA ARA A TENNE 235 16 5 Recuperaci n din mica de asociaciones oooocccocononncccononnncnononnncnonannnnnnanancnnnns 236 16 6 Consultas ejemplo cintia aa A EA a O a tios 236 16 7 Proyecciones agregaci n y agrupamiento oooooocnccnccnccnnnonncnconcnnconononnancnncnnnnnns 237 16 8 Consultas y subconsultas separadas ooooooccccccnconcnonnoncnccnnnnccnn nomina cnn narco nn nnnnans 239 16 9 Consultas por identificador natural ooooonooncidnnnnicccononnconcnncnncnonnncnconnnnc cnn noni 240 17 SQL NatiVO ooo Rea ades 241 17 1 Uso de Una SQ QuerY iio 241 17 1 1 Consultas escalares oooocococonocnccnccnnonononnancnnnnncnnnnnnnancnncnnconnnnnnanenanancinns 241 17 1 2 Consultas de entidades oooccccccccccccconncoccnnconcnnnonncnccnncnncnnnnanancnnnannnnnns 242 17 1 3 Manejo de asociaciones y colecciones cooooocccccnnncccccnnnaccnononnccnnnnnancnnns 243 17 1 4 Devoluci n de entidades m ltiples ooooocccnnnnncoconnccccnncnncnononncaninnnnnnnnno 243 17 1 5 Devoluci n de entidades no adMinistradaS ooooicicnnnninnconncccinnnnccnnninnnnn 245 17 1 6 Manejo de herencias ccccoonccccccnnnnccccnnnnccconnnnnncnnnnncncnnnnnnnnnnnnnencnananans 246 VEAS
405. te no puede garantizar que el estado en memoria representa con exactitud el estado persistente Por ejemplo no utilice Session load para determinar si una instancia con el identificador dado existe en la base de datos en cambio use Session get o una consulta Prefiera una recuperaci n perezosa para las asociaciones No utilice con frecuencia la recuperaci n temprana Use proxies y colecciones perezosas para la mayor a de asociaciones a clases que probablemente no se encuentren en el cach de segundo nivel Para las asociaciones a clases en cach donde hay una probabilidad de acceso a cach extremadamente alta deshabilite expl citamente la recuperaci n temprana 322 usando lazy false Cuando la recuperaci n por uni n sea apropiada para un caso de uso en particular utilice una consulta con un left join fetch Use el patr n de sesi n abierta en vista o una fase de ensamblado disciplinada para evitar problemas con datos no recuperados Hibernate libera al desarrollador de escribir tediosos objetos de transferencia de datos DTO del ingl s Data Transfer Objects En una arquitectura tradicional de EJB los DTOs tienen un prop sito doble primero atacan el problema de que los beans de entidad no son serializables Segundo definen impl citamente una fase de ensamblado cuando se recuperan y se forman marshalling todos los datos a usar por la vista en los DTOs antes de devolver el control al nivel de presentaci n H
406. te y especificando los documentos de mapeo XML Si los archivos de mapeo est n en la ruta de clase utilice addResource Por ejemplo Configuration cfg new Configuration addResource Item hbm xml addResource Bid hbm xml Una manera opcional es especificar la clase mapeada y dejar que Hibernate encuentre el documento de mapeo por usted Configuration cfg new Configuration addClass org hibernate auction Item class addClass org hibernate auction Bid class Luego Hibernate buscar los archivos de mapeo llamados org hibernate auction Item hbm xml Y org hibernate auction Bid hbm xml en la ruta de clase Este enfoque elimina cualquier nombre de archivo establecido manualmente Una org hibernate cfg Configuration tambi n le permite especificar las propiedades de configuraci n Por ejemplo Configuration cfg new Configuration addClass org hibernate auction Item class addClass org hibernate auction Bid class setProperty hibernate dialect org hibernate dialect MySQLInnoDBDialect setProperty hibernate connection datasource java comp env jdbc test 33 Cap tulo 3 Configuraci n setProperty hibernate order_updates true Esta no es la nica manera de pasar propiedades de configuraci n a Hibernate Algunas opciones incluyen 1 Pasar una instancia de java util Properties a Configuration setProperties 2 Colocar un archivo llamado hibernate properties en un directo
407. teria Cat class crit add Restrictions eq color eg Color BLACK crit setMaxResults 10 List cata Crib List The Criteria and the associated Example API are discussed in more detail in Cap tulo 16 Consultas por criterios 10 4 4 Consultas en SQL nativo Puede expresar una consulta en SQL utilizando createSQLQuery y dejar que Hibernate administre el mapeo de los conjuntos de resultados a objetos Puede llamar en cualquier momento a session connection y utilizar la Connection JDBC directamente Si elige usar la API de Hibernate tiene que encerrar los alias de SQL entre llaves List cats session createSQLQuery SELECT cat FROM CAT cat WHERE ROWNUM lt 10 addEntity cat Cat class sl 0 165 Cap tulo 10 Trabajo con objetos List cats session createSQLQuery VSHELECLtcat ID AS cat idi Cat SEX AS cat Sexi t cat t MATE AS tcat matet ICat SUBCLASS AS fcac classy kes Tt FROM CAT cat WHERE ROWNUM lt 10 addEntity cat Cat class TSE SQL queries can contain named and positional parameters just like Hibernate queries More information about native SQL queries in Hibernate can be found in Cap tulo 17 SQL Nativo 10 5 Modificaci n de objetos persistentes Las instancias persistentes transaccionales por ejemplo los objetos cargados creados o consultados por la Session pueden ser manipulados por la aplicaci n y cualquier cambio al estado persistente ser persisti
408. tion design or if you prefer a step by step tutorial Also visit htto caveatemptor hibernate org and download the example application from JPwH 5 En el sitio web de Hibernate encontrara las respuestas a las preguntas mas frecuentes 6 Enel sitio web de Hibernate encontrara los enlaces a las demostraciones de terceros ejemplos y tutoriales 7 El area de la comunidad en el sitio web de Hibernate es un buen recurso para encontrar patrones de dise o y varias soluciones de integraci n Tomcat JBoss AS Struts EJB etc xi Prefacio Si tiene alguna pregunta dir jase al sitio web de Hibernate en donde encontrar un enlace al foro de usuarios Tambi n proporcionamos un sistema de localizaci n para reportes de errores JIRA y solicitud de funciones Si est interesado en el desarrollo de Hibernate nase a la lista de correo de los desarrolladores Si le interesa traducir esta documentaci n a su propio idioma cont ctenos en la lista de correo de los desarrolladores JBoss Inc proporciona soporte para desarrollo comercial soporte para producci n y entrenamiento vea http www hibernate org SupportTraining Hibernate es un proyecto de C digo Abierto Profesional y es un componente cr tico de la suite de productos de JBoss Enterprise Middleware System JEMS xii Tutorial Dirigido a los nuevos usuarios este cap tulo brinda una introducci n a Hibernate paso por paso empezando con una aplicaci n simple
409. tional one to one and many to one Unidirectional one to many yes Unidirectional many to many yes Secci n 11 2 2 2 Unidirectional one to many and many to many Bidirectional one to one only if the owning entity is not read only Secci n 11 2 3 1 Bidirectional one to one Bidirectional one to many many to one only added removed entities that are not read only inverse collection yes non inverse collection Secci n 11 2 3 2 Bidirectional one to many many to one Bidirectional many to many yes Secci n 11 2 3 3 Bidirectional many to many Behavior is different when the entity having the property association is read only compared to when it is not read only 11 2 1 Simple properties When a persistent object is read only Hibernate does not dirty check simple properties Hibernate will not synchronize simple property state changes to the database If you have automatic versioning Hibernate will not increment the version if any simple properties change Session session factory openSession Transaction tx session beginTransaction j get a contract and make it read only Contract contract Contract session get Contract class contractld session setReadOnly contract true contract getCustomerName is Sherman 180 Unidirectional associations contract setCustomerName Yogi tx commit tx session beginTransaction
410. true gt lt property name text not null true length 2000 lazy true gt lt class gt La carga perezosa de propiedades requiere la instrumentaci n del c digo byte en tiempo de construcci n Si sus clases persistentes no se mejoran Hibernate ignorar la configuraci n perezosa de propiedades y retornar a la recuperaci n inmediata Para la instrumentaci n del c digo byte utilice la siguiente tarea Ant lt target name instrument depends compile gt lt taskdef name instrument classname org hibernate tool instrument InstrumentTask gt lt classpath path jar path gt lt classpath path classes dir gt lt classpath refid lib class path gt lt taskdef gt lt instrument verbose true gt lt fileset dir testclasses dir org hibernate auction model gt lt include name class gt 274 El Cach de Segundo Nivel lt fileset gt lt instrument gt lt target gt Una forma diferente de evitar lecturas innecesarias de columnas al menos para transacciones de s lo lectura es utilizar las funcionalidades de proyecci n de consultas HQL o Criteria Esto evita la necesidad de procesar el c digo byte en tiempo de construcci n y ciertamente es la soluci n preferida Puede forzar la usual recuperaci n temprana de propiedades utilizando fetch all properties en HQL 20 2 El Cach de Segundo Nivel Una Session de Hibernate es un cach de datos persistentes a nivel d
411. tyType amp amp propertyTypes i isCollectionType namedValues put propertyNames i propertyValues i 173 174 Read only entities gt Importante Hibernate s treatment of read only entities may differ from what you may have encountered elsewhere Incorrect usage may cause unexpected results When an entity is read only Hibernate does not dirty check the entity s simple properties or single ended associations Hibernate will not update simple properties or updatable single ended associations e Hibernate will not update the version of the read only entity if only simple properties or single ended updatable associations are changed In some ways Hibernate treats read only entities the same as entities that are not read only e Hibernate cascades operations to associations as defined in the entity mapping e Hibernate updates the version if the entity has a collection with changes that dirties the entity A read only entity can be deleted Even if an entity is not read only its collection association can be affected if it contains a read only entity For details about the affect of read only entities on different property and association types see Secci n 11 2 Read only affect on property type For details about how to make entities read only see Secci n 11 1 Making persistent entities read only Hibernate does some optimizing for read only entities e It saves exe
412. uede decirle a Hibernate expl citamente qu alias de columnas se deben utilizar en vez de utilizar la sintaxis para dejar que Hibernate inyecte sus propios alias Por ejemplo lt sql query name mySqlQuery gt lt return alias person class eg Person gt lt return property name name column myName gt lt return property name age column myAge gt lt return property name sex column mySex gt lt return gt SELECT person NAME AS myName person AGE AS myAge person SEX AS mySex FROM PERSON person WHERE person NAME LIKE name lt sql query gt lt return propert y gt tambi n funciona con columnas m ltiples Esto resuelve una limitaci n con la sintaxis la cual no puede permitir control muy detallado de propiedades multi columnas lt sql query name organizationCurrentEmployments gt lt return alias emp class Employment gt lt return property name salary gt lt return column name VALUE gt lt return column name CURRENCY gt lt return property gt lt return property name endDate column myEndDate gt lt return gt SELECT EMPLOYEE AS emp employee EMPLOYER AS emp employer STARTDATE AS emp startDate ENDDATE AS emp endDate REGIONCODE as emp regionCode EID AS emp id VALUE CURRENCY FROM EMPLOYMENT WHERE EMPLOYER id AND ENDDATE IS NULL ORDER BY STARTDATE ASC lt sql query gt 248 Utilizaci n de procedimientos para consultas En este ejemplo utilizamos
413. uellas aplicaciones centralizadas en datos que s lamente utilizan los procedimientos almacenados para implementar la l gica empresarial en la base de datos Hibernate es mucho m s til con modelos de dominio orientados a objetos y con l gica empresarial middle tier con base en Java Sin embargo Hibernate ciertamente le puede ayudar a eliminar o a encapsular c digo SQL espec fico del vendedor y le ayudar con la tarea com n de traducci n del grupo de resultados desde una representaci n tabular a un grafo de objetos Si usted es nuevo en el tema de Hibernate y del Mapeo Objeto Relacional o inclusive en Java por favor siga los siguientes pasos 1 Read Cap tulo 1 Tutorial for a tutorial with step by step instructions The source code for the tutorial is included in the distribution in the doc reference tutorial directory 2 Read Cap tulo 2 Arquitectura to understand the environments where Hibernate can be used 3 D le un vistazo al directorio eg en la distribuci n de Hibernate Este comprende una aplicaci n aut noma simple Copie su compilador JDBC al directorio 1ib y edite etc hibernate properties especificando los valores correctos para su base de datos Desde un int rprete de comandos en el directorio de la distribuci n escriba ant eg utilizando Ant o bajo Windows escriba build eg 4 Use this reference documentation as your primary source of information Consider reading JPwH if you need more help with applica
414. uerido utilice una asociaci n bidireccional uno a muchos lt hibernate mapping gt lt class name Parent gt lt id name id gt lt generator class sequence gt Jad lt set name children inverse true gt lt key column parent_id gt lt one to many class Child gt lt set gt lt class gt 125 Cap tulo 6 Mapeos de colecci n lt class name Child gt lt id name id gt lt generator class sequence gt lt id gt lt property name name gt lt many to one name parent class Parent column parent_id not null true gt lt class gt lt hibernate mapping gt Observe la restricci n NOT NULL create table parent id bigint not null primary key create table child id bigint not null primary key name varchar 255 parent_id bigint not null alter table child add constraint childfk0 parent_id references parent Opcionalmente si esta asociaci n debe ser unidireccional puede declarar la restricci n NoT NULL en el mapeo de lt key gt lt hibernate mapping gt lt class name Parent gt lt id name id gt lt generator class sequence gt lt id gt lt set name children gt lt key column parent_id not null true gt lt one to many class Child gt lt set gt lt class gt lt class name Child gt lt id name id gt lt generator class sequence gt lt id gt lt property name name gt lt class gt lt hibe
415. ueta lt element gt por una etiqueta lt composite element gt lt set name someNames table some_names lazy true gt lt key column id gt lt composite element class eg Name Pa Clos Smabe rl Outer required gt lt property name initial gt lt property name first gt lt property name last gt lt composite element gt lt set gt gt Importante Si define un set de elementos compuestos es muy importante implementar equals Y hashCode de manera correcta Los elementos compuestos pueden contener componentes pero no colecciones Si su elemento compuesto contiene a su vez componentes use la etiqueta lt nested composite element gt Este es un caso de una colecci n de componentes que a su vez tienen componentes Se debe estar preguntando si una asociaci n uno a muchos es m s apropiada Remodele el elemento compuesto como una entidad pero observe que aunque el modelo Java es el mismo el modelo relacional y la sem ntica de persistencia siguen siendo ligeramente diferentes Un mapeo de elemento compuesto no soporta propiedades nulables si est utilizando un lt set gt No hay una columna clave principal separada en la tabla del elemento compuesto Hibernate utiliza el valor de cada columna para identificar un registro al borrar objetos lo cual es imposible con valores nulos Tiene que usar s lo propiedades no nulas en un elemento compuesto o elegir un lt list gt lt map gt lt bag gt O l
416. uiere utilizar Proxool refi rase a hibernate properties inclu do en el paquete y al sitio web de Hibernate para obtener m s informaci n Aqu hay un archivo hibernate properties de ejemplo para c3p0 hibernate connection driver_class org postgresql Driver hibernate connection url jdbc postgresql localhost mydatabase hibernate connection username myuser hibernate connection password secret hibernate c3p0 min_size 5 hibernate c3p0 max_size 20 hibernate c3p0 timeout 1800 hibernate c3p0 max_statements 50 hibernate dialect org hibernate dialect PostgreSQLDialect Para su utilizaci n dentro de un servidor de aplicaciones casi siempre usted debe configurar Hibernate para obtener conexiones de un javax sql Datasource del servidor de aplicaciones registrado en JNDI Necesitar establecer al menos una de las siguientes propiedades Tabla 3 2 Propiedades de la Fuente de Datos de Hibernate Nombre de la propiedad l Prop sito hibernate connection datasource datasource JNDI name hibernate jndi url URL del proveedor JNDI opcional hibernate jndi class clase del JNDI nitialContextFactory opcional 35 Cap tulo 3 Configuraci n Nombre de la propiedad Prop sito hibernate connection username usuario de la base de datos opcional hibernate connection password contrase a del usuario de la base de datos opcional He aqui un archivo hibernate properties de ejemplo para una fuente de d
417. una uni n de tablas Tambi n se pueden utilizar las propiedades de identificadores compuestos Considere el siguiente ejemplo en donde Person tiene identificadores compuestos que consisten de country y medicareNumber from bank Person person where person id country AU and person id medicareNumber 123456 220 Expresiones from bank Account account where account owner id country AU and account owner id medicareNumber 123456 Una vez m s la segunda consulta no requiere una uni n de tablas See Secci n 15 5 Referencia a la propiedad identificadora for more information regarding referencing identifier properties La propiedad especial class acccede al valor discriminador de una instancia en el caso de persistencia polim rfica Un nombre de clase Java inclu do en la cl usula where ser traducido a su valor discriminador from Cat cat where cat class DomesticCat You can also use components or composite user types or properties of said component types See Secci n 15 17 Componentes for more information Un tipo any tiene las propiedades especiales id y class permit ndole expresar una uni n de la siguiente forma en donde AuditLog item es una propiedad mapeada con lt any gt from AuditLog log Payment payment where log item class Payment and log item id payment id La log item class Y payment class har an referencia a los valores de columnas de la base de datos complet
418. ura Las entidades deben ser guardadas y borradas expl citamente Sin embargo los grabados y borrados se pueden tratar en cascada desde una entidad padre a sus hijos Esto es diferente al modelo de persistencia de objetos por alcance ODMG y corresponde m s a c mo se utilizan habitualmente los objetos de aplicaci n en sistemas grandes Las entidades soportan referencias circulares y compartidas que tambi n pueden ser versionadas El estado persistente de una entidad consta de las referencias a otras entidades e instancias de tipo valor Los valores son primitivos colecciones no lo que est dentro de la colecci n componentes y ciertos objetos inmutables A diferencia de las entidades los valores en particular las colecciones y los componentes son persistidos y borrados por alcance Como los objetos valor y primitivos son persistidos y borrados junto con sus entidades contenedoras no se pueden versionar independientemente Los valores no tienen identidad independiente por lo que dos entidades o colleciones no los pueden compartir Hasta ahora hemos estado utilizando el t rmino clase persistente para referirnos a entidades Continuaremos haci ndolo as Sin embargo no todas la clases con estado persistente definidas por el usuario son entidades Un componente es una clase definida por el usuario con sem ntica de valor Una propiedad Java de tipo java lang String tambi n tiene sem ntica de valor Dada esta definici n podemos decir
419. usando una base de datos en memoria Este tutorial se basa en un tutorial anterior que Michael Gloegl desarroll Todo el c digo se encuentra en el directorio tutorials web de la fuente del proyecto Importante Este tutorial se basa en que el usuario tenga conocimiento de Java y SQL Si tiene un conocimiento muy limitado de JAVA o SQL le aconsejamos que empiece con una buena introducci n a esta tecnolog a antes de tratar de aprender sobre Hibernate Nota La distribuci n contiene otra aplicaci n de ejemplo bajo el directorio fuente del proyecto tutorial eg 1 1 Parte 1 La primera aplicaci n Hibernate Para este ejemplo vamos a configurar una aplicaci n base de datos peque a que pueda almacenar eventos a los que queremos asistir e informaci n sobre los anfitriones de estos eventos Nota Aunque puede utilizar cualquier base de datos con la que se sienta bien vamos a usar http hsqldb org una base de datos Java en memoria para evitar describir la instalaci n configuraci n de cualquier servidor de base de datos en particular 1 1 1 Configuraci n Lo primero que tenemos que hacer es configurar el entorno de desarrollo Vamos a utilizar el dise o est ndar apoyado por muchas herramientas de construcci n tal como Maven http maven org Maven en particular tiene un buen recurso que describe este dise o http maven apache org guides introduction introduction to the standard directory layout html Co
420. uso cuando puede ser f cilmente mapeada como un componente Un raz n para esto es la abstracci n Con un tipo personalizado sus documentos de mapeo estar n protegidos contra posibles cambios futuros en la forma de representar valores monetarios 5 3 Mapeo de una clase m s de una vez Es posible proporcionar m s de un mapeo para una clase persistente en particular En este caso usted debe especificar un nombre de entidad para aclarar entre las instancias de las dos entidades mapeadas Por defecto el nombre de la entidad es el mismo que el nombre de la clase Hibernate le deja especificar el nombre de entidad al trabajar con objetos persistentes al escribir consultas o al mapear asociaciones a la entidad mencionada lt class name Contract table Contracts 103 Cap tulo 5 Mapeo O R B sico entity name CurrentContract gt lt set name history inverse true order by effectiveEndDate desc gt lt key column currentContractld gt lt one to many entity name HistoricalContract gt lt set gt lt class gt lt class name Contract table ContractHistory entity name HistoricalContract gt lt many to one name currentContract columna current Contract lds entity name CurrentContract gt lt class gt Las asociaciones ahora se especifican utilizando entity name en lugar de class 5 4 Identificadores SQL en comillas Puede forzar a Hibernate a que utilice comillas con un identificador en
421. void setId Long id this id id AA hibernate many to one column PARENT_ID A public Cat getMother return mother void setMother Cat mother this mother mother Ak hibernate property column BIRTH_DATE Es public Date getBirthdate 1 return birthdate void setBirthdate Date date birthdate date hibernate property column WEIGHT 3 public float getWeight return weight J void setWeight float weight this weight weight JA 105 Cap tulo 5 Mapeo O R B sico hibernate property column COLOR NoE NUS aus E public Color getColor return color void setColor Color color this color color Je hibernate set inverse true order by BIRTH_DATE hibernate collection key column PARENT_ID hibernate collection one to many e public Set getKittens return kittens void setKittens Set kittens this kittens kittens addKitten not needed by Hibernate public void addKitten Cat kitten kittens add kitten hibernate property column SEX not null true amp ppdate false A public char getSex return sex void setSex char sex this sex sex Para obtener m s ejemplos de XDoclet e Hibernate consulte el sitio web de Hibernate 5 5 2 Utlizaci n de Anotaciones JDK 5 0 JDK 5 0 introdujo anotaciones del estilo XDoclet a nivel del lenguaje con chequeo seguro de tipos
422. wChild new Child parent addChild newChild session update parent session flush Todo eso es apropiado para el caso de un identificador generado pero qu de los identificadores asignados y de los identificadores compuestos Esto es m s dif cil ya que Hibernate no puede usar la propiedad identificadora para distinguir entre un objeto reci n instanciado con un identificador asignado por el usuario y un objeto cargado en una sesi n previa En este caso Hibernate utilizar la propiedad de versi n o sello de fecha o bien consultar realmente el cach de segundo nivel o bien en el peor de los casos consultar la base de datos para ver si la fila existe 22 5 Conclusi n Las secciones que acabamos de cubrir pueden parecer un poco confusas Sin embargo en la pr ctica todo funciona muy bien La mayor a de las aplicaciones de Hibernate utilizan el patr n padre hijo en muchos sitios Mencionamos una opci n en el primer p rrafo Ninguno de los temas anteriores existe en el caso de los mapeos lt composite element gt los cuales tienen exactamente la sem ntica de una relaci n padre hijo Desafortunadamente existen dos grandes limitaciones para las clases de elementos compuestos los elementos compuestos no pueden poseer sus propias colecciones y no deben ser el hijo de cualquier otra entidad que no sea su padre nico 299 300 Ejemplo Aplicaci n de Weblog 23 1 Clases Persistentes
423. xt_class define cuales implementaciones org hibernate context CurrentSessionContext deben utilizarse Para compatibilidad con versiones anteriores si este par metro de configuraci n no est establecido pero si tiene configurado un org hibernate transaction TransactionManagerLookup Hibernate utilizar el org hibernate context JTASessionContext Usualmente el valor de este par metro s lamente nombrar a la clase de implementaci n a utilizar Sin embargo para las tres implementaciones inclu das existen tress nombres cortos jta thread y managed 32 Configuraci n Hibernate est dise ado para operar en muchos entornos diferentes y por lo tanto hay un gran n mero de par metros de configuraci n Afortunadamente la mayor a tiene valores predeterminados sensibles y Hibernate se distribuye con un archivo hibernate properties de ejemplo en etc que muestra las diversas opciones Simplemente ponga el fichero de ejemplo en su ruta de clase y personal celo de acuerdo a sus necesidades 3 1 Configuraci n program tica Una instancia de org hibernate cfg Configuration representa un conjunto entero de mapeos de los tipos Java de una aplicaci n a una base de datos SQL La org hibernate cfg Configuration se utiliza para construir una org hibernate SessionFactory inmutable Los mapeos se compilan desde varios archivos de mapeo XML Puede obtener una instancia de org hibernate cfg Configuration instanciandola directamen
424. y gt lt l Hibernate mses silt4y for logging for our purposes here use the simple backend gt lt dependency gt lt groupld gt org s1f43 lt groupId gt lt artifactld gt slf4j simple lt artifactId gt lt dependency gt lt Hibernate gives you a choice of bytecode providers between cglib and javassist gt lt dependency gt lt groupld gt Javassist lt groupld gt lt artiftactrd gt javassist lt artifactId gt La primera clase lt dependency gt lt dependencies gt lt project gt Sugerencia It is not a requirement to use Maven If you wish to use something else to build this tutorial such as Ant the layout will remain the same The only change is that you will need to manually account for all the needed dependencies lf you use something like vy http ant apache org ivy providing transitive dependency management you would still use the dependencies mentioned below Otherwise you d need to grab all dependencies both explicit and transitive and add them to the project s classpath If working from the Hibernate distribution bundle this would mean hibernate3 jar all artifacts in the 1ib required directory and all files from either the 1ib bytecode cglib OF 1ib bytecode javassist directory additionally you will need both the servlet api jar and one of the slf4j logging backends Guarde este archivo como pom xm1 en el directorio raiz del proyecto 1 1 2 La primera clase
425. y has no impact on a bidirectional one to many many to one association if e the read only entity is on the one to many side using an inverse collection e the read only entity is on the one to many side using a non inverse collection e the one to many side uses a non inverse collection that contains the read only entity When the one to many side uses an inverse collection aread only entity can only be added to the collection when it is created a read only entity can only be removed from the collection by an orphan delete or by explicitly deleting the entity 11 2 3 3 Bidirectional many to many Hibernate treats bidirectional many to many associations owned by a read only entity the same as when owned by an entity that is not read only 183 Cap tulo 11 Read only entities Hibernate dirty checks bidirectional many to many associations The collection on either side of the association can contain entities that are read only as well as entities that are not read only Entities are added and removed from both sides of the collection changes are flushed to the database If automatic versioning is used Hibernate will update the version due to changes in both sides of the collection if they dirty the entity owning the respective collections 184 Transacciones y concurrencia El punto m s importante sobre Hibernate y el control de concurrencia es que es f cil de comprender Hibernate usa directamente conexio
426. y tres tablas involucradas Cada tabla define columnas para todas las propiedades de la clase incluyendo las propiedades heredadas 152 Tabla por clase concreta utilizando polimorfismo impl cito La limitaci n de este enfoque es que si una propiedad se mapea en la superclase el nombre de la columna debe ser el mismo en todas las tablas de subclase La estrategia del generador de identidad no est permitida en la herencia de uni n de subclase La semilla de la clave principal tiene que compartirse a trav s de todas las subclases unidas de una jerarqu a Si su superclase es abstracta mape la con abstract true Si no es abstracta se necesita una tabla adicional en el ejemplo anterior por defecto es PAYMENT para mantener las instancias de la superclase 9 1 6 Tabla por clase concreta utilizando polimorfismo impl cito Un enfoque alternativo es para hacer uso del polimorfismo impl cito lt class name CreditCardPayment table CREDIT_PAYMENT gt lt id name id type long column CREDIT_PAYMENT_ID gt lt generator class native gt lt id gt lt property name amount column CREDIT_AMOUNT gt lt class gt lt class name CashPayment table CASH_PAYMENT gt lt id name id type long column CASH_PAYMENT_ID gt lt generator class native gt lt id gt lt property name amount column CASH_AMOUNT gt lt class gt lt class name ChequePayment table CHEQUE_PAYMENT gt lt id n
427. ype gt lt listener class gt lt event gt cuando hay exactamente un escucha para un tipo de evento en particular A continuaci n todav a en hibernate cfg xm1 enlace los permisos a los roles lt grant role admin entity name User actions insert update read gt lt grant role su entity name User actions gt Los nombres de los roles son comprendidos por su proveedor de JACC 205 206 Procesamiento por lotes Un enfoque ingenuo para insertar 100 000 filas en la base de datos utilizando Hibernate puede verse as Session session sessionFactory openSession Transaction tx session beginTransaction for ited O 1 lt 100000 ift f Customer customer new Customer We session save customer tx commit session close Esto podr a caer dentro de una OutOfMemoryException en alg n sitio cerca de la fila 50 000 Esto se debe a que Hibernate tiene en cach todas las instancias de Customer reci n insertadas en el cach de nivel de sesi n En este cap tulo le vamos a mostrar c mo evitar este problema Si est realizando un procesamiento por lotes batch processing es necesario que habilite el uso del lote JDBC Esto es esencial si quiere lograr un rendimiento ptimo Establezca el tama o de lote JDBC con un n mero razonable por ejemplo 10 50 hibernate jdbc batch_size 20 Hibernate desactiva el lote de inserci n a nivel de JDBC de forma transparente

Download Pdf Manuals

image

Related Search

Related Contents

HARPS-N Operation Guide - Telescopio Nazionale Galileo  Faça o do manual  NHA6 Service Manual  Ecrire au cycle 2 et au cycle 3  Télécharger les détails du produit Taille du fichier : : 1.3 MB  Samsung 19'' LN19D450G1DXZX Serie 4 1366 x 768 LCD TV Manual de Usuario  Hotpoint HMB313I Refrigerator User Manual    Models - Hayward  Jet Tools DC-1200C User's Manual  

Copyright © All rights reserved.
Failed to retrieve file