2. Hibernate Conceptos

28
Hibernate - Conceptos Básicos Mayer Horna

description

hibernate concepto

Transcript of 2. Hibernate Conceptos

Page 1: 2. Hibernate Conceptos

Hibernate - Conceptos Básicos

Mayer Horna

Page 2: 2. Hibernate Conceptos

Transient y Persistent

• Hibernate se distingue entre objetos de tipo transient y tipo persistent.

Page 3: 2. Hibernate Conceptos

SessionFactory

Page 4: 2. Hibernate Conceptos

Sesiones contextuales

• La mayoría de las aplicaciones que usanHibernate necesitan alguna forma de sesión"contextual", donde una sesión determinadaesté en efecto a lo largo del "scope" o alcancede un contexto determinado.

Page 5: 2. Hibernate Conceptos

Sesiones contextuales• Empezando con la versión 3.0.1, Hibernate incorporó

el método SessionFactory.getCurrentSession(). Inicialmente, este método asumía el uso de transacciones JTA, donde la transacción JTA definía tanto el alcance como el contexto de la sesión actual.

• El equipo de Hibernate mantiene que, dada la madurez de las numerosas implementaciones autosuficientes de JTA que existen hoy día, la mayoría (si no todas) las aplicaciones deberían estar usando JTA para su manejo de transacciones (estén o no desplegadas en un contenedor J2EE). Basándose en eso, las sesiones contextuales JTA son todo lo que usted debería necesitar usar.

Page 6: 2. Hibernate Conceptos

Sesiones contextuales

• Sin embargo, a partir de la versión 3.1, el proceso que ocurrepor detrás de SessionFactory.getCurrentSession() esconfigurable. Con este fin, una nueva interfaz de extensión(org.hibernate.context.CurrentSessionContext) y un nuevoparámetro de configuración(hibernate.current_session_context_class) han sidoagregados, para permitir "enchufar" implementacionesnuevas para definir el alcance y contexto de las sesiones.

Page 7: 2. Hibernate Conceptos

Sesiones contextuales

• org.hibernate.context.JTASessionContext - las sesiones actuales son localizadas y su alcance definido por una transacción JTA. El procesamiento aquí es exactamente el mismo que en el antiguo enfoque sólo-JTA. Vea los Javadocs para más detalles.

Tipos de sesiones contextuales

Page 8: 2. Hibernate Conceptos

Sesiones contextuales

• org.hibernate.context.ThreadLocalSessionContext -las sesiones actuales son localizadas por thread de ejecución.

Tipos de sesiones contextuales

Page 9: 2. Hibernate Conceptos

Sesiones contextuales

• org.hibernate.context.ManagedSessionContext - las sesiones actuales son localizadas por thread de ejecución. Sin embargo, usted es responsable por ligar y desligar las instancias de sesión, mediante métodos estáticos en esta clase. Nunca abre, cierra o le aplica flush a una sesión.

Page 10: 2. Hibernate Conceptos

Sesiones contextuales

• Las dos primeras implementaciones proveen un modelo de programación del tipo "una sesión - una transacción de base de datos", también llamado session-per-request. El comienzo y fin de una sesión de Hibernateestá definido por la duración de la transacción de base de datos.

Page 11: 2. Hibernate Conceptos

Transacciones y concurrencia

• Hibernate no efectúa "lock" de objetos en memoria. Si aplicación puede esperar el comportamiento que esté definido por el nivel de aislamiento de sus transacciones de base de datos. Note que, gracias a la sesión, que es también un caché con alcance a la transacción, Hibernate provee lecturas repetibles para la búsqueda por identificadores.

Page 12: 2. Hibernate Conceptos

Transacciones y concurrencia

• Además de versionar para lograr un control de concurrencia optimista, Hibernate también ofrece una API (mínima) para efectuar un "lock" de filas pesimista, usando la sintaxis SELECT FOR UPDATE.

Page 13: 2. Hibernate Conceptos

La sesión y el alcance (scope) de las transacciones

• La fábrica de sesiones (SessionFactory) es un objeto seguro en cuanto al acceso por threadsmúltiples (thread-safe), y es costosa de crear. Se la concibió para ser compartida por todos los threads de la aplicación. Se la crea una sola vez, normalmente durante el arranque de la aplicación, a partir de una instancia de Configuration.

Page 14: 2. Hibernate Conceptos

La sesión y el alcance (scope) de las transacciones

• Una sesión individual (Session), en cambio, es barata de crear, y no es segura en cuanto al acceso por múltiples threads (no es "threadsafe"). Se espera que sea usada una sola vez, para una interacción simple o "request" (una sola solicitud, una sola "conversación" o "unidad de trabajo"), y luego sea descartada. Una sesión no intentará obtener una conexión de JDBC, ni una fuente de datos (Connection,Datasource) a menos que sea necesario. Por lo tanto, no consume recursos mientras no es usada.

Page 15: 2. Hibernate Conceptos

Unidad de trabajo

¡Antes que nada, no emplee la práctica desaconsejada (antipattern) de una-sesión-por-operación, es decir, no abra y cierre una sesión para cada llamado a la base de datos en un mismo thread! En una aplicación, los llamados a la base de datos son hechos en un orden planificado, y son agrupados en unidades de trabajo atómicas.

En hibernate Las transacciones de base de datos nunca son opcionales, toda comunicación con la base de datos debe ocurrir dentro de una transacción, ya sea para escribir o para leer datos. El comportamiento "auto-commit" debe evitarse, dado que es improbable que un conjunto de muchas pequeñas transacciones tenga mejor performance que una unidad de trabajo claramente definida. Esta última es también más flexible y extensible.

Page 16: 2. Hibernate Conceptos

Unidad de trabajo

• El patrón más común, en una aplicación cliente/servidormultiusuario, es "una sesión por cada solicitud" (session-per-request) . Según este modelo, una solicitud o "request" delcliente se envía al servidor (en donde está ejecutándose lacapa de persistencia Hibernate), se abre una nueva sesión, ytodas las operaciones de base de datos son ejecutadas e estaunidad de trabajo. Una vez que el trabajo se haya completado(y la respuesta para el cliente se haya preparado), la sesiónsufre un "flush" y se cierra.

Page 17: 2. Hibernate Conceptos

Anexos

• Propiedades de hibernate.cfg.xml

Nombre de la propiedad Propósito

hibernate.connection.driver_class clase del driver JDBC

hibernate.connection.url URL de JDBC

hibernate.connection.username usuario de la base de datos

hibernate.connection.password clave del usuario de la base de datos

hibernate.connection.pool_size número máximo de conexiones en el "pool"

Page 18: 2. Hibernate Conceptos

Anexos

• Propiedades de hibernate.cfg.xml

Nombre de la propiedad Propósito

hibernate.jdbc.use_get_generated_keys

Habilita el uso del PreparedStatement.getGeneratedKeys() de JDBC3 para capturar

claves generadas en forma nativa luego de insertar. Requiere que a Requires JDBC3+

driver y a JRE1.4+, le sea asignado "false" si el driver que usted está usando tiene

problemas con los generadores de identificadores. Por defecto, intenta determinar las

capacidades del driver usando los metadatos de conexión.

valores posibles true|false

hibernate.connection.provider_class

El nombre de clase de un org.hibernate.connection.ConnectionProvider hecho a

medida que le provea conexiones JDBC a Hibernate.

por ejemplo classname.of.ConnectionProvider

hibernate.connection.isolation

Determina el nivel de aislamiento de las transacciones JDBC.

Revise java.sql.Connection para averiguar qué valores tiene sentido asignar aquí, pero

note que la mayoría de las BD no soportan todos los niveles de aislamiento (isloation

levels), y algunas definen niveles no estándar adicionales.

por ejemplo 1, 2, 4, 8

hibernate.connection.autocommit

Habilita la autocomisión (autocommit) para las conexiones JDBC en pool (no se

recomienda).

valors posibles true | false

Page 19: 2. Hibernate Conceptos

Anexos

• Propiedades de hibernate.cfg.xml

Nombre de la propiedad Propósito

hibernate.current_session_context_class

Provee una estrategia personalizada para determinar el alcance (scope) respecto de cuál es la sesión "actual".

valores posibles jta | thread | managed | la clase personalizada

hibernate.query.factory_class

Elige la implementación del "revisor" (parser) HQL.

valores

posibles org.hibernate.hql.ast.ASTQueryTranslatorFactory oorg.hibernate.hql.classic.Classi

cQueryTranslatorFactory

hibernate.query.substitutions

Mapeo (sustitución) de símbolos en las consultas de Hibernate a símbolos de SQL. (Dichos

símbolos pueden ser funciones o nombres literales, por ejemplo).

por ejemplo hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC

hibernate.hbm2ddl.auto

Exporta o valida automáticamente el esquema DDL a la base de datos cuando la SessionFactory es

creada. Con create-drop, el esquema de base de datos será borrado cuando la SessionFactory se

cierre explícitamente.

valores posibles validate | update | create | create-drop

Page 20: 2. Hibernate Conceptos

Anexos• Dialectos SQL de Hibernate (hibernate.dialect)

Base de datos relacional 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 with InnoDB org.hibernate.dialect.MySQLInnoDBDialect

MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect

Oracle (any version) org.hibernate.dialect.OracleDialect

Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect

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.FirebirdDialect

Page 21: 2. Hibernate Conceptos

Anexos

Elementos XML en los archivos de mapeo

Page 22: 2. Hibernate Conceptos

• <hibernate-mapping>

(1) schema (optativo): El nombre de un esquema de BD

(2) catalog (optativo): El nombre de un catálogo de BD

(3) default-cascade (optativo - por defecto, none): El estilo por defecto de propagación en cascada

(4) default-access (optativo - por defecto, property): La estrategia que Hibernate debería usar para acceder a todas las propiedades. Puede ser una implementacíón personalizada de PropertyAccessor.

(5) default-lazy (optativo - por defecto, true): El valor por defecto para los atributos lazy no especificados de clases y colecciones.

(6) auto-import (optativo - por defecto true): Especifica si se puede usar nombres de clase no calificados (de clases en el mapeo) el en lenguaje de consultas.

(7) package (optativo): Especifica un prefijo de paquete a ser asumido, para las clases no calificadas en el documento de mapeo.

Page 23: 2. Hibernate Conceptos

• <class>

Page 24: 2. Hibernate Conceptos

• <class>-1 name (optativo): El nombre (totalmente calificado) de la clase (o interfaz) persistente de Java. Si este atributo está ausente, se asume que no se trata de una

entidad POJO.

-2 table (optativo - por defecto el nombre no calificado de la clase): El nombre de su tabla en la base de datos

-3 discriminator-value (optativo - por defecto, el nombre de la clase): Un valor que distingue entre subclases individuales, usado para comportamiento

polimórfico. null y not null también son valores aceptables.

-4 mutable (optativo, por defecto, true): Especifica si las instancias de esta clase son o no mutables.

-5 schema (optativo): Suplanta al nombre de esquema especificado por el elemento <hibernate-mapping> raíz.

-6 catalog (optativo): Suplanta al nombre de catálogo especificado por el elemento <hibernate-mapping> raíz.

-7 proxy (optativo): Especifica una interfaz a utilizar para los proxies de inicialización perezosa. Se puede especificar el nombre de la clase misma.

-8 dynamic-update (optativo, por defecto false): Especifica que los comandos SQL UPDATE deberían ser generados en tiempo de ejecución, y contener sólo

aquéllas comlumnas cuyos valores hayan cambiado.

-9 dynamic-insert (optativo, por defecto, false): Especifica que se deberían generar comandos SQL INSERT en tiempo de ejecución, conteniendo sólo las

columnas cuyos valores son no nulos.

-10 select-before-update (optativo, por defecto false): Especifica que Hibernate nunca debería ejecutar un UPDATE SQL a menos que esté seguro de que en

realidad se está modificando algún objeto. En algunos casos (en realidad, sólo cuando un objeto transitorio ha sido asociado con una nueva sesión

usando update()), esto significa que Hibernate ejecutará un comando SQLSELECT adicional, para determinar si un en realidad un UPDATE es necesario.

-11 polymorphism (optativo, por defecto, implicit): Determina si se usa polimorfismo explícito o implícito.

-12 where (optativo) especifica una condición SQL WHERE arbitraria a ser usada cuando se seleccionen objetos de esta clase.

-13 persister (optativo): Especifica un ClassPersister hecho a medida.

-14 batch-size (optativo, por defecto, 1) especifica un "tamaño de lote" para capturar instancias de esta clase por identificador.

-15 optimistic-lock (optativo, por defecto, version): Determina la estrategia de "locking" optimista.

-16 lazy (optativo): La captura haragana puede ser completamente inhabilitada espefificando lazy="false".

-17 entity-name (optativo, por defecto, el nombre de la clase): Hibernate3 permite que una clase sea mapeada muchas veces (potencialmente, a distintas tablas), y

permite mapeos de entidades qie estén representados por Maps a nivel de Java, En estos casos, se debería proveer un nombre arbitrario explícito para la entidad.

-18 check (optativo): Una expresión SQL arbitraria usada para generar una constraint tipo check multifila a usar durante la generación automática del esquema.

-19 rowid (optativo): Hibernate puede usar los vulgarmente llamados ROWIDs, en aquellas DB que lo soporten. Por ejemplo, en Oracle, Hibernate puede usar la

columna adicional rowid para actualizar más rapidamente, si usted configura esta opción a rowid. Un ROWID es un detalle de implementación, y representa la

ubicación física de una t-upla alamacenada.

-20 subselect (optativo): Mapea una entidad inmutable y de sólo-lectura a un subselect de la base de datos. Es útil si se quiere tener una vista en lugar de una tabla,

pero no se cuenta con una vista en la base de datos.

-21 abstract (optativo): Usado para marcar superclases abstractas en jerarquías de <union-subclass>.

Page 25: 2. Hibernate Conceptos

• <id>

-1 name (optativo): El nombre de la propiedad indentificadora.

-2 type (optativo): Un nombre que indica el tipo de Hibernate

-3 column (optativo, por defecto, el nombre de la propiedad): El nombre de la columna de la clave primaria

-4 unsaved-value (optativo, por defecto, un valor "adecuado"): Una propiedad identficadora que indica que una

instancia ha sido recientemente instanciada (no grabada), distinguiéndola de las instancias desprendidas que

fueron grabadas o cargadas en una sesión previa.

-5 access (optativo, por defecto, property): La estrategia que Hibernate debería usar para acceder al valor de la

propiedad.

Page 26: 2. Hibernate Conceptos

• <property>

-1 name: el nombre de la propiedad, com una letra minúscula inicial.

-2 column (optativo, por defecto, the property name): el nombre de la columna de la tabla en la base de datos mapeada. También puede especificarse con

elemento(s) <column> anidados.

-3 type (optativo): un nombre que indica el tipo de Hibernate.

-4 update, insert (optativo, por defecto, true) : indica que las columnas mapeadas deben ser incluidas en los comandos SQL UPDATE y/o INSERT.

Asignarles false a las dos permite una propiedad puramente "derivada", cuyo valor es inicializado solamente por alguna otra propieadad que se mapea

a la(s) misma(s) columna(s), o por un trigger, u otra aplicación.

-5 formula (optativo): una expresión SQL que define el valor de una propiedad computada. Las propiedades computadas no tienen un mapeo de columna

propio.

-6 access (optativo, por defecto, property): La estrategia que Hibernate debería usar para acceder al valor de esta propiedad.

-7 lazy (optativo, por defecto, false): Especifica que esta propiedad debería ser obtenida de manera haragana, cuando se acceda por primera vez a la

variable de instancia (requiere implementación bytecode en tiempo de ejecución).

-8 unique (optativo): Habilita la generación del lenguaje de definición de datos (DDL) para una constraint única para las columnas. También permite que

esto sea apuntado por una property-ref.

-9 not-null (optativo): Habilita la generación del lenguaje de definición de datos (DDL) para una constraint de nulabilidad para las columnas.

-10 optimistic-lock (optativo, por defecto, true): Especifica si las actualizaciones al valor de esta propiedad requieren o no un "lock" optimista. En otras

palabras, determina si pueden ocurrir incrementos de versión cuando la propiedad está "sucia".

-11 generated (optativo, por defecto, never): Especifica que el valor de esta propiedad es en realidad generado por la base de datos.

Page 27: 2. Hibernate Conceptos

• Value Types básicosLos tipos de mapeo básicos ya incluidos pueden ser someramente clasificados en:

integer, long, short, float, double, character, byte, boolean, yes_no, true_false

Mapeos de los respectivos tipos primitivos o "clases envoltorio" a valores de columna SQL (que dependen de la marca de la

BD): boolean, yes_no y true_false son todas codificaciones alternativas de un boolean o un java.lang.Boolean de Java.

string

Un mapeo de tipo de java.lang.String a VARCHAR (o el VARCHAR2 de Oracle).

date, time, timestamp

Mapeos de tipo de java.util.Date y sus subclases a tipos SQL DATE, TIME y TIMESTAMP (o equivalentes).

calendar, calendar_date

Mapeos de tipo de java.util.Calendar a tipos SQL TIMESTAMP y DATE (o equivalente).

big_decimal, big_integer

Mapeos de tipo de java.math.BigDecimal y java.math.BigInteger a NUMERIC (e el NUMBER de Oracle).

locale, timezone, currency

Mapeos de tipo de java.util.Locale, java.util.TimeZone y java.util.Currency a VARCHAR (o el VARCHAR2 de Oracle). Las instancias

de Locale y Currency son mapeadas a sus códigos ISO. Las instancias de TimeZone son mapeadas a su ID.

class

Un mapeo de tipo java.lang.Class a VARCHAR (o la VARCHAR2 de Oracle). Una Class es mapeada con su nombre enteramente

calificado.

Page 28: 2. Hibernate Conceptos

• Value Types básicos

binary

Mapea arrays de bytes a un tipo SQL binario apropiado.

text

Mapea cadenas largas de Java los tipos CLOB o TEXT de SQL.

serializable

Mapea tipos serializables de Java a un tipo SQL binario apropiado. También se puede indicar el tipo de Hibernate serializable con el

nombre de una clase o interfaz serializable de Java, que no sea por defecto un tipo básico.

clob, blob

Mapeos de tipo para las clases JDBC java.sql.Clob y java.sql.Blob. Estos tipos pueden ser inconvenientes para algunas aplicaciones,

dado que los objetos clob y blob no pueden ser reusados fuera de una transacción. (Más aún, el soporte de drivers es esporádico e

inconsistente).

imm_date, imm_time, imm_timestamp, imm_calendar, imm_calendar_date, imm_serializable, imm_binary

Mapeos de tipo para lo que normalmente se considera "tipos mutables de Java", en los que Hibernate adopta ciertas optimizaciones

que son sólo apropiadas para tipos inmutables de Java, y la aplicación trata al objeto como inmutable. Por ejemplo: para una

instancia mapeada como imm_timestamp, no se debería invocar Date.setTime(). Para cambiar el valor de la propiedad (y hacer que

ese valor cambiado sea persistido), la aplicación tiene que asignarle un nuevo objeto (no idéntico) a la propiedad.

Los identificadores únicos de las entidades y colecciones pueden ser de cualquier tipo básico excepto binary, blob y clob. (Los

identiicadores compuestos también están permitidos, ver más adelante).

Los "value types" básicos tienen constantes Type definidas en org.hibernate.Hibernate. Por ejemplo, Hibernate.STRING representa

el tipo string.