Click here to load reader

Hibernate 10

Embed Size (px)

DESCRIPTION

Documentacion de hibernate

Citation preview

Captulo 10. Trabajo con objetos10.1. Estados de objeto de Hibernate10.2. Haciendo los objetos persistentes10.3. Cargando un objeto10.4. Consultas10.4.1. Ejecucin de consultas10.4.2. Filtracin de colecciones10.4.3. Consultas de criterios10.4.4. Consultas en SQL nativo10.5. Modificacin de objetos persistentes10.6. Modificacin de objetos separados10.7. Deteccin automtica de estado10.8. Borrado de objetos persistentes10.9. Replicacin de objetos entre dos almacenamientos de datos diferentes10.10. Limpieza (flushing) de la sesin10.11. Persistencia transitiva10.12. Utilizacin de metadatosHibernate es una solucin completa de mapeo objeto/relacional que no slo proteje al desarrollador de los detalles del sistema de administracin de la base datos subyacente, sino que adems ofreceadministracin de estadode objetos. Contrario a la administracin dedeclaracionesSQL en capas comunes de persistencia JDBC/SQL, esta es una vista natural orientada a objetos de la persistencia en aplicaciones Java.En otras palabras, los desarrolladores de aplicaciones de Hibernate siempre deben pensar en elestadode sus objetos, y no necesariamente en la ejecucin de declaraciones SQL. Hibernate se ocupa de esto y es slamente relevante para el desarrollador de la aplicacin al afinar el rendimiento del sistema.10.1. Estados de objeto de HibernateHibernate define y soporta los siguientes estados de objeto: Transitorio- un objeto es transitorio si ha sido recin instanciado utilizando el operadornew, y no est asociado a unaSessionde Hibernate. No tiene una representacin persistente en la base de datos y no se le ha asignado un valor identificador. Las instancias transitorias sern destrudas por el recolector de basura si la aplicacin no mantiene ms una referencia. Utiliza laSessionde Hibernate para hacer un objeto persistente (y deja que Hibernate se ocupe de las declaraciones SQL que necesitan ejecutarse para esta transicin). Persistente- una instancia persistente tiene una representacin en la base de datos y un valor identificador. Puede haber sido guardado o cargado, sin embargo, por definicin, se encuentra en el mbito de unaSession. Hibernate detectar cualquier cambio realizado a un objeto en estado persistente y sincronizar el estado con la base de datos cuando se complete la unidad de trabajo. Los desarrolladores no ejecutan declaracionesUPDATEmanuales, o declaracionesDELETEcuando un objeto se debe poner como transitorio. Separado- una instancia separada es un objeto que se ha hecho persistente, pero suSessionha sido cerrada. La referencia al objeto todava es vlida, por supuesto, y la instancia separada podra incluso ser modificada en este estado. Una instancia separada puede ser re-unida a una nuevaSessionms tarde, hacindola persistente de nuevo (con todas las modificaciones). Este aspecto habilita un modelo de programacin para unidades de trabajo de ejecucin larga que requieren tiempo-para-pensar por parte del usuario. Las llamamostransaccciones de aplicacin, por ejemplo, una unidad de trabajo desde el punto de vista del usuario.Discutiremos ahora los estados y transiciones de estados (y los mtodos de Hibernate que disparan una transicin) en ms detalle.10.2. Haciendo los objetos persistentesLas instancias recin instanciadas de una clase persistente, Hibernate las considera comotransitorias. Podemos hacer una instancia transitoriapersistenteasocindola con una sesin:DomesticCatfritz=newDomesticCat();fritz.setColor(Color.GINGER);fritz.setSex('M');fritz.setName("Fritz");LonggeneratedId=(Long)sess.save(fritz);SiCattiene un identificador generado, el identificador es generado y asignado alcatcuando se llama asave(). SiCattiene un identificadorassigned, o una clave compuesta, el identificador debe ser asignado a la instancia decatantes de llamar asave(). Tambin puede utilizarpersist()en vez desave(), con la semntica definida en el borrador de EJB3. persist()hace que una instancia transitoria sea persistente. Sin embargo, no garantiza que el valor identificador sea asignado a la instancia persistente inmediatamente, la tarea puede tener lugar durante el vaciado.persist()tambin garantiza que no ejecutar una declaracinINSERTsi se llama por fuera de los lmites de una transaccin. Esto es til en conversaciones largas con un contexto extendido sesin/persistencia. save()s garantiza el retorno de un identificador. Si se tiene que ejecutar un INSERT para obtener el identificador ( por ejemplo, generador "identidad", no "secuencia"), este INSERT tiene lugar inmediatamente sin importar si se encuentra dentro o fuera de una transaccin. Esto es problemtico en una conversacin larga con un contexto extendido sesin/persistencia.Opcionalmente, puede asignar el identificador utilizando una versin sobrecargada desave().DomesticCatpk=newDomesticCat();pk.setColor(Color.TABBY);pk.setSex('F');pk.setName("PK");pk.setKittens(newHashSet());pk.addKitten(fritz);sess.save(pk,newLong(1234));Si el objeto que hace persistente tiene objetos asociados (por ejemplo, la coleccinkittensen el ejemplo anterior), estos objetos pueden ser hechos persistentes en cualquier orden que quiera a menos de que tenga una restriccinNOT NULLsobre una columna clave fornea. Nunca hay riesgo de violar restricciones de clave fornea. Sin embargo, puede que usted viole una restriccinNOT NULLsi llama asave()sobre los objetos en el orden equivocado.Usualmente no se preocupe de este detalle, pues muy probablemente utilizar la funcionalidad depersistencia transitivade Hibernate para guardar los objetos asociados automticamente. Entonces, ni siquiera tienen lugar violaciones de restriccionesNOT NULL- Hibernate se ocupar de todo. Ms adelante en este captulo se discute la persistencia transitiva.10.3. Cargando un objetoLos mtodosload()deSessionle proporcionan una forma de recuperar una instancia persistente si ya conoce su identificador.load()toma un objeto clase y carga el estado dentro de una instancia recin instanciada de esa clase, en un estado persistente.Catfritz=(Cat)sess.load(Cat.class,generatedId);//youneedtowrapprimitiveidentifierslongid=1234;DomesticCatpk=(DomesticCat)sess.load(DomesticCat.class,newLong(id));Alternativamente, puede cargar estado dentro de una instancia dada:Catcat=newDomesticCat();//loadpk'sstateintocatsess.load(cat,newLong(pkId));Setkittens=cat.getKittens();Note queload()lanzar una excepcin irrecuperable si no hay una fila correspondiente en la base de datos. Si la clase se mapea con un proxy,load()slo retorna un proxy no inicializado y no llamar realmente a la base de datos hasta que invoque un mtodo del proxy. Este comportamiento es muy til si desea crear una asociacin a un objeto sin cargarlo realmente de la base de datos. Adems permite que mltiples instancias sean cargadas como un lote si se definebatch-sizepara el mapeo de la clase.Si no tiene la certeza de que existe una fila correspondiente, debe utilizar el mtodoget(), que llama a la base de datos inmediatamente y devuelve nulo si no existe una fila correspondiente.Catcat=(Cat)sess.get(Cat.class,id);if(cat==null){cat=newCat();sess.save(cat,id);}returncat;Incluso puede cargar un objeto utilizando unSELECT ... FOR UPDATEde SQL, usando unLockMode. Consulte la documentacin de la API para obtener ms informacin.Catcat=(Cat)sess.get(Cat.class,id,LockMode.UPGRADE);Ningunainstancia asociada o coleccin contenida es seleccionada para actualizacion -FOR UPDATE, a menos de que decida especificarlockoallcomo un estilo de cascada para la asociacin.Es posible volver a cargar un objeto y todas sus colecciones en cualquier momento, utilizando el mtodorefresh(). Esto es til cuando se usan disparadores de base de datos para inicializar algunas de las propiedades del objeto.sess.save(cat);sess.flush();//forcetheSQLINSERTsess.refresh(cat);//re-readthestate(afterthetriggerexecutes)How much does Hibernate load from the database and how many SQLSELECTs will it use? This depends on thefetching strategy. This is explained inSeccin20.1, Estrategias de recuperacin.10.4. ConsultasSi no conoce los identificadores de los objetos que est buscando, necesita una consulta. Hibernate soporta un lenguaje de consulta orientado a objetos (HQL) fcil de usar pero potente a la vez. Para la creacin de consultas programticas, Hibernate soporta una funcionalidad sofisticada de consulta de Criteria y Example (QBC y QBE). Tambin puede expresar su consulta en el SQL nativo de su base de datos, con soporte opcional de Hibernate para la conversin del conjunto de resultados a objetos.10.4.1. Ejecucin de consultasLas consultas HQL y SQL nativas son representadas con una instancia deorg.hibernate.Query. Esta interfaz ofrece mtodos para ligar parmetros, manejo del conjunto resultado, y para la ejecucin de la consulta real. Siempre obtiene unaQueryutilizando laSessionactual:Listcats=session.createQuery("fromCatascatwherecat.birthdate