Tiempo: ?h Hibernate Departamento de Lenguajes y Sistemas Informá Informáticos Versión original: Autor (mes 200?) Última revisión: Autor (mes 200?); descripción cambios. escuela técnica superior de ingeniería informática Grupo de Ingenierí Ingeniería del Software Febrero 2007 [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Hibernate • Capa de Persistencia (Hibernate (Hibernate)) Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía – Trabaja con POJO’s – Framework ligero Adiós servidor de aplicaciones – No es una especificación pero es el más usado – ORM (Object/Relation Mapping) – Mapeo en ficheros independientes(.hbm.xml) – Hibernate.cfg.xml – Clases java para trabajar con BD’s – ¿Herramienta para generar esto automáticamente? – HibernateTools Sevilla, abril de 2007 Grupo de Ingeniería del Software 1 [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Hibernate • POJO’ POJO’s Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía – Representan el Modelo del dominio – Muchas veces, tambié también los datos a almacenar – Implementació Implementación • Constructor sin pará parámetros • Atributos privados con sus get/ get/set • Relaciones como referencias y Collections (1 y * respectivamente) • Enumeraciones y componentes como referencias • Métodos de negocio (los dejaremos fuera) • Serializable, Serializable, HashCode y Equals [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Sevilla, abril de 2007 Grupo de Ingeniería del Software Hibernate • Ejemplo Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía Sevilla, abril de 2007 Grupo de Ingeniería del Software 2 [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Sevilla, abril de 2007 Grupo de Ingeniería del Software public Serializable publicclass classPersona Personaimplements implementsHibernate Serializable {{ private Long id; ; id private Long id; private privateString Stringnombre; nombre; private privateint intedad; edad; private ; direccionTrabajo privateDireccion DirecciondireccionTrabajo; direccionTrabajo; private ; direccionCasa privateDireccion DirecciondireccionCasa; direccionCasa; private > vehiculos >(); Collection<Vehiculo HashSet<Vehiculo privateCollection<Vehiculo> Collection<Vehiculo> vehiculos==new newHashSet<Vehiculo>(); HashSet<Vehiculo>(); public (){ return ; }} getId this.id publicLong LonggetId(){ getId(){ returnthis.id; this.id; public ){ this.id ; }} id id publicvoid voidsetId(Long setId(Longid){ id){ this.id==id; id; public (){ return ; }} getEdad this.edad publicint intgetEdad(){ getEdad(){ returnthis.edad; this.edad; public publicvoid voidsetEdad(int setEdad(intedad){ edad){this.edad this.edad==edad; edad;}} public (){ return ; }} getNombre this.nombre publicString StringgetNombre(){ getNombre(){ returnthis.nombre; this.nombre; public ){ this.nombre ; }} nom nom publicvoid voidsetNombre(String setNombre(Stringnom){ nom){ this.nombre==nom; nom; public () {{return ; }} getDireccionTrabajo this.direccionTrabajo publicDireccion DirecciongetDireccionTrabajo() getDireccionTrabajo() returnthis.direccionTrabajo; this.direccionTrabajo; public Direccion d) publicvoid voidsetDireccionTrabajo setDireccionTrabajo((Direccion d){{this.direccionTrabajo this.direccionTrabajo==d; d;}} public () {{return ; }} getDireccionCasa this.direccionCasa publicDireccion DirecciongetDireccionCasa() getDireccionCasa() returnthis.direccionCasa; this.direccionCasa; public Direccion d) publicvoid voidsetDireccionCasa setDireccionCasa((Direccion d){{this.direccionCasa this.direccionCasa==d; d;}} public > getVehiculos() () {return return this.vehiculos;} ;} Collection<Vehiculo getVehiculos {{return this.vehiculos publicCollection<Vehiculo> Collection<Vehiculo> getVehiculos() this.vehiculos;} public > vehiculos){ ){ setVehiculos(Collection<Vehiculo vehiculos publicvoid voidsetVehiculos(Collection<Vehiculo> setVehiculos(Collection<Vehiculo> vehiculos){ this.vehiculos ; vehiculos this.vehiculos==vehiculos; vehiculos; }} public publicvoid voidaddVehiculo(Vehiculo addVehiculo(Vehiculovehiculo) vehiculo){{ this.vehiculos.add(vehiculo); ); this.vehiculos.add(vehiculo this.vehiculos.add(vehiculo); /*vehiculo.setPersona(this vehiculo.setPersona(this);*/ );*/ /* /*vehiculo.setPersona(this);*/ }} public ){… …} object publicboolean booleanequals(Object equals(Objectobject){ object){…} public (){… …} hashCode publicint inthashCode(){ hashCode(){…} }} Hibernate • Mapeo de clases Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía <?xml -8"?> encoding="UTF <?xmlversion="1.0" version="1.0"encoding="UTFencoding="UTF-8"?> <!DOCTYPE -mapping PUBLIC -//Hibernate/Hibernate hibernate ""-//Hibernate/Hibernate <!DOCTYPEhibernatehibernate-mapping PUBLIC"Mapping DTD 3.0//EN" Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping"http://hibernate.sourceforge.net/hibernate mapping-3.0.dtd"> "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <hibernate <hibernate-mapping> <class com.garage.Persona"" table="PERSONA" > name=" <classname="com.garage.Persona name="com.garage.Persona" table="PERSONA"……> <id java.lang.Long"" unsaved-value="null"> type=" unsaved <idname="id" name="id"type="java.lang.Long type="java.lang.Long" unsaved-value="null"> <column -type="BIGINT"/> sql <columnname="ID" name="ID"sqlsql-type="BIGINT"/> <generator <generatorclass="native"> class="native"> </generator> </generator> </id> </id> <property nombre"" type="java.lang.String java.lang.String"> "> name=" type=" <propertyname="nombre name="nombre" type="java.lang.String"> <column name="NOMBRE" notnull="true" unique="false" not <column name="NOMBRE" not-null="true" unique="false" sql-type="VARCHAR(255)"/> sql sql-type="VARCHAR(255)"/> </property> </property> <property edad"" type="int int““> name=" type=" <propertyname="edad name="edad" type="int“> <column -null="true" unique="false" not sql <columnname="EDAD" name="EDAD"notnot-null="true" unique="false"sqlsqltype="INTEGER"/> type="INTEGER"/> </property> </property> </class class> > </ </class> </hibernate hibernate--mapping> </ mapping> </hibernate-mapping> Sevilla, abril de 2007 Grupo de Ingeniería del Software 3 [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Hibernate • Mapeo de Relaciones Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía – En el fichero Persona.hbm.xml : <set vehiculos"" order-by="PERSONA_FK“ name=" order by="PERSONA_FK“> <setname="vehiculos name="vehiculos" order-by="PERSONA_FK“> <key foreignkey="VEHICULO_PERSONA_FKC"> foreign <key foreign-key="VEHICULO_PERSONA_FKC"> <column -type="BIGINT"/> sql <columnname="PERSONA_FK" name="PERSONA_FK"sqlsql-type="BIGINT"/> </key> </key> <one-tocom.garage.Vehiculo"/> "/> <one to-many class="com.garage.Vehiculo class=" <one-to-many class="com.garage.Vehiculo"/> </set set> > </ </set> – En Vehiculo.hbm.xml : <many-to“ <many to-one name="persona“ name="persona <many-to-one name="persona“ class="com.garage.Persona com.garage.Persona"" class=" class="com.garage.Persona" foreign-key="VEHICULO_PERSONA_FKC"> foreign foreign-key="VEHICULO_PERSONA_FKC"> <column -null="true" sqlnot sql <columnname="PERSONA_FK" name="PERSONA_FK"notnot-null="true" sqltype="BIGINT"/> type="BIGINT"/> </many many--to</ to-one> one> </many-to-one> [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Sevilla, abril de 2007 Grupo de Ingeniería del Software Hibernate • Mapeo de Componentes Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía <component direccionCasa"" class=" . name=" com.garage <componentname="direccionCasa name="direccionCasa" class="com.garage. com.garage. Direccion"> "> Direccion Direccion"> <property calle"" type="java.lang.String java.lang.String"> "> name=" type=" <propertyname="calle name="calle" type="java.lang.String"> <column name="DIRECCION_CASA_CALLE" notnot <column name="DIRECCION_CASA_CALLE" notnull="true" -type="VARCHAR(255)"/> sql null="true"unique="false" unique="false"sqlsql-type="VARCHAR(255)"/> </property> </property> <property java.lang.String"> "> type=" <propertyname="ciudad" name="ciudad"type="java.lang.String type="java.lang.String"> <column name="DIRECCION_CASA_CIUDAD" notnot <column name="DIRECCION_CASA_CIUDAD" notnull="true" -type="VARCHAR(255)"/> sql null="true"unique="false" unique="false"sqlsql-type="VARCHAR(255)"/> </property> </property> <property codpost"" type="java.lang.String java.lang.String"> "> name=" type=" <propertyname="codpost name="codpost" type="java.lang.String"> <column not <columnname="DIRECCION_CASA_CODPOST" name="DIRECCION_CASA_CODPOST"notnotnull="true" -type="VARCHAR(255)"/> sql null="true"unique="false" unique="false"sqlsql-type="VARCHAR(255)"/> </property> </property> </component> </component> Sevilla, abril de 2007 Grupo de Ingeniería del Software 4 [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Hibernate • Mapeo de Herencia (Una tabla por clase concreta) Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía <class com.garage.Moto"" table="MOTO" name=" dynamic <classname="com.garage.Moto name="com.garage.Moto" table="MOTO"dynamicdynamicinsert="false" dynamicupdate="false"> dynamic insert="false" dynamic-update="false"> <id java.lang.Long"" unsaved-value="null"> type=" unsaved <idname="id" name="id"type="java.lang.Long type="java.lang.Long" unsaved-value="null"> <column -type="BIGINT"/> sql <columnname="ID" name="ID"sqlsql-type="BIGINT"/> <generator <generatorclass="native"> class="native"> </generator> </generator> </id> </id> <property “modelo" int"> "> name= modelo" type="int type=" <propertyname=“ name=“modelo" type="int"> <column “MODELO" not-null="true" unique="false" name= not <columnname=“ name=“MODELO" not-null="true" unique="false" sql-type="INTEGER"/> sql sql-type="INTEGER"/> </property> </property> <many-tocom.garage.Persona"" <many to-one name="persona" class=" <many-to-one name="persona"class="com.garage.Persona class="com.garage.Persona" foreign-key="VEHICULO_PERSONA_FKC" >> foreign foreign-key="VEHICULO_PERSONA_FKC" <column -null="true" sqlnot sql <columnname="PERSONA_FK" name="PERSONA_FK"notnot-null="true" sqltype="BIGINT"/> type="BIGINT"/> </many-to</many to-one> </many-to-one> <property “permiteSidecar" “boolean"> name= permiteSidecar" type=“ type= boolean"> <propertyname=“ name=“permiteSidecar" type=“boolean"> <column “PERMITE_SIDECAR" not-null="true" name= not <columnname=“ name=“PERMITE_SIDECAR" not-null="true" unique="false" -type="VARCHAR(255)"/> sql unique="false"sqlsql-type="VARCHAR(255)"/> </property property> > </ </property> </class class> > </ </class> [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Sevilla, abril de 2007 Grupo de Ingeniería del Software Hibernate Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía • Mapeo de Herencia (Una tabla por jerarquí jerarquía de clases) <class com.garage.Vehiculo"" table="VEHICULO" name=" <classname="com.garage.Vehiculo name="com.garage.Vehiculo" table="VEHICULO">> <id java.lang.Long"" unsaved-value="null"> type=" unsaved <idname="id" name="id"type="java.lang.Long type="java.lang.Long" unsaved-value="null"> <column -type="BIGINT"/> sql <columnname="ID" name="ID"sqlsql-type="BIGINT"/> <generator <generatorclass="native"> class="native"> </generator> </generator> </id> </id> <discriminator <discriminatorcolumn="class" column="class"type="string"/> type="string"/> <property “modelo" int"> "> name= modelo" type="int type=" <propertyname=“ name=“modelo" type="int"> <column name=“ “ MODELO" notnull="true" name= not <column name=“MODELO" not-null="true"unique="false" unique="false" sql-type="INTEGER"/> sql sql-type="INTEGER"/> </property> </property> …… <subclass com.garage.Moto"" discriminatorname=" discriminator <subclassname="com.garage.Moto name="com.garage.Moto" discriminatorvalue="Moto Moto" " abstract="false"> value=" value="Moto" abstract="false"> <property “permiteSidecar" “boolean"> name= permiteSidecar" type=“ type= boolean"> <propertyname=“ name=“permiteSidecar" type=“boolean"> <column “PERMITE_SIDECAR" not-null="true" name= not <columnname=“ name=“PERMITE_SIDECAR" not-null="true" unique="false" -type="VARCHAR(255)"/> sql unique="false"sqlsql-type="VARCHAR(255)"/> </property> </property> </subclass> </subclass> </class class> > </ </class> Sevilla, abril de 2007 Grupo de Ingeniería del Software 5 [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Hibernate • Mapeo de Herencia (Una tabla por subclase) Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía <class Vehiculo"" table="VEHICULO"> name=" <classname="Vehiculo name="Vehiculo" table="VEHICULO"> <id java.lang.Long"" unsaved-value="null"> type=" unsaved <idname="id" name="id"type="java.lang.Long type="java.lang.Long" unsaved-value="null"> <column name="ID" sqltype="BIGINT"/> sql <column name="ID" sql-type="BIGINT"/> <generator <generatorclass="native"> class="native"> </generator> </generator> </id> </id> <property “modelo" int"> ">… …</property> name= modelo" type="int type=" <propertyname=“ name=“modelo" type="int">…</property> ... ... <joined-subclass name="com.garage.Moto com.garage.Moto"" table="MOTO" <joined name=" <joined-subclass name="com.garage.Moto" table="MOTO" abstract="false"> abstract="false"> <key -key="MOTOIFKC"> foreign <keyforeignforeign-key="MOTOIFKC"> <column -type="BIGINT"/> sql <columnname="ID" name="ID"sqlsql-type="BIGINT"/> </key> </key> <property “permiteSidecar" “boolean"> name= permiteSidecar" type=“ type= boolean"> <propertyname=“ name=“permiteSidecar" type=“boolean"> <column “PERMITE_SIDECAR" not-null="true" name= not <columnname=“ name=“PERMITE_SIDECAR" not-null="true" unique="false" -type="VARCHAR(255)"/> sql unique="false"sqlsql-type="VARCHAR(255)"/> </property> </property> </joined-subclass> </joined </joined-subclass> ... ... </class> </class> </hibernate-mapping> </hibernate </hibernate-mapping> [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Sevilla, abril de 2007 Grupo de Ingeniería del Software Hibernate • Hibernate.cfg.xml Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía <?xml > <?xmlversion="1.0" version="1.0"……> <hibernate-configuration> <hibernate <hibernate-configuration> <session-factory> <session <session-factory> <!--- properties > <! -<!-properties--> --> <property connection.driver_class"> "> name=" <propertyname="connection.driver_class name="connection.driver_class"> com.mysql.jdbc.Driver com.mysql.jdbc.Driver </property> </property> <property connection.username">root</property> ">root</property> name=" <propertyname="connection.username name="connection.username">root</property> <property connection.password">admin</property> ">admin</property> name=" <propertyname="connection.password name="connection.password">admin</property> <property connection.url"> "> name=" <propertyname="connection.url name="connection.url"> jdbc:mysql://localhost/basededatos jdbc:mysql://localhost/basededatos </property> </property> <property show_sql">true</property> ">true</property> name=" <propertyname="show_sql name="show_sql">true</property> <property <propertyname="dialect"> name="dialect"> org.hibernate.dialect.MySQLDialect org.hibernate.dialect.MySQLDialect </property> </property> <!--- mapping > <! -<!-mappingfiles files--> --> <mapping Persona.hbm.xml"/> "/> resource="com/garage/ <mappingresource="com/garage/Persona.hbm.xml resource="com/garage/Persona.hbm.xml"/> <mapping Vehiculo.hbm.xml"/> "/> resource="com/garage/ <mappingresource="com/garage/Vehiculo.hbm.xml resource="com/garage/Vehiculo.hbm.xml"/> </session session--factory> </ factory> </session-factory> </hibernate hibernate--configuration> </ configuration> </hibernate-configuration> Sevilla, abril de 2007 Grupo de Ingeniería del Software 6 [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Hibernate • Manejo de Sesiones y transacciones Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía SessionFactory SessionFactorysessionFactory sessionFactory==new new Configuration().configure().buildSessionFactory(); (); Configuration().configure().buildSessionFactory Configuration().configure().buildSessionFactory(); Session ses = sessionFactory.openSession(); (); sessionFactory.openSession Session ses = sessionFactory.openSession(); Transaction (); ses.beginTransaction Transactiontx tx==ses.beginTransaction(); ses.beginTransaction(); tx.commit(); (); tx.commit tx.commit(); tx.rollback(); (); tx.rollback tx.rollback(); ses.close(); (); ses.close ses.close(); • HibernateException • Funciones de hibernate (Create, Delete y Update) Persona Personapp==new newPersona(); Persona(); session.Load(p,pkId); ); // session.Load(p,pkId session.Load(p,pkId); //ooGet() Get() Session.save(p); ); Session.save(p Session.save(p); Session.saveOrUpdate(p); ); Session.saveOrUpdate(p Session.saveOrUpdate(p); session.Delete(p); ); session.Delete(p session.Delete(p); p.setNombre( (“Juan” p.setNombre Juan”); p.setNombre(“Juan”); session.update(p); ); session.update(p session.update(p); [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Sevilla, abril de 2007 Grupo de Ingeniería del Software Hibernate • Funciones de Hibernate (Read) Read) Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía List ) session.createCriteria(Persona.class Listpersonas personas==session.createCriteria(Persona.class) session.createCriteria(Persona.class) .Add(Restrictions.like("nombre", Ramon%") ") )) Add(Restrictions.like("nombre", "Ramon% ""Ramon%") .Add(Restrictions.like("nombre", // //elelnombre nombredebe debeser serRamon Ramonyylo loque quesiga siga .Add(Restrictions.between("edad", ("edad", minAge, , maxAge) ) )) Add(Restrictions.between minAge maxAge .Add(Restrictions.between("edad", minAge, maxAge) //la á entre est //laedad edadestá está entremin minyymax max .Add(Restrictions.or( //o Add(Restrictions.or( .Add(Restrictions.or( //ola laedad edades escero cerooonull null Restrictions.eq( ( "edad", (0) ),), Restrictions.eq Integer Restrictions.eq( "edad",new newInteger(0) Integer(0) Restrictions.isNull("edad") ("edad") Restrictions.isNull Restrictions.isNull("edad") )) )) .Add(Restrictions.in( [] {{"Ramon", Add(Restrictions.in( "nombre", String .Add(Restrictions.in( "nombre",new newString[] String[] "Ramon", "Paco", "Paco","Fran" "Fran"}})))) // ón, Paco Ram //elelnombre nombresolo solopuede puedeser serRamó Ramón, PacoooFran Fran .Add(Restrictions.disjunction() Add(Restrictions.disjunction() .Add(Restrictions.disjunction() .Add(Restrictions.isNull("edad") Add(Restrictions.isNull("edad") )) .Add(Restrictions.isNull("edad") .Add(Restrictions.eq("edad", (0) )))) Add(Restrictions.eq("edad", new Integer .Add(Restrictions.eq("edad", newInteger(0) Integer(0) .Add(Restrictions.eq("edad", ("edad", new Integer(1) (1) Add(Restrictions.eq Integer .Add(Restrictions.eq("edad", new Integer(1))))) .Add(Restrictions.eq("edad", (2) )))) Add(Restrictions.eq("edad", new Integer .Add(Restrictions.eq("edad", newInteger(2) Integer(2) // la edad solo puede ser null, , 0, 1 o 2 null // la edad solo puede ser null, 0, 1 o 2 )) )) .list(); list(); .list(); Sevilla, abril de 2007 Grupo de Ingeniería del Software 7 [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Hibernate • Patron DAO (java 5) Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía – Recomendado por hibernate public <T, ID > GenericDAO Serializable publicinterface interfaceGenericDAO<T, GenericDAO<T, IDextends extendsSerializable> Serializable> {{ TTfindById(ID findById(IDid, id,boolean booleanlock); lock); List<T> findAll(); (); findAll List<T> findAll(); List<T> , String… … exampleInstance String List<T>findByExample(T findByExample(TexampleInstance, exampleInstance, String… excludeProps); ); excludeProps excludeProps); TTmakePersistent(T makePersistent(Tentity); entity); void voidmakeTransient(T makeTransient(Tentity); entity); }} – Extender para cada pojo public <Persona, GenericDAO publicinterface interfacePersonaDAO PersonaDAOextends extendsGenericDAO<Persona, GenericDAO<Persona, Long> Long> {} {} [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Sevilla, abril de 2007 Grupo de Ingeniería del Software Hibernate • Forma de trabajo Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía Persona Personapp==new newPersona(); Persona(); // Atributo Normal // Atributo Normal p.setNombre("nombre"); "); p.setNombre("nombre p.setNombre("nombre"); // //Componentes Componentes Direccion "," calCas"," "," codCas"); "); Direccion("ciuCas calCas codCas Direcciondd==new newDireccion("ciuCas"," Direccion("ciuCas"," calCas"," codCas"); //constructor //constructorcon conparametros parametros p.setDireccionCasa(d); ); p.setDireccionCasa(d p.setDireccionCasa(d); dd==new Direccion("calDirTra"," "," ciuDirTra"," "," codDirTra"); "); Direccion("calDirTra ciuDirTra codDirTra new Direccion("calDirTra"," ciuDirTra"," codDirTra"); p.setDireccionTrabajo(d); ); p.setDireccionTrabajo(d p.setDireccionTrabajo(d); // //Enumeration Enumeration--constructor constructordesde desdestring string Sexo “HOMBRE"); Sexo.fromString( HOMBRE"); Sexosx sx==Sexo.fromString(“ Sexo.fromString(“HOMBRE"); p.setSexo(sx); ); p.setSexo(sx p.setSexo(sx); //Guardo Guardo // //Guardo DAOFactory ; dfact DAOFactorydfact; dfact; DAOFactory.getInstance(); (); dfact = DAOFactory.getInstance dfact = DAOFactory.getInstance(); Implementar Implementar PersonaDAO pdao = dfact.getPersonaDAO(); (); dfact.getPersonaDAO PersonaDAO pdao = dfact.getPersonaDAO(); HibernateUtils.beginTransaction(); (); HibernateUtils.beginTransaction HibernateUtils.beginTransaction(); Implementar Implementar pdao.makePersistent(p); ); pdao.makePersistent(p pdao.makePersistent(p); HibernateUtils.commitTransaction(); (); HibernateUtils.commitTransaction HibernateUtils.commitTransaction(); Implementar Implementar Sevilla, abril de 2007 Grupo de Ingeniería del Software 8 [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Hibernate • La alternativa – JPA – EJB3 Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos Especificación de SUN – Intervinieron gente de Hibernate y Oracle 1. Introducció Introducción – Trabaja con POJOs 2. POJOs 3.Mapeo de clases – Xml mapping 4. Primitivas de Hibernate – HQL 5. Patró Patrón DAO 6. Alternativa Anotaciones EJB QL – Session y transaction 7. Bibliografí Bibliografía Por contenedor (no Home) – Anoaciones opcionales [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Sevilla, abril de 2007 Grupo de Ingeniería del Software Hibernate • Ejemplo Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía @Entity @Entity public publicclass classPersona Persona{{ private ; id privateLong Longid; id; private privateString Stringnombre; nombre; private > vehiculos >(); Collection<Vehiculo HashSet<Vehiculo privateCollection<Vehiculo> Collection<Vehiculo> vehiculos==new newHashSet<Vehiculo>(); HashSet<Vehiculo>(); @Id(generate=AUTO) =AUTO) @Id(generate @Id(generate=AUTO) public (){ return ; }} getId this.id publicLong LonggetId(){ getId(){ returnthis.id; this.id; public ){ this.id ; }} id id publicvoid voidsetId(Long setId(Longid){ id){ this.id==id; id; @Column(length=500) =500) @Column(length @Column(length=500) public (){ return ; }} getNombre this.nombre publicString StringgetNombre(){ getNombre(){ returnthis.nombre; this.nombre; public ){ this.nombre ; }} nom nom publicvoid voidsetNombre(String setNombre(Stringnom){ nom){ this.nombre==nom; nom; @OneToMany(cascade=ALL) =ALL) @OneToMany(cascade @OneToMany(cascade=ALL) public > getVehiculos() () {return return this.vehiculos;} ;} Collection<Vehiculo getVehiculos {{return this.vehiculos publicCollection<Vehiculo> Collection<Vehiculo> getVehiculos() this.vehiculos;} public > vehiculos){ ){ setVehiculos(Collection<Vehiculo vehiculos publicvoid voidsetVehiculos(Collection<Vehiculo> setVehiculos(Collection<Vehiculo> vehiculos){ this.vehiculos ; vehiculos this.vehiculos==vehiculos; vehiculos; }} public publicvoid voidaddVehiculo(Vehiculo addVehiculo(Vehiculovehiculo) vehiculo){{ this.vehiculos.add(vehiculo); ); this.vehiculos.add(vehiculo this.vehiculos.add(vehiculo); /*vehiculo.setPersona(this vehiculo.setPersona(this);*/ );*/ /* /*vehiculo.setPersona(this);*/ }} }} Sevilla, abril de 2007 Grupo de Ingeniería del Software 9 [Ángel US V7] Diseño: Amador Durán Toro (2003-2006) Hibernate • Bibliografí Bibliografía Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos – Hibernate in Action Manning 1. Introducció Introducción 2. POJOs 3.Mapeo de clases 4. Primitivas de Hibernate 5. Patró Patrón DAO 6. Alternativa 7. Bibliografí Bibliografía – POJOs in Action Manning – EJB3 in Action Manning Sevilla, abril de 2007 Grupo de Ingeniería del Software 10