Вы находитесь на странице: 1из 35

Persistencia de Datos con Hibernate

Edwin Marav emaravi@cjavaperu.com

Objetivos
Al final de la sesin usted aprender:
Manejo de anotaciones con Hibernate

Mapeo con JPA

ORM - Conceptos
Conversin automtica de objetos de aplicacin a

filas en tablas relacionales y viceversa.


Se debe de poder realizar operaciones que permitan

transformar un objeto en un registro de base de datos y viceversa.

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

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

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>

Crear y almacenar nuevo objeto


Session session = HibernateUtil.getSessionFactory().getCurrentSession(); //Iniciar transaccin session.beginTransaction(); Event theEvent = new Event(); theEvent.setTitle(title); theEvent.setDate(theDate); session.save(theEvent); //Confirmar transaccin session.getTransaction().commit();

Obtener lista de objetos desde BD


//Mtodo en clase EventManager private List listEvents() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); List result = session.createQuery("from Event").list(); return result; }

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

Accediendo a las relaciones


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

Annotations
Sustituir configuracin XML por annotations

Annotations estndares de EJB 3.0


Annotations especficos de Hibernate POJO + Annotations EJB 3.0 =

Entity Java Beans Hibernate cumple con especificacin JPA JPA puede ejecutarse fuera de contenedor EJB, ejemplo Apache Tomcat

POJO + Annotations

@Entity public class Flight implements Serializable { Long id;


@Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } }

Anotaciones sobre los getters o declaracin de los atributos

@Table()

@Entity @Table(name="tbl_sky") public class Sky implements Serializable { ... }

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.

Mapeo de propiedades simples


public transient int counter; //transient property private String firstname; //persistent property @Transient String getLengthInMeter() { ... } //transient property String getName() {... } // persistent property

@Basic int getLength() { ... } // persistent property


@Temporal(TemporalType.TIME) java.util.Date getDepartureTime() { ... } // persistent property

@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

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE") @SequenceGenerator(name=SEQ_STORE",sequenceName=SQ_IDSTORE") public Integer getId() { ... }

Claves primarias compuestas


Anotar la propiedad con @Id, y la clase de la clave con

@Embeddable

Anotar la propiedad con @EmbeddedId Anotar la clase con @IdClass y anotar cada propiedad que

conforma la clase con @Id

Anotar la propiedad con @Id, y la clase de la clave con @Embeddable


@Entity public class DetalleFactura { @Id DetalleFacturaKey id; ... }

@Embeddable public class DetalleFacturaKey { private Integer idCabeceraFactura; private Integer nroDetalle; }

Anotar la propiedad con @EmbeddedId


@Entity public class DetalleFactura { @EmbeddedId DetalleFacturaKey id; ... } 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

Las entidades asociadas tienen las mismas claves primarias


@Entity public class Body { @Id public Long getId() { return id; } @OneToOne(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn public Heart getHeart() { return heart; } ... } @Entity public class Heart { @Id public Long getId() { ...} }

Una de las entidades tiene un foreign key a la otra


@Entity public class Customer {

@OneToOne(cascade = CascadeType.ALL) @JoinColumn(name="passport_fk") public Passport getPassport() {} ...


}

@Entity public class Passport {


@OneToOne(mappedBy = "passport") public Customer getOwner() {} ...

En relacin bidireccional, owner class es la encargada del mantenimiento de la relacin

Tabla intermedia mantiene la relacin entre las 2 entidades


@Entity public class Customer implements Serializable { @OneToOne(cascade = CascadeType.ALL) @JoinTable(name = "CustomerPassports", joinColumns = @JoinColumn(name="customer_fk"), inverseJoinColumns = @JoinColumn(name="passport_fk")) public Passport getPassport() {} ... } @Entity public class Passport implements Serializable { @OneToOne(mappedBy = "passport") public Customer getOwner() {} ... }

Asociacin muchos a uno


@Entity() public class Flight implements Serializable {

@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE} ) @JoinColumn(name="COMP_ID") public Company getCompany() { return company; } ...


}

Collections
@Entity() public class Company implements Serializable {

public String getName() { }


@OneToMany(mappedBy=company") public List<Flight> getFlights() { return flights; } ... }

Invertir el owner de la relacin


@Entity public class Troop { @OneToMany @JoinColumn(name="troop_fk") public Set<Soldier> getSoldiers() {} ... } @Entity public class Soldier { @ManyToOne @JoinColumn(name="troop_fk", insertable=false, updatable=false) public Troop getTroop() {} ... }

Foreign key compuestos


@Entity public class Parent implements Serializable { @Id public ParentPk id; public int age; @OneToMany(cascade=CascadeType.ALL) @JoinColumns ({ @JoinColumn(name="parentCivility", referencedColumnName = "isMale"), @JoinColumn(name="parentLastName", referencedColumnName = "lastName"), @JoinColumn(name="parentFirstName", referencedColumnName = "firstName") }) public Set<Child> children; ... }

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

Вам также может понравиться