Manual Completo de Hibernate

Embed Size (px)

Citation preview

  • 7/21/2019 Manual Completo de Hibernate

    1/411

    HIBERNATE - Persistenciarelacional para Java idiomtico

    1

    Documentacin de

    referencia de Hibernate3.6.3.Final

    por Gavin King, Christian Bauer, Max Rydahl Andersen,Emmanuel Bernard, Steve Ebersole, y Hardy Ferentschik

    and thanks to James Cobb (Graphic Design), Cheyenne Weaver(Graphic Design), y Bernardo Antonio Buffa Colom

  • 7/21/2019 Manual Completo de Hibernate

    2/411

  • 7/21/2019 Manual Completo de Hibernate

    3/411

    iii

    Prefacio ............................................................................................................................ xi1. Tutorial ........................................................................................................................ 1

    1.1. Parte 1 - La primera aplicacin Hibernate ........ ......... ........ ........ ........ ......... ........ .. 11.1.1. Configuracin ........................................................................................... 11.1.2. La primera clase ...................................................................................... 31.1.3. El archivo de mapeo ........ ......... ........ ........ ........ ........ ......... ........ ........ ...... 41.1.4. Configuracin de Hibernate ...................................................................... 71.1.5. Construccin con Maven .......................................................................... 91.1.6. Inicio y ayudantes .................................................................................. 101.1.7. Carga y almacenamiento de objetos ....... ................................................. 11

    1.2. Part 2 - Mapeo deasociaciones ........................................................................ 141.2.1. Mapeo de la clase Person ...................................................................... 141.2.2. Una asociacin unidireccional basada en Set ...... ........ ............................. 151.2.3. Trabajo de la asociacin ......................................................................... 161.2.4. Coleccin de valores .............................................................................. 181.2.5. Asociaciones bidireccionales ................................................................... 191.2.6. Trabajo con enlaces bidireccionales ........................................................ 20

    1.3. Part 3 - La aplicacin web EventManager .......................................................... 211.3.1. Escritura de un servlet bsico ................................................................. 211.3.2. Procesamiento y entrega ........................................................................ 231.3.3. Despliegue y prueba .............................................................................. 24

    1.4. Resumen .......................................................................................................... 252. Arquitectura ............................................................................................................... 27

    2.1. Sinopsis ........................................................................................................... 272.1.1. Minimal architecture ............................................................................... 272.1.2. Comprehensive architecture .................................................................... 282.1.3. Basic APIs ............................................................................................. 29

    2.2. Integracin JMX ................................................................................................ 302.3. Sesiones contextuales ....................................................................................... 30

    3. Configuracin ............................................................................................................ 333.1. Configuracin programtica ............................................................................... 333.2. Obtencin de una SessionFactory ..................................................................... 343.3. Conexiones JDBC ............................................................................................. 343.4. Parmetros de configuracin opcionales ............................................................ 36

    3.4.1. Dialectos de SQL ................................................................................... 443.4.2. Recuperacin por Unin Externa - Outer Join Fetching ............................. 453.4.3. Flujos Binarios ....................................................................................... 463.4.4. Cach de segundo nivel y de lectura ....................................................... 463.4.5. Sustitucin de Lenguaje de Consulta ....................................................... 463.4.6. Estadsticas de Hibernate ....................................................................... 46

    3.5. Registros de mensa jes (Logging) ..... .... .... .... .... ........... ....................................... 473.6. Implementacin deuna NamingStrategy ............................................................ 473.7. Implementing a PersisterClassProvider ......... ........ ............................................. 483.8. Archivo de configuracin XML ........................................................................... 49

  • 7/21/2019 Manual Completo de Hibernate

    4/411

    HIBERNATE - Persistencia rela...

    iv

    3.9. Java EE Application Server integration ............................................................... 503.9.1. Configuracin de la estrategia de transaccin ............ ........ ......... ........ ..... 503.9.2. SessionFactory enlazado a JNDI ........ ........ ........ ......... ........ ........ ........ ... 523.9.3. Administracin de contexto de Sesin Actual con JTA ............ ........ ........ .. 523.9.4. Despliegue JMX ..................................................................................... 53

    4. Clases persistentes ................................................................................................... 554.1. Ejemplo simple dePOJO .................................................................................. 55

    4.1.1. Implementeun constructor sin argumentos .............................................. 564.1.2. Provide an identifier property ........ .......................................................... 574.1.3. Prefernon-final classes (semi-optional) ................................................... 574.1.4. Declare mtodos de acceso y de modificacin para los campospersistentes (opcional) ..................................................................................... 58

    4.2. Implementacin de herencia .............................................................................. 584.3. Implementando equals() y hashCode() ............................................................... 594.4. Modelos dinmicos ........................................................................................... 604.5. Tuplizers .......................................................................................................... 624.6. EntityNameResolvers ........................................................................................ 63

    5. Mapeo O/R Bsico ..................................................................................................... 675.1. Declaracin de mapeo ...................................................................................... 67

    5.1.1. Entity ..................................................................................................... 705.1.2. Identifiers ............................................................................................... 755.1.3. Optimistic locking properties (optional) ..................................................... 945.1.4. Propiedad .............................................................................................. 975.1.5. Embedded objects (aka components) .................................................... 1065.1.6. Inheritance strategy .............................................................................. 1095.1.7. Mapping one to one and one to many associations ................................. 1205.1.8. Natural-id ............................................................................................. 1295.1.9. Any ...................................................................................................... 1305.1.10. Propiedades ....................................................................................... 1325.1.11. Some hbm.xml specificities................................................................. 134

    5.2. Tipos de Hibernate.......................................................................................... 1385.2.1. Entidades y Valores ............................................................................. 1385.2.2. Tipos de valores bsicos ...................................................................... 1395.2.3. Tipos de valor personalizados ............................................................... 141

    5.3. Mapeo de una clase ms de una vez ............................................................... 1425.4. Identificadores SQL en comillas ....................................................................... 1435.5. Propiedades generadas ................................................................................... 1435.6. Column transformers: read and write expressions ............................................. 1445.7. Objetos de bases de datos auxiliares ............................................................... 145

    6. Types ....................................................................................................................... 1476.1. Value types .................................................................................................... 147

    6.1.1. Basic valuetypes ................................................................................. 1476.1.2. Composite types .................................................................................. 1536.1.3. Collection types .................................................................................... 153

  • 7/21/2019 Manual Completo de Hibernate

    5/411

    v

    6.2. Entity types ..................................................................................................... 1546.3. Significance of type categories ......................................................................... 1546.4. Custom types .................................................................................................. 154

    6.4.1. Custom types using org.hibernate.type.Type ......... ........ ........ ........ ......... 1546.4.2. Custom types using org.hibernate.usertype.UserType ........... ........ ......... . 1566.4.3. Custom types using org.hibernate.usertype.CompositeUserType ...... ....... 157

    6.5. Type registry ................................................................................................... 1597. Mapeos de colecci n ............................................................................................... 161

    7.1. Colecciones persistentes ................................................................................. 1617.2. How to map collections ................................................................................... 162

    7.2.1. Claves forneas de coleccin................................................................ 1667.2.2. Colecciones indexadas ......................................................................... 1677.2.3. Collections of basic types and embeddable objects ................................. 172

    7.3. Mapeos de coleccin avanzados ..................................................................... 1747.3.1. Coleccionesordenadas ......................................................................... 1747.3.2. Asociaciones bidireccionales ................................................................. 1767.3.3. Asociaciones bidireccionales con colecciones indexadas ......................... 1817.3.4. Asociaciones ternarias .......................................................................... 1827.3.5. Using an ................................................................................. 182

    7.4. Ejemplos de coleccin ..................................................................................... 1838. Mapeos de asociacin ............................................................................................. 189

    8.1. Introduccin .................................................................................................... 1898.2. Asociaciones Unidireccionales ......................................................................... 189

    8.2.1. Many-to-one ......................................................................................... 1898.2.2. Uno-a-uno ............................................................................................ 1908.2.3. Uno-a-muchos ...................................................................................... 191

    8.3. Asociaciones unidireccionales con tablas de unin ............................................ 1918.3.1. Uno-a-muchos ...................................................................................... 1918.3.2. Many-to-one ......................................................................................... 1928.3.3. Uno-a-uno ............................................................................................ 1938.3.4. Muchos-a-muchos ................................................................................ 193

    8.4. Asociaciones bidireccionales ............................................................................ 1948.4.1. uno-a-muchos / muchos-a-uno .............................................................. 1948.4.2. Uno-a-uno ............................................................................................ 195

    8.5. Asociaciones bidireccionales con tablas de unin .............................................. 1968.5.1. uno-a-muchos / muchos-a-uno .............................................................. 1968.5.2. uno a uno ............................................................................................ 1978.5.3. Muchos-a-muchos ................................................................................ 198

    8.6. Mapeos de asociacin ms complejos ............................................................. 1999. Mapeo de componentes ........................................................................................... 201

    9.1. Objetos dependientes ...................................................................................... 2019.2. Colecciones de objetos dependientes ..... .......................................................... 2039.3. Componentes como ndices de Mapeo ............................................................. 2049.4. Componentescomo identificadores compuestos ............................................... 205

  • 7/21/2019 Manual Completo de Hibernate

    6/411

    HIBERNATE - Persistencia rela...

    vi

    9.5. Componentes dinmicos ................................................................................. 20710. Mapeo de herencias ............................................................................................... 209

    10.1. Las tres estrategias ....................................................................................... 20910.1.1. Tabla por jerarqua de clases .............................................................. 20910.1.2. Tabla por subclase ........ ......... ........ ........ ........ ......... ........ ........ ........ ... 21010.1.3. Tabla por subclase: utilizando un discriminador .............. ........ ........ ...... 21110.1.4. Mezcla de tabla por jerarqua de clases con tabla por subclase ........... ... 21110.1.5. Tabla por clase concreta ..................................................................... 21210.1.6. Tabla por clase concreta utilizando polimorfismo implcito ...................... 21310.1.7. Mezcla de polimorfismo implcito conotros mapeos de herencia ........ .... 214

    10.2. Limitaciones.................................................................................................. 21511. Trabajo con objetos ............................................................................................... 217

    11.1. Estados de objetode Hibernate ..................................................................... 21711.2. Haciendo los objetos persistentes .................................................................. 21711.3. Cargando un objeto ....................................................................................... 21911.4. Consultas ...................................................................................................... 220

    11.4.1. Ejecucin de consultas ....................................................................... 22011.4.2. Filtracin de colecciones ..................................................................... 22511.4.3. Consultasde criterios ......................................................................... 22611.4.4. Consultas en SQL nativo .................................................................... 226

    11.5. Modificacinde objetos persistentes .............................................................. 22611.6. Modificacin de objetos separados ................................................................. 22711.7. Deteccin automtica de estado .................................................................... 22811.8. Borrado de objetos persistentes ............ ......................................................... 22911.9. Replicacin de objetos entre dos almacenamientos de datos diferentes ........ .... 22911.10. Limpieza (flushing) de la sesin ................................................................... 23011.11. Persistencia transitiva .................................................................................. 23111.12. Utilizacin de metadatos .............................................................................. 234

    12. Read-only entities .................................................................................................. 23512.1. Making persistent entities read-only ................................................................ 235

    12.1.1. Entities of immutable classes .............................................................. 23612.1.2. Loading persistent entities as read-only ............................................... 23612.1.3. Loading read-only entities from an HQL query/criteria ........................... 23712.1.4. Making a persistent entity read-only ..................................................... 238

    12.2. Read-only affect on propertytype ................................................................... 23912.2.1. Simple properties ................................................................................ 24012.2.2. Unidirectional associations .................................................................. 24112.2.3. Bidirectional associations .................................................................... 243

    13. Transacciones y concurrencia ............................................................................... 24513.1. mbitos de sesin y de transaccin ............................................................... 245

    13.1.1. Unidad detrabajo ............................................................................... 24613.1.2. Conversaciones largas ........................................................................ 24713.1.3. Consideracin de la identidad del objeto .............................................. 24813.1.4. Temas comnes ................................................................................. 249

  • 7/21/2019 Manual Completo de Hibernate

    7/411

    vii

    13.2. Demarcacin de la transaccin de la base de datos ............ ........ ........ ......... ... 24913.2.1. Entorno no administrado ........ ........ ........ ......... ........ ........ ........ ........ .... 25013.2.2. Utilizacin de JTA .............................................................................. 25213.2.3. Manejo de excepciones ........ ........ ........ ......... ........ ........ ........ ........ ..... 25313.2.4. Tiempo de espera de la transaccin ............... ......... ........ ........ ........ .... 254

    13.3. Control de concurrencia optimista ........ ........ ......... ........ ........ ........ ......... ........ 25513.3.1. Chequeo de versiones de la aplicacin ................................................ 25513.3.2. Sesin extendida y versionado automtico ........................................... 25613.3.3. Objetos separados y versionado automtico ......................................... 25713.3.4. Personalizacin del versionado automtico .......................................... 257

    13.4. Bloqueo pesimista ......................................................................................... 25813.5. Modos de liberacin de la conexin ............................................................... 259

    14. Interceptores y eve ntos ......................................................................................... 26114.1. Interceptores ................................................................................................. 26114.2. Sistema de eventos ....................................................................................... 26314.3. Seguridad declarativa de Hibernate ................................................................ 264

    15. Procesamiento por lotes ........................................................................................ 26715.1. Inserciones de lotes ...................................................................................... 26715.2. Actualizaciones de lotes ................................................................................ 26815.3. La interfaz de Sesin sin Estado .................................................................... 26815.4. Operacionesde estilo DML ............................................................................ 269

    16. HQL: El lenguaje de consulta de Hibernate ........................................................... 27316.1. Sensibilidada maysculas ............................................................................. 27316.2. La clusula from ........................................................................................... 27316.3. Asociaciones y uniones (joins) ....................................................................... 27416.4. Formas de sintaxis unida ............................................................................... 27616.5. Referencia ala propiedad identificadora ......................................................... 27616.6. La clusula select ......................................................................................... 27616.7. Funciones de agregacin ............................................................................... 27816.8. Consultas polimrficas ................................................................................... 27916.9. La clusula where ......................................................................................... 27916.10. Expresiones ................................................................................................ 28116.11. La clusulaorder by .................................................................................... 28516.12. La clusula group by ................................................................................... 28616.13. Subconsultas ............................................................................................... 28616.14. Ejemplos de HQL ........................................................................................ 28716.15. Declaraciones UPDATE y DELETE masivas ................................................. 29016.16. Conse jos y Trucos .... .... ........... ................................................................... 29016.17. Componentes .............................................................................................. 29116.18. Sintaxis delconstructor de valores por fila .................................................... 292

    17. Consultas por criterios .......................................................................................... 29317.1. Creacin de una instancia Criteria .................................................................. 29317.2. Lmitando el conjunto de resultados ............................................................... 29317.3. Orden de los resultados ................................................................................ 294

  • 7/21/2019 Manual Completo de Hibernate

    8/411

    HIBERNATE - Persistencia rela...

    viii

    17.4. Asociaciones ................................................................................................. 29517.5. Recuperacin dinmica de asociaciones ......................................................... 29617.6. Consultas ejemplo ......................................................................................... 29617.7. Proyecciones, agregacin y agrupamiento ........ ........ ........ ......... ........ ........ ..... 29717.8. Consultas y subconsultas separadas .............................................................. 29917.9. Consultas por identificador natural ......... ........ ........ ........ ........ ......... ........ ....... 300

    18. SQL Nativo ............................................................................................................. 30118.1. Uso de una SQLQuery .................................................................................. 301

    18.1.1. Consultasescalares ............................................................................ 30118.1.2. Consultasde entidades ....................................................................... 30218.1.3. Manejo de asociaciones y colecciones ................................................. 30318.1.4. Devolucinde entidades mltiples ....................................................... 30318.1.5. Devolucinde entidades no-administradas ........................................... 30518.1.6. Manejo deherencias .......................................................................... 30618.1.7. Parmetros ........................................................................................ 306

    18.2. Consultas SQL nombradas ............................................................................ 30618.2.1. Utilizacinde la propiedad return para especificar explcitamente losnombres de columnas/alias ............................................................................ 31218.2.2. Utilizacinde procedimientos para consultas ....... ........ ......................... 313

    18.3. Personalice SQL para crear, actualizar y borrar .............................................. 31518.4. Personalice SQL para cargar ......................................................................... 317

    19. Filtracin de datos ................................................................................................. 31919.1. Filtros de Hibernate ....................................................................................... 319

    20. Mapeo XML ............................................................................................................ 32320.1. Trabajo con datos XML ................................................................................. 323

    20.1.1. Especificacin de los mapeos de XML y de clase en conjunto ............ .... 32320.1.2. Especificacin de slo un mapeo XML ................................................. 324

    20.2. Mapeo de metadatos XML ............................................................................. 32420.3. Manipulacin de datos XML ........................................................................... 326

    21. Mejoramiento del rendimiento ............................................................................... 32921.1. Estrategias de recuperacin ........................................................................... 329

    21.1.1. Trabajo con asociaciones perezosas ................................................... 33021.1.2. Afinacin de las estrategias de recuperacin ........................................ 33121.1.3. Proxies deasociaciones de un slo extremo ........ ........ ......... ........ ....... 33221.1.4. Inicializacin de colecciones y proxies................................................. 33421.1.5. Utilizacinde recuperacin delotes ..................................................... 33521.1.6. Utilizacinde la recuperacin por subseleccin .................................... 33621.1.7. Perfiles derecuperacin ..................................................................... 33621.1.8. Utilizacin de la recuperacin perezosa de propiedades ........................ 338

    21.2. El Cach de Segundo Nivel ........................................................................... 33921.2.1. Mapeos de cach ............................................................................... 34021.2.2. Estrategia:slo lectura ....................................................................... 34321.2.3. Estrategia: lectura/escritura (read/write) ............................................... 34321.2.4. Estrategia: lectura/escritura no estricta ................................................. 343

  • 7/21/2019 Manual Completo de Hibernate

    9/411

    ix

    21.2.5. Estrategia: transaccional ......... ........ ........ ........ ......... ........ ........ ........ ... 34321.2.6. Compatibilidad de proveedor de cach/estrategia de concurrencia ......... 343

    21.3. Gestin de cachs ........................................................................................ 34421.4. El Cach de Consultas .................................................................................. 345

    21.4.1. Habilitacin del cach de peticiones ............. ........ ........ ......... ........ ...... 34621.4.2. Regiones de cach de consultas .............. ........ ........ ......... ........ ........ .. 347

    21.5. Comprensin del rendimiento de Colecciones ................................................. 34721.5.1. Taxonoma ......................................................................................... 34721.5.2. Las listas, mapas, idbags y conjuntos son las colecciones ms eficientesde actualizar .................................................................................................. 34821.5.3. Los Bags y las listas son las colecciones inversas ms eficientes ........... 34921.5.4. Borrado de un slo tiro ....................................................................... 349

    21.6. Control del rendimiento .................................................................................. 35021.6.1. Control de una SessionFactory ...... ...................................................... 35021.6.2. Mtricas ............................................................................................. 351

    22. Manual del conjunto de herramientas .................................................................... 35322.1. Generacin automtica de esquemas ............................................................. 353

    22.1.1. Personalizacin del esquema.............................................................. 35422.1.2. Ejecucin de la herramienta ................................................................ 35722.1.3. Propiedades ....................................................................................... 35722.1.4. Utilizacinde Ant ............................................................................... 35822.1.5. Actualizaciones incrementales de esquema .......................................... 35822.1.6. Utilizacin de Ant para actualizaciones incrementales de esquema ........ 35922.1.7. Validacin de Esquema ...................................................................... 35922.1.8. Utilizacin de Ant para lavalidacin de esquema .................................. 360

    23. Additional modules ................................................................................................ 36123.1. Bean Validation ............................................................................................. 361

    23.1.1. Adding Bean Validation ....................................................................... 36123.1.2. Configuration ...................................................................................... 36123.1.3. Catching violations .............................................................................. 36323.1.4. Database schema ............................................................................... 363

    23.2. Hibernate Search.......................................................................................... 36423.2.1. Description ......................................................................................... 36423.2.2. Integration with Hibernate Annotations ........... ...................................... 364

    24. Ejemplo: Padre/Hijo ............................................................................................... 36524.1. Nota sobre las colecciones ............................................................................ 36524.2. Uno-a-muchos bidireccional ........................................................................... 36524.3. Ciclo de vida en cascada .............................................................................. 36724.4. Cascadas y unsaved-value ............................................................................ 36924.5. Conclusin .................................................................................................... 369

    25. Ejemplo: Aplicacin de Weblog ............................................................................. 37125.1. Clases Persistentes ....................................................................................... 37125.2. Mapeos de Hibernate .................................................................................... 37225.3. Cdigo Hibernate .......................................................................................... 374

  • 7/21/2019 Manual Completo de Hibernate

    10/411

    HIBERNATE - Persistencia rela...

    x

    26. Ejemplo: mapeos varios ........................................................................................ 37926.1. Empleador/Empleado ..................................................................................... 37926.2. Autor/Obra .................................................................................................... 38126.3. Cliente/Orden/Producto .................................................................................. 38326.4. Mapeos varios de ejemplo ............................................................................. 385

    26.4.1. Asociacin uno-a-uno "Tipificada" ........................................................ 38526.4.2. Ejemplo de clave compuesta ............................................................... 38526.4.3. Muchos-a-muchos con atributo compartido de clave compuesta ............. 38826.4.4. Discriminacin basada en contenido .................................................... 38826.4.5. Asociaciones sobre claves alternativas ............... ........ ........ ........ ......... 389

    27. Prcticas recomendadas ........................................................................................ 39128. Consideraciones de la portabilidad de la base de datos ........................................ 395

    28.1. Aspectos bsicos de la portabilidad ................................................................ 39528.2. Dialecto ........................................................................................................ 39528.3. Resolucin del dialecto .................................................................................. 39528.4. Generacin del identificador ........................................................................... 39628.5. Funciones de la base de datos ........ ........ ......... ........ ........ ........ ........ ......... .... 39728.6. Mapeos de tipo ............................................................................................. 397

    Referencias ................................................................................................................... 399

  • 7/21/2019 Manual Completo de Hibernate

    11/411

    xi

    Prefacio

    Working with both Object-Oriented software and Relational Databases can be cumbersomeand time consuming. Development costs are significantly higher due to a paradigm mismatch

    between how data is represented in objects versus relational databases. Hibernate is an Object/ Relational Mapping solution for Java environments. The term Object/Relational Mapping refersto the technique of mapping data from an object model representation to a relational data modelrepresentation (and visa versa). Seehttp://en.wikipedia.org/wiki/Object-relational_mapping for agood high-level discussion.

    Nota

    While having a strong background in SQL is not required to use Hibernate, having

    a basic understanding of the concepts can greatly help you understand Hibernatemore fully and quickly. Probably the single best background is an understanding ofdata modeling principles. You might want to consider these resources as a goodstarting point:

    http://www.agiledata.org/essays/dataModeling101.html

    http://en.wikipedia.org/wiki/Data_modeling

    Hibernate not only takes care of the mapping from Java classes to database tables (and fromJava data types to SQL data types), but also provides data query and retrieval facilities. It cansignificantly reduce development time otherwise spent with manual data handling in SQL andJDBC. Hibernates design goal is to relieve the developer from 95% of common data persistence-related programming tasks by eliminating the need for manual, hand-crafted data processingusing SQL and JDBC. However, unlike many other persistence solutions, Hibernate does not hidethe power of SQL from you and guarantees that your investment in relational technology andknowledge is as valid as always.

    Hibernate may not be the best solution for data-centric applications that only use stored-procedures to implement the business logic in the database, it is most useful with object-oriented domain models and business logic in the Java-based middle-tier. However, Hibernatecan certainly help you to remove or encapsulate vendor-specific SQL code and will help with thecommon task of result set translation from a tabular representation to a graph of objects.

    Si usted es nuevo en el tema de Hibernate y del Mapeo Objeto/Relacional o inclusive en Javapor favor siga los siguientes pasos:

    1. Read Captulo 1, Tutorial for a tutorial with step-by-step instructions. The source code for thetutorial is included in the distribution in thedoc/refer ence/tutorial/ directory.

    2. Read Captulo 2, Arquitectura to understand the environments where Hibernate can be used.

    http://en.wikipedia.org/wiki/Data_modelinghttp://en.wikipedia.org/wiki/Object-relational_mappinghttp://en.wikipedia.org/wiki/Object-relational_mappinghttp://en.wikipedia.org/wiki/Data_modelinghttp://www.agiledata.org/essays/dataModeling101.htmlhttp://en.wikipedia.org/wiki/Object-relational_mapping
  • 7/21/2019 Manual Completo de Hibernate

    12/411

    Prefacio

    xii

    3. Dle un vistazo al directorioeg/ en la distribucin de Hibernate. Este comprende unaaplicacin autnoma simple. Copie su compilador JDBC al directoriolib/ y edite etc/hibernate.properties , especificando los valores correctos para su base de datos. Desdeun intrprete de comandos en el directorio de la distribucin, escribaant eg (utilizando Ant),o bajo Windows, escribabuild eg .

    4. Use this reference documentation as your primary source of information. Consider reading[JPwH ] if you need more help with application design, or if you prefer a step-by-step tutorial. Alsovisithttp://caveatemptor.hibernate.org and download the example application from [JPwH ].

    5. En el sitio web de Hibernate encontrar las respuestas a las preguntas ms frecuentes.

    6. En el sitio web de Hibernate encontrar los enlaces a las demostraciones de terceros, ejemplosy tutoriales.

    7. El rea de la comunidad en el sitio web de Hibernate es un buen recurso para encontrarpatrones de diseo y varias soluciones de integracin (Tomcat, JBoss AS, Struts, EJB, etc).

    There are a number of ways to become involved in the Hibernate community, including

    Trying stuff out and reporting bugs. Seehttp://hibernate.org/issuetracker.html details.

    Trying your hand at fixing some bugs or implementing enhancements. Again, seehttp:// hibernate.org/issuetracker.html details.

    http://hibernate.org/community.html list a few ways to engage in the community.

    There are forums for users to ask questions and receive help from the community.

    There are alsoIR C [http://en.wikipedia.org/wiki/Internet_Relay_Chat] channels for both userand developer discussions.

    Helping improve or translate this documentation. Contact us on the developer mailing list if youhave interest.

    Evangelizing Hibernate within your organization.

    http://en.wikipedia.org/wiki/Internet_Relay_Chathttp://en.wikipedia.org/wiki/Internet_Relay_Chathttp://hibernate.org/community.htmlhttp://hibernate.org/community.htmlhttp://en.wikipedia.org/wiki/Internet_Relay_Chathttp://en.wikipedia.org/wiki/Internet_Relay_Chathttp://hibernate.org/community.htmlhttp://hibernate.org/issuetracker.htmlhttp://hibernate.org/issuetracker.htmlhttp://hibernate.org/issuetracker.htmlhttp://caveatemptor.hibernate.org/
  • 7/21/2019 Manual Completo de Hibernate

    13/411

    1

    TutorialDirigido a los nuevos usuarios, este captulo brinda una introduccin a Hibernate paso por paso,empezando con una aplicacin simple usando una base de datos en memoria. Este tutorial sebasa en un tutorial anterior que Michael Gloegl desarroll. Todo el cdigo se encuentra en eldirectoriotutorials/web de la fuente del proyecto.

    Importante

    Este tutorial se basa en que el usuario tenga conocimiento de Java y SQL. Sitiene un conocimiento muy limitado de JAVA o SQL, le aconsejamos que empiececon una buena introduccin a esta tecnologa antes de tratar de aprender sobre

    Hibernate.

    Nota

    La distribucin contiene otra aplicacin de ejemplo bajo el directorio fuente delproyectotutorial/eg .

    1.1. Parte 1 - La primera aplicacin HibernatePara este ejemplo, vamos a configurar una aplicacin base de datos pequea que puedaalmacenar eventos a los que queremos asistir e informacin sobre los anfitriones de estoseventos.

    Nota

    Aunque puede utilizar cualquier base de datos con la que se sienta bien, vamosa usar HSQLDB [http://hsqldb.org/] (una base de datos Java en-memoria) para

    evitar describir la instalacin/configuracin de cualquier servidor de base de datosen particular.

    1.1.1. Configuracin

    Lo primero que tenemos que hacer es configurar el entorno de desarrollo. Vamos a utilizar el"diseo estndar" apoyado por muchas herramientas de construccin tal comoMaven [http:// maven.org]. Maven, en particular, tiene un buen recurso que describe estediseo [http:// maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html]. Comoeste tutorial va a ser una aplicacin web, vamos a crear y a utilizar los directoriossrc/main/java , src/main/resources y src/main/webapp .

    http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.htmlhttp://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.htmlhttp://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.htmlhttp://maven.org/http://maven.org/http://maven.org/http://hsqldb.org/http://hsqldb.org/
  • 7/21/2019 Manual Completo de Hibernate

    14/411

    Captulo 1. Tutorial

    2

    Vamos a usar Maven en este tutorial, sacando ventaja de sus funcionalidades de administracinde dependencias transitivas as como la habilidad de muchos IDEs para configurarautomticamente un proyecto para nosotros con base en el descriptor maven.

    < 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" >

    < modelVersion > 4.0.0

    < groupId > org.hibernate.tutorials

    < artifactId > hibernate-tutorial

    < version > 1.0.0-SNAPSHOT

    < name > First Hibernate Tutorial

    < build >

    < finalName > ${artifactId}

    < dependencies >

    < dependency >

    < groupId > org.hibernate

    < artifactId > hibernate-core

    < dependency >

    < groupId > javax.servlet

    < artifactId > servlet-api

    < dependency >

    < groupId > org.slf4j

    < artifactId > slf4j-simple

    < dependency >

    < groupId > javassist

    < artifactId > javassist

    Sugerencia

    It is not a requirement to use Maven. If you wish to use something else to buildthis 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. If you

  • 7/21/2019 Manual Completo de Hibernate

    15/411

    La primera clase

    3

    use something likeIvy [http://ant.apache.org/ivy/] providing transitive dependencymanagement you would still use the dependencies mentioned below. Otherwise,you'd need to graball dependencies, both explicit and transitive, and add themto the project's classpath. If working from the Hibernate distribution bundle, thiswould meanhibernate3.jar , all artifacts in thelib/required directory and allfiles from either thelib/bytecode/cglib or lib/bytecode/javassist directory;additionally you will need both the servlet-api jar and one of the slf4j loggingbackends.

    Guarde este archivo comopom.xml en el directorio raz del proyecto.

    1.1.2. La primera clase

    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 .id = id;

    }

    public Date getDate() {

    return date;

    }

    public void setDate(Date date) {

    this .date = date;

    }

    public String getTitle() {

    return title;

    }

    public void setTitle(String title) {

    this .title = title;

    }

    }

    http://ant.apache.org/ivy/http://ant.apache.org/ivy/
  • 7/21/2019 Manual Completo de Hibernate

    16/411

    Captulo 1. Tutorial

    4

    Esta clase utiliza convenciones de nombrado estndares de JavaBean para los mtodos depropiedades getter y setter as como tambin visibilidad privada para los campos. Se recomiendaeste diseo, pero no se exige. Hibernate tambin puede acceder a los campos directamente, losmtodos de acceso benefician la robustez de la refactorizacin.

    La propiedad id tiene un valor identificador nico para un evento en particular. Todas lasclases de entidad persistentes necesitarn tal propiedad identificadora si queremos utilizar elgrupo completo de funcionalidades de Hibernate (tambin algunas clases dependientes menosimportantes). De hecho, la mayora de las aplicaciones (en especial las aplicaciones web)necesitan distinguir los objetos por identificador, as que usted debe tomar esto como unafuncionalidad ms que una limitacin. Sin embargo, usualmente no manipulamos la identidadde un objeto, por lo tanto, el mtodo setter debe ser privado. Slamente Hibernate asignaridentificadores cuando se guarde un objeto. Como se puede ver, Hibernate puede acceder amtodos de acceso pblicos, privados y protegidos, as como tambin a campos directamente

    pblicos, privados y protegidos. Puede escoger y hacer que se ajuste a su diseo de su aplicacin.El constructor sin argumentos es un requerimiento para todas las clases persistentes, Hibernatetiene que crear objetos por usted utilizando Java Reflection. El constructor puede ser privado; sinembargo, se necesita la visibilidad del paquete para generar proxies en tiempo de ejecucin ypara la recuperacin de datos de manera efectiva sin la instrumentacin del cdigo byte.

    Duarde este archivo en el directoriosrc/main/java/org/hibernate/tutorial/domain .

    1.1.3. El archivo de mapeoHibernate necesita saber cmo cargar y almacenar objetos de la clase persistente. En este puntoes donde entra en juego el archivo de mapeo de Hibernate. Este archivo le dice a Hibernate aque tabla tiene que acceder en la base de datos, y que columnas debe utilizar en esta tabla.

    La estructura bsica de un archivo de mapeo se ve as:

    < ! DOCTYPE hibernate-mapping PUBLIC

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >

    < hibernate-mapping package = "org.hibernate.tutorial.domain" >

    [...]

    El DTD de Hibernate es sofisticado. Puede utilizarlo para autocompletar los elementos y atributosXML de mapeo en su editor o IDE. Abrir el archivo DTD en su editor de texto es la manera ms fcilpara 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 aplicacin. El archivo DTD se encuentraincluido enhibernate-core.jar (tambin enhibernate3.jar si est usando el paquete de ladistribucin).

  • 7/21/2019 Manual Completo de Hibernate

    17/411

    El archivo de mapeo

    5

    Importante

    Omitiremos la declaracin de DTD en los ejemplos posteriores para hacer ms

    corto el cdigo. Esto no es opcional.

    Entre las dos etiquetashibernate-mapping , incluya un elementoclass . Todas las clases deentidad persistentes (de nuevo, podran haber clases dependientes ms adelante, las cuales noson entidades de primera clase) necesitan de dicho mapeo en una tabla en la base de datos SQL:

    < hibernate-mapping package = "org.hibernate.tutorial.domain" >

    < class name = "Event" table = "EVENTS" >

    Hasta ahora le hemos dicho a Hibernate cmo persistir y cargar el objeto de claseEvent a la tablaEVENTS . Cada instancia se encuentra representada por una fila en esa tabla. Ahora podemoscontinuar mapeando la propiedad identificadora nica a la clave primaria de la tabla. Ya queno queremos preocuparnos por el manejo de este identificador, configuramos la estrategia degeneracin del identificador de Hibernate para una columna clave primaria sustituta:

    < hibernate-mapping package = "org.hibernate.tutorial.domain" >

    < class name = "Event" table = "EVENTS" >

    < id name = "id" column = "EVENT_ID" >

    < generator class = "native" />

    El elementoid es la declaracin de la propiedad identificadora. El atributo de mapeoname="id"declara el nombre de la propiedad JavaBean y le dice a Hibernate que utilice los mtodosgetId()y setId() para acceder a la propiedad. El atributo columna le dice a Hibernate qu columna dela tablaEVENTS tiene el valor de la llave principal.

    El elemento anidadogenerator especifica la estrategia de generacin del identificador (tambinconocidos como cmo se generan los valores del identificador?). En este caso escogimosnative , el cual ofrece un nivel de qu tan porttil es dependiendo del dialecto configurado de labase de datos. Hibernate soporta identificadores generados por la base de datos, globalmentenicos as como asignados por la aplicacin. La generacin del valor del identificador tambin esuno de los muchos puntos de extensin de Hibernate y puede conectar su propia estrategia.

  • 7/21/2019 Manual Completo de Hibernate

    18/411

    Captulo 1. Tutorial

    6

    Sugerencia

    native is no longer consider the best strategy in terms of portability. for further

    discussion, see Seccin 28.4, Generacin del identificador

    Por ltimo es necesario decirle a Hibernate sobre las porpiedades de clase de entidad quequedan. Por defecto, ninguna propiedad de la clase se considera persistente:

    < hibernate-mapping package = "org.hibernate.tutorial.domain" >

    < class name = "Event" table = "EVENTS" >

    < id name = "id" column = "EVENT_ID" >

    < generator class = "native" />

    < property name = "date" type = "timestamp" column = "EVENT_DATE" />

    < property name = "title" />

    Al igual que con el elementoid , el atributoname del elementoproperty le dice a Hibernate quemtodos getter y setter utilizar. As que en este caso, Hibernate buscar los mtodosgetDate() ,setDate() , getTitle() y setTitle() .

    Nota

    Por qu el mapeo de la propiedaddate incluye el atributocolumn , pero elde title no? Sin el atributocolumn Hibernate utiliza, por defecto, el nombrede propiedad como nombre de la columna. Esto funciona bien paratitle . Sinembargo, date es una palabra clave reservada en la mayora de las bases dedatos, as que es mejor que la mapeamos a un nombre diferente.

    El mapeo de title carece de un atributotype . Los tipos que declaramos y utilizamos en losarchivos de mapeo no son tipos de datos Java. Tampoco son tipos de base de datos SQL. Estostipos se llamantipos de mapeo Hibernate , convertidores que pueden traducir de tipos de datos deJava a SQL y viceversa. De nuevo, Hibernate tratar de determinar el tipo correcto de conversiny de mapeo por s mismo si el atributotype no se encuentra presente en el mapeo. En algunoscasos esta deteccin automtica (utilizando Reflection en la clase Java) puede que no tenga loque usted espera o necesita. Este es el caso de la propiedaddate . Hibernate no puede saberis la propiedad, la cual es dejava.util.Date , debe mapear a una columnadate , timestamp otime de SQL. Por medio de un convertidortimestamp , mapeamos la propiedad y mantenemosla informacin completa sobre la hora y fecha.

  • 7/21/2019 Manual Completo de Hibernate

    19/411

    Configuracin de Hibernate

    7

    Sugerencia

    Hibernate realiza esta determinacin de tipo de mapeo usando reflection cuando

    se procesan los archivos de mapeo. Esto puede tomar tiempo y recursos asque el rendimiento al arrancar es importante entonces debe considerar el definirexplcitamente el tipo a usar.

    Guarde este archivo de mapeo como src/main/resources/org/hibernate/tutorial/domain/Event.hbm.xml .

    1.1.4. Configuracin de HibernateEn 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"

    Nota

    Hacemos esto o lo otro y los datos permanecen entre ejecuciones.

    Vamos a utilizar el plugin de ejecucin 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 aplicacin se conectar ms adelante. Si quiere dar inicio con una base de datosfresca durante este tutorial, apague HSQLDB, borre todos los archivos en el directoriotarget/data e inicie HSQLDB de nuevo.

    Hibernate se conectar a la base de datos de parte de su aplicacin as que necesita sabercmo obtener conexiones. Para este tutorial vamos a utilizar un pool de conexiones autnomo(opuesto a javax.sql.DataSource ). Hibernate viene con soporte para dos pools de conexionesJDBC de cdigo abierto de terceros:c3p0 [https://sourceforge.net/projects/c3p0] yproxool [http:// proxool.sourceforge.net/]. Sin embargo, vamos a utilizar el pool de conexiones incluido deHibernate para este tutorial.

    Atencin

    El pool de conexiones de Hibernate no est diseado para utilizarse enproduccin. Le faltan varias funcionalidades que se encuentran en cualquier poolde conexiones decente.

    Para la configuracin de Hibernate, podemos utilizar un archivohibernate.propertiessimple, un archivohibernate.cfg.xml un poco ms sofisticado, o incluso una configuracincompletamente programtica. La mayora de los usuarios prefieren el archivo de configuracin

    XML:

    http://proxool.sourceforge.net/http://proxool.sourceforge.net/http://proxool.sourceforge.net/https://sourceforge.net/projects/c3p0https://sourceforge.net/projects/c3p0
  • 7/21/2019 Manual Completo de Hibernate

    20/411

    Captulo 1. Tutorial

    8

    < ! DOCTYPE hibernate-configuration PUBLIC

    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd" >

    < hibernate-configuration >

    < session-factory >

    < property name = "connection.driver_class"

    > org.hsqldb.jdbcDriver

    < property name = "connection.url"

    > jdbc:hsqldb:hsql://localhost

    < property name = "connection.username"

    > sa

    < property name = "connection.password"

    >

    < property name = "connection.pool_size"

    > 1

    < property name = "dialect"

    > org.hibernate.dialect.HSQLDialect

    < property name = "current_session_context_class"

    > thread

    < property name = "cache.provider_class"

    > org.hibernate.cache.NoCacheProvider

    < property name = "show_sql"

    > true

    < property name = "hbm2ddl.auto"

    > update

    < mapping resource = "org/hibernate/tutorial/domain/Event.hbm.xml" />

    Nota

    Observe que este archivo de configuracin especifica un DTD diferente

  • 7/21/2019 Manual Completo de Hibernate

    21/411

    Construccin con Maven

    9

    Configure laSessionFactory de Hibernate. SessionFactory es una fbrica global responsablede una base de datos en particular. Si usted tiene varias bases de datos, para un inicio ms fcilutilice varias configuraciones en varios archivos de configuracin.

    Los primeros cuatro elementosproperty contienen la configuracin necesaria para la conexinJDBC. El elementoproperty dialecto especifica la variante SQL en particular que Hibernategenera.

    Sugerencia

    In most cases, Hibernate is able to properly determine which dialect to use. SeeSeccin 28.3, Resolucin del dialecto for more information.

    La administracin de la sesin automtica de Hibernate para contextos de persistencia esparticularmente til en este contexto. La opcinhbm2ddl.auto activa la generacin automticade los esquemas de la base de datos directamente en la base de datos. Esto se puede desactivar,eliminando la opcin de configuracin o redirigindolo a un archivo con la ayuda de la tarea deAntSchemaExport . Finalmente, agregue a la configuracin el/los fichero(s) de mapeo para clasespersistentes.

    Guarde este archivo comohibernate.cfg.xml en el directoriosrc/main/resources .

    1.1.5. Construccin con Maven

    Ahora vamos a construir el tutorial con Maven. Es necesario que tenga instalado Maven; seencuentra disponible en lapgina de descargas Maven [http://maven.apache.org/download.html].Maven leer el archivo/pom.xml que creamos anteriormente y sabr cmo realizar algunastareas de proyectos bsicos. Primero, vamos a ejecutar la metacompile para asegurarnos deque podemos compilar todo hasta el momento:

    [hibernateTutorial]$ mvn compile

    [INFO] Scanning for projects...

    [INFO] ------------------------------------------------------------------------

    [INFO] Building First Hibernate Tutorial[INFO] task-segment: [compile]

    [INFO] ------------------------------------------------------------------------

    [INFO] [resources:resources]

    [INFO] Using default encoding to copy filtered resources.

    [INFO] [compiler:compile]

    [INFO] Compiling 1 source file to /home/steve/projects/sandbox/hibernateT utorial/target/classes

    [INFO] ------------------------------------------------------------------------

    [INFO] BUILD SUCCESSFUL

    [INFO] ------------------------------------------------------------------------

    [INFO] Total time: 2 seconds

    [INFO] Finished at: Tue Jun 09 12:25:25 CDT 2009

    [INFO] Final Memory: 5M/547M

    [INFO] ------------------------------------------------------------------------

    http://maven.apache.org/download.htmlhttp://maven.apache.org/download.html
  • 7/21/2019 Manual Completo de Hibernate

    22/411

    Captulo 1. Tutorial

    10

    1.1.6. Inicio y ayudantes

    Es el momento de cargar y almacenar algunos objetosEvent , pero primero tiene que completarla configuracin con algo de cdigo de infraestructura. Tiene que iniciar Hibernate construyendoun objetoorg.hibernate.SessionFactory global y almacenarlo en algn lugar de fcil accesoen el cdigo de la aplicacin. Unaorg.hibernate.SessionFactory se utiliza para obtenerinstancias org.hibernate.Session . Una org.hibernate.Session representa una unidad detrabajo mono-hilo. Laorg.hibernate.SessionFactory es un objeto global seguro entre hilosque se instancia una sla vez.

    Vamos a crear una clase de ayudaHibernateUtil que se encargue del inicio y haga ms prcticoel acceso a org.hibernate.SessionFactory .

    package org.hibernate.tutorial.util;

    import org.hibernate.SessionFactory;

    import org.hibernate.cfg.Configuration;

    public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    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);

    }

    }

    public static SessionFactory getSessionFactory() {

    return sessionFactory;

    }

    }

    Guarde este cdigo como src/main/java/org/hibernate/tutorial/util/HibernateUtil.java

    Esta clase no slamente produce la referenciaorg.hibernate.SessionFactory global en suinicializador esttico, sino que tambin esconde el hecho de que utiliza un singleton esttico.Tambin puede que busque la referenciaorg.hibernate.SessionFactory desde JNDI en unservidor de aplicaciones en cualquier otro lugar.

    Si usted le da un nombre aorg.hibernate.SessionFactory en su archivo de configuracin, dehecho, Hibernate tratar de vincularlo a JNDI bajo ese nombre despus de que ha sido construido.Otra mejor opcin es utilizar el despliegue JMX y dejar que el contenedor con capacidad JMX

  • 7/21/2019 Manual Completo de Hibernate

    23/411

    Carga y almacenamiento de objetos

    11

    instancie y vincule unHibernateService a JNDI. Ms adelante discutiremos estas opcionesavanzadas.

    Ahora necesita configurar un sistema de registro. Hibernate utiliza registros comunes le da dos

    opciones: Log4J y registros de JDK 1.4. La mayora de los desarrolladores prefieren Log4J:copie log4j.properties de la distribucin de Hibernate, se encuentra en el directorioetc/ ) asu directoriosrc , junto ahibernate.cfg.xml . Si desea tener una salida ms verbosa que la quese proporcion en la configuracin del ejemplo entonces puede cambiar su configuracin. Pordefecto, slo se muestra el mensaje de inicio de Hibernate en la salida estndar.

    La infraestructura del tutorial est completa y estamos listos para hacer un poco de trabajo realcon 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 anEventManager class with amain() 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" )) {

    mgr.createAndStoreEvent( "My Event" , new Date());

    }

    HibernateUtil.getSessionFactory().close();

    }

    private void createAndStoreEvent(String title, Date theDate) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();

    session.beginTransaction();

    Event theEvent = new Event();

    theEvent.setTitle(title);

    theEvent.setDate(theDate);

    session.save(theEvent);

    session.getTransaction().commit();

    }

    }

  • 7/21/2019 Manual Completo de Hibernate

    24/411

    Captulo 1. Tutorial

    12

    En createAndStoreEvent() creamos un nuevo objetoEvent y se lo entregamos a Hibernate.En ese momento, Hibernate se encarga de SQL y ejecuta unINSERT 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 granularitybetween a Hibernate org.hibernate.Session and a database transaction. To shield our code fromthe actual underlying transaction system we use the Hibernateorg.hibernate.TransactionAPI. In this particular case we are using JDBC-based transactional semantics, but it could alsorun with JTA.

    Qu hace sessionFactory.getCurrentSession() ? Primero, la puede llamar tantas vecescomo desee y en donde quiera, una vez consiga suorg.hibernate.SessionFactory . Elmtodo getCurrentSession() siempre retorna la unidad de trabajo "actual". Recuerda quecambiamos la opcin de la configuracin de este mecanismo a "thread" ensrc/main/resources/

    hibernate.cfg.xml ? Por lo tanto, el contexto de una unidad de trabajo actual se encuentravinculada al hilo de Java actual que ejecuta nuestra aplicacin.

    Importante

    Hibernate ofrece tres mtodos de rastreo de sesin actual. El mtodo basado en"hilos" no est dirigido al uso de produccin; slo es til para prototipos y paratutoriales como este. Ms adelante discutiremos con ms detalles el rastreo desesin actual.

    Una org.hibernate.Session se inicia cuando se realiza la primera llamada agetCurrentSession() para el hilo actual. Luego Hibernate la vincula al hilo actual. Cuandotermina la transaccin, ya sea por medio de guardar o deshacer los cambios, Hibernatedesvincula automticamente la org.hibernate.Session del hilo y la cierra por usted. Si llama agetCurrentSession() de nuevo, obtiene una org.hibernate.Session nueva y obtiene una nuevaorg.hibernate.Session unidad de trabajo.

    En relacin con la unidad del campo de trabajo, Se debera utilizar org.hibernate.Session deHibernate para ejecutar una o varias operaciones de la base de datos? El ejemplo anterior

    utiliza una org.hibernate.Session para una operacin. Sin embargo, esto es pura coincidencia; elejemplo 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 disear suaplicacin para que utilice una nueva org.hibernate.Session de Hibernate paracada operacinde la base de datos. Aunque lo utilizamos en los siguientes ejemplos, considere lasesin-por- operacin como un anti-patrn. Ms adelante en este tutorial, se muestra una aplicacin webreal, lo cual le ayudar a ilustrar esto.

    See Captulo 13, Transacciones y concurrencia for more information about transaction handlingand demarcation. The previous example also skipped any error handling and rollback.

  • 7/21/2019 Manual Completo de Hibernate

    25/411

    Carga y almacenamiento de objetos

    13

    Para ejecutar esto, utilizaremos el plugin de ejecucin Maven para llamar nuestraclase con la configuracin de ruta de clase necesaria: mvn exec:java -Dexec.mainClass="org.hibernate.tutorial.EventManager" -Dexec.args="store"

    Nota

    Es posible que primero necesite realizarmvn compile .

    Debe ver que Hibernate inicia y dependiendo de su configuracin, tambin ver bastantes salidasde registro. Al final, ver la siguiente lnea:

    [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 opcin al mtodo principal:

    if (args[ 0 ].equals( "store" )) {

    mgr.createAndStoreEvent( "My Event" , new Date());

    }

    else if (args[ 0 ].equals( "list" )) {

    List events = mgr.listEvents();

    for (int i = 0 ; i < events.size(); i++) {

    Event theEvent = (Event) events.get(i);

    System.out.println(

    "Event: " + theEvent.getTitle() + " Time: " + theEvent.getDate()

    );

    }

    }

    Tambin agregamos un mtodolistEvents() :

    private List listEvents() {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction();

    List result = session.createQuery( "from Event" ).list();

    session.getTransaction().commit();

    return result;

    }

    Here, we are using a Hibernate Query Language (HQL) query to load all existingEvent objectsfrom the database. Hibernate will generate the appropriate SQL, send it to the database andpopulate Event objects with the data. You can create more complex queries with HQL. SeeCaptulo 16, HQL: El lenguaje de consulta de Hibernate for more information.

  • 7/21/2019 Manual Completo de Hibernate

    26/411

    Captulo 1. Tutorial

    14

    Ahora podemos llamar nuestra nueva funcionalidad, de nuevo usando el plugin de ejecucinMaven: mvn exec:java -Dexec.mainClass="org.hibernate.tutorial.EventManager" -Dexec.args="list"

    1.2. Part 2 - Mapeo de asociacionesHasta ahora hemos mapeado una clase de entidad persistente a una tabla aislada. Vamos aconstruir sobre esto y agregaremos algunas asociaciones de clase. Vamos a agregar personasa la aplicacin 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 clasePerson 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 llamadosrc/main/java/org/hibernate/tutorial/domain/Person.java

    Luego, cree el nuevo archivo de mapeo comosrc/main/resources/org/hibernate/tutorial/domain/Person.hbm.xml

    < hibernate-mapping package = "org.hibernate.tutorial.domain" >

    < class name = "Person" table = "PERSON" >

    < id name = "id" column = "PERSON_ID" >

    < generator class = "native" />

    < property name = "age" />

    < property name = "firstname" />

    < property name = "lastname" />

    Finalmente, aada el nuevo mapeo a la configuracin de Hibernate:

  • 7/21/2019 Manual Completo de Hibernate

    27/411

    Una asociacin unidireccional basada en Set

    15

    < mapping resource = "org/hibernate/tutorial/domain/Event.hbm.xml" />

    < mapping resource = "org/hibernate/tutorial/domain/Person.hbm.xml" />

    Vamos a crear una asociacin entre estas dos entidades. Las personas pueden participar en loseventos y los eventos cuentan con participantes. Las cuestiones de diseo con las que tenemosque tratar son: direccionalidad, multiplicidad y comportamiento de la coleccin.

    1.2.2. Una asociacin unidireccional basada en Set

    Al agregar una coleccin de eventos a la clasePerson , puede navegar fcilmente a los eventosde una persona en particular, sin ejecutar una peticin explcita - llamando aPerson#getEvents .En Hibernate, las asociaciones multi-valores se representan por medio de uno de los contratos delmarco de colecciones Java; aqu escogimos unjava.util.Set ya que la coleccin 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 = events;

    }

    }

    Antes de mapear esta asociacin, considere el otro lado. Podriamos mantener esto unidireccionalo podramos crear otra coleccin en elEvent , si queremos tener la habilidad de navegarlo desdeambas direcciones. Esto no es necesario desde un punto de vista funcional. Siempre puedeejeutar un pedido explcito para recuperar los participantes de un evento en particular. Esta esuna eleccin de diseo que depende de usted, pero lo que queda claro de esta discusin es lamultiplicidad de la asociacin: "muchos" valuada en ambos lados, denominamos esto como unaasociacinmuchos-a-muchos . Por lo tanto, utilizamos un mapeo muchos-a-muchos de Hibernate:

    < class name = "Person" table = "PERSON" >

    < id name = "id" column = "PERSON_ID" >

    < generator class = "native" />

    < property name = "age" />

    < property name = "firstname" />

    < property name = "lastname" />

    < set name = "events" table = "PERSON_EVENT" >

    < key column = "PERSON_ID" />

    < many-to-many column

    = "EVENT_ID" class

    = "Event" />

  • 7/21/2019 Manual Completo de Hibernate

    28/411

    Captulo 1. Tutorial

    16

    Hibernate soporta un amplio rango de mapeos de coleccin, el ms comnset . Para unaasociacin muchos-a-muchos o la relacin de entidadn:m , se necesita una tabla de asociacin.Cada fila en esta tabla representa un enlace entre una persona y un evento. El nombre de estatabla se declara con el atributotable del elementoset . El nombre de la columna identificadoraen la asociacin, del lado de la persona, se define con el elementokey , el nombre de columnapara el lado del evento se define con el atributocolumn del many-to-many . Tambin tiene queinformarle a Hibernate la clase de los objetos en su coleccin (la clase del otro lado de la coleccinde referencias).

    Por consiguiente, el esquema de base de datos para este mapeo es:

    _____________ __________________

    | | | | _____________

    | EVENTS | | PERSON_EVENT | | |

    |_____________| |__________________| | PERSON |

    | | | | |_____________|

    | *EVENT_ID | | *EVENT_ID | | |

    | EVENT_DATE | | *PERSON_ID | | *PERSON_ID |

    | TITLE | |__________________| | AGE |

    |_____________| | FIRSTNAME |

    | LASTNAME |

    |_____________|

    1.2.3. Trabajo de la asociacin

    Vamos a reunir a algunas personas y eventos en un nuevo mtodo enEventManager :

    private void addPersonToEvent(Long personId, Long eventId) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();

    session.beginTransaction();

    Person aPerson = (Person) session.load(Person. class , personId); Event anEvent = (Event) session.load(Event. class , eventId);

    aPerson.getEvents().add(anEvent);

    session.getTransaction().commit();

    }

    Despus de cargar una Person y un Event , simplemente modifique la coleccin utilizando losmtodos normales de coleccin. No hay una llamada explcita aupdate() o save() ; Hibernatedetecta automticamente que se ha modificado la coleccin y que se necesita actualizarla. Estose denomina chequeo automtico de desactualizaciones y tambin puede probarlo modificandoel nombre o la propiedad de fecha de cualquiera de sus objetos. Mientras se encuentran en

  • 7/21/2019 Manual Completo de Hibernate

    29/411

    Trabajo de la asociacin

    17

    estado persistente , es decir, enlazado a unaorg.hibernate.Session de Hibernate en particular,Hibernate monitorea cualquier cambio y ejecuta SQL de un modo escribe-detrs. El proceso desincronizacin del estado de la memoria con la base de datos, usualmente slo al final de unaunidad de trabajo, se denominavaciado . En nuestro cdigo la unidad de trabajo termina conguardar o deshacer los cambios de la transaccin de la base de datos.

    Puede cargar una persona y un evento en diferentes unidades de trabajo. Tambin puedemodificar un objeto fuera de unaorg.hibernate.Session , cuando no se encuentra en estadopersistente (si antes era persistente denominamos a este estadoseparado ). Inclusive, puedemodificar una coleccin cuando se encuentre separada:

    private void addPersonToEvent(Long personId, Long eventId) {

    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" , personId)

    .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

    Session session2 = HibernateUtil.getSessionFactory().getCurrentSession();

    session2.beginTransaction();

    session2.update(aPerson); // Reattachment of aPerson

    session2.getTransaction().commit();

    }

    La llamada a update hace que un objeto separado sea persistente de nuevo enlazndolo auna nueva unidad de trabajo, as que cualquier modificacin que le realiz mientras estabaseparado se puede guardar en la base de datos. Esto incluye cualquier modificacin (adicioneso eliminaciones) que le hizo a una coleccin de ese objeto entidad.

    Esto no se utiliza mucho en nuestro ejemplo, pero es un concepto importante que puedeincorporar en su propia aplicacin. Complete este ejercicio agregando una nueva accinal mtodo main de EventManager y llmela desde la lnea de comandos. Si necesita losidentificadores de una persona y de un evento - el mtodosave() los retorna (pueda que necesitemodificar algunos de los mtodos anteriores para retornar ese identificador):

    else if (args[ 0 ].equals( "addpersontoevent" )) {

    Long eventId = mgr.createAndStoreEvent( "My Event" ,new

    Date());

    Long personId = mgr.createAndStorePerson( "Foo" , "Bar" );

  • 7/21/2019 Manual Completo de Hibernate

    30/411

    Captulo 1. Tutorial

    18

    mgr.addPersonToEvent(personId, eventId);

    System.out.println( "Added person " + personId + " to event " + eventId);

    }

    Esto fue un ejemplo de una asociacin entre dos clases igualmente importantes: dos entidades.Como se mencion anteriormente, hay otras clases y tipos en un modelo tpico, usualmente"menos importantes". Algunos de ustedes las habrn visto, como unint o un java.lang.String .Denominamos a estas clases tipos de valor y sus instancias dependen de una entidad enparticular. Las instancias de estos tipos no tienen su propia identidad, ni son compartidas entreentidades. Dos personas no referencian el mismo objetofirstname , incluso si tienen el mismonombre. Los tipos de valor no slo pueden encontrarse en el JDK, sino que tambin puede escribirpor s mismo clases dependientes como por ejemplo,Address o MonetaryAmount . De hecho, enuna aplicacin Hibernate todas las clases JDK se consideran como tipos de valor.

    Tambin puede disear una coleccin de tipos de valor. Esto es conceptualmente diferente deuna coleccin de referencias a otras entidades, pero se ve casi igual en Java.

    1.2.4. Coleccin de valores

    Vamos a agregar una coleccin de direcciones de correo electrnico a la entidadPerson . Estose representar como un java.util.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;

    }

    El mapeo de este Set es as:

    < set name = "emailAddresses" table = "PERSON_EMAIL_ADDR" > < key column = "PERSON_ID" />

    < element type = "string" column = "EMAIL_ADDR" />

    La diferencia comparado con el mapeo anterior es el uso de la parteelement , que le dice aHibernate que la coleccin no contiene referencias a otra entidad, sino que es una coleccinde elementos que son tipos de valores, aqu especificamente de tipoString . El nombre enminsculas le dice que es un tipo/conversor de mapeo de Hibernate. Una vez ms, el atributotable del elementoset determina el nombre de la tabla para la coleccin. El elementokey define

    el nombre de la columna clave fornea en la tabla de coleccin. El atributocolumn

    en el elemento

  • 7/21/2019 Manual Completo de Hibernate

    31/411

    Asociaciones bidireccionales

    19

    element define el nombre de la columna donde realmente se almacenarn los valores de ladireccin de correo electrnico.

    Este es el esquema actualizado:

    _____________ __________________

    | | | | _____________

    | EVENTS | | PERSON_EVENT | | | ___________________

    |_____________| |__________________| | PERSON | | |

    | | | | |_____________| | PERSON_EMAIL_ADDR |

    | *EVENT_ID | | *EVENT_ID | | | |___________________|

    | EVENT_DATE | | *PERSON_ID | | *PERSON_ID | | *PERSON_ID |

    | TITLE | |__________________| | AGE | | *EMAIL_ADDR |

    |_____________| | FIRSTNAME | |___________________|

    | LASTNAME |

    |_____________|

    Puede ver que la clave principal de la tabla de coleccin es, de hecho, una clave compuestaque utiliza ambas columnas. Esto tambin implica que no pueden haber direcciones de correoelectrnico duplicadas por persona, la cual es exactamente la semntica que necesitamos paraun conjunto en Java.

    Ahora, puede tratar de agregar elementos a esta coleccin, al igual que lo hicimos antesvinculando personas y eventos. Es el mismo cdigo en Java.

    private void addEmailToPerson(Long personId, String emailAddress) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();

    session.beginTransaction();

    Person aPerson = (Person) session.load(Person. class , personId);

    // 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 peticin debqueda - fetch - para dar inicio a la coleccin. Monitoreesu registro SQL e intente de optimizar esto con una recuperacin temprana.

    1.2.5. Asociaciones bidireccionales

    A continuacion vamos a mapear una asociacin bidireccional. Vamos a hacer que la asociacinentre persona y evento funcione desde ambos lados en Java. El esquema de la base de datosno cambia as que todava tendremos una multiplicidad muchos-a-muchos.

  • 7/21/2019 Manual Completo de Hibernate

    32/411

    Captulo 1. Tutorial

    20

    Nota

    Una base de datos relacional es ms flexible que un lenguaje de programacin de

    red ya que no necesita una direccin de navegacin; los datos se pueden ver yrecuperar de cualquier forma posible.

    Primero, agregue una coleccin de participantes a la claseEvent :

    private Set participants = new HashSet();

    public Set getParticipants() {

    return participants;

    }

    public void setParticipants(Set participants) {

    this .participants = participants;

    }

    Ahora mapee este lado de la asociacin enEvent.hbm.xml .

    < set name = "participants" table = "PERSON_EVENT" inverse = "true" >

    < key column = "EVENT_ID" />

    < many-to-many column = "PERSON_ID" class = "Person" />

    Estos son mapeos normales de set en ambos documentos de mapeo. Note que los nombresde las columnas en key y many-to-many se intercambiaron en ambos documentos de mapeo.La adicin ms importante aqu es el atributoinverse="true" en el elemento set del mapeode coleccin deEvent .

    Esto significa que Hibernate debe tomar el otro lado, la clasePerson , cuando necesite encontrarinformacin sobre el enlace entre las dos. Esto ser mucho ms fcil de entender una vez quevea como se crea el enlace bidireccional entre nuestras dos entidades.

    1.2.6. Trabajo con enlaces bidireccionalesPrimero, recuerde que Hibernate no afecta la semntica normal de Java. Cmo creamos unenlace entre Person y un Event en el ejemplo unidireccional? Agregue una instancia deEventa la coleccin de referencias de eventos de una instancia dePerson . Si quiere que este enlacefuncione bidireccionalmente, tiene que hacer lo mismo del otro lado, aadiendo una referenciaPerson a la coleccin en unEvent . Este proceso de "establecer el enlace en ambos lados" esabsolutamente necesario con enlaces bidireccionales.

    Muchos desarrolladores programan a la defensiva y crean mtodos de administracin de enlacespara establecer correctamente ambos lados, (por ejemplo, enPerson ):

  • 7/21/2019 Manual Completo de Hibernate

    33/411

    Part 3 - La aplicacin web EventManager

    21

    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 );

    }

    public void removeFromEvent(Event event) {

    this .getEvents().remove(event);

    event.getParticipants().remove( this );

    }

    Los mtodos get y set para la coleccin ahora se encuentran protegidos. Esto le permite a lasclases en el mismo paquete y a las subclases acceder an a los mtodos, pero impide a cualquierotro que desordene las colecciones directamente. Repita los pasos para la coleccin del otro lado.

    Y el atributo de mapeoinverse ? Para usted y para Java, un enlace bidireccional es simplementecuestin de establecer correctamente las referencias en ambos lados. Sin embargo, Hibernateno tiene suficiente informacin para organizar correctamente declaracionesINSERT y UPDATE deSQL (para evitar violaciones de restricciones). El hacer un lado de la asociacininverse le dice aHibernate que lo considere unespejo del otro lado. Eso es todo lo necesario para que Hibernateresuelva todos los asuntos que surgen al transformar un modelo de navegacin direccionala un esquema de base de datos SQL. Las reglas son muy simples: todas las asociacionesbidireccionales necesitan que uno de los lados seainverse . En una asociacin uno-a-muchosdebe ser el lado-de-muchos; y en una asociacin muchos-a-muchos, puede escoger cualquierlado.

    1.3. Part 3 - La aplicacin web EventManagerUna aplicacin web de Hibernate utilizaSession y Transaction casi como una aplicacinautnoma. Sin embargo, algunos patrones comunes son tiles. Ahora puede escribir unEventManagerServlet . Este servlet puede enumerar todos los eventos almacenados en la basede datos y proporciona una forma HTML para ingresar eventos nuevos.

    1.3.1. Escritura de un servlet bsicoPrimero necesitamos crear nuestro servlet de procesamiento bsico. Ya que nuestro servlet solomaneja pedidosGET HTTP slamente, solo implementaremos el mtododoGet() :

    package org.hibernate.tutorial.web;

    // Imports

  • 7/21/2019 Manual Completo de Hibernate

    34/411

    Captulo 1. Tutorial

    22

    public class EventManagerServlet extends HttpServlet {

    protected void doGet(

    HttpServletRequest request,

    HttpServl