Professional Documents
Culture Documents
Objetivos
Al final de la sesin usted aprender:
Manejo de anotaciones con Hibernate
ORM - Conceptos
Conversin automtica de objetos de aplicacin a
ORM - Objetivos
Reducir la codificacin de cdigo SQL trivial para
mantenimiento de objetos en la base de datos Facilitar la navegacin entre datos y sus relaciones en trmino de objetos de aplicacin
ORM - Frameworks
Hibernate - Java TopLink - Java Enterprise Java Beans - Java
Zend php
NHibernate .NET Rails Ruby
Java Reflection
API que define ciertas formas de acceso a metodos y
atributos de objetos. Todos los objetos en java heredan de la clase java.lang.Object y por ello estan dotados de un mtodo getClass, cuya firma es public final Class getClass(). Este mtodo nos devuelve un objeto java.lang.Class.
Hibernate - Introduccin
package events; 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; } POJO: Plain Old Java Object
Configuracin de mapeo
<hibernate-mapping> <class name="events.Event" table="EVENTS"> <id name="id" column="EVENT_ID"> <generator class="native"/> </id> <property name="date" type="timestamp" column="EVENT_DATE"/> <property name="title"/> </class> </hibernate-mapping>
//Desde algn cliente de EventManager 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()); }
Mapear asociaciones
package events; public class Person { private Long id; private int age; private String firstname; private String lastname; private Set events = new HashSet(); public Person() {} // getters y setters para todos los atributos }
Mapear asociaciones
<hibernate-mapping> <class name="events.Person" table="PERSON"> <id name="id" column="PERSON_ID"> <generator class="native"/> </id> <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="events.Event"/> </set> </class> </hibernate-mapping>
aPerson.getEvents().add(anEvent);
session.getTransaction().commit(); }
Annotations
Sustituir configuracin XML por annotations
Entity Java Beans Hibernate cumple con especificacin JPA JPA puede ejecutarse fuera de contenedor EJB, ejemplo Apache Tomcat
POJO + Annotations
@Table()
Optimistic Locking
@Entity public class Flight implements Serializable { private Integer version; ...
@Version @Column(name="OPTLOCK") public Integer getVersion() { return version; } }
EJB 3 requiere soporte para bloqueo optimista, pero no as para bloqueo pesimista.
@Column
@Entity public class Flight implements Serializable { ... @Column(name = "flight_name", nullable = false, length=50) public String getName() { ... }
@Id
AUTO: Uno de los siguientes dependiendo de la BD TABLE: Valor almacenado en una tabla IDENTITY: Auto incrementado por la BD (si soporta) SEQUENCE: A partir de secuencia
@Embeddable
Anotar la propiedad con @EmbeddedId Anotar la clase con @IdClass y anotar cada propiedad que
@Embeddable public class DetalleFacturaKey { private Integer idCabeceraFactura; private Integer nroDetalle; }
Anotar la clase con @IdClass y anotar cada propiedad que conforma la clase con @Id
@Entity @IdClass(DetalleFacturaKey.class) public class DetalleFactura { @Id private Integer idCabeceraFactura; @Id Integer nroDetalle; ... } @Embeddable public class DetalleFacturaKey { private Integer idCabeceraFactura; private Integer nroDetalle; }
Asociacin 1 a 1
Las entidades asociadas tienen las mismas claves
primarias Una de las entidades tiene un foreign key a la otra Existe una tabla intermedia que mantiene la relacin entre las 2 entidades
Collections
@Entity() public class Company implements Serializable {
Named Query
<entity-mappings> <named-query name="plane.getAll"> <query>select p from Plane p</query> </named-query> ... </entity-mappings>
@Entity @NamedQuery(name="night.moreRecentThan", query="select n from Night n where n.date >= :date") public class Night { ... } public class MyDao { doStuff() { Query q = s.getNamedQuery("night.moreRecentThan"); q.setDate( "date", aMonthAgo ); List results = q.list(); ... } ... }
Criteria Query
List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.between("weight", minWeight, maxWeight) ) .list();
List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.or( Restrictions.eq( "age", new Integer(0) ), Restrictions.isNull("age") ) ).list();
Conceptos de la plataforma
Session Factory
Session
Persistent objects Transient and detached objects Transaction Connection Provider Transaction Factory First Level Cache Second Level Cache