Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

33
Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010

Transcript of Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Page 1: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Object Relational Mapping - ORM

Tutor: Ing. Juan E. Talavera Horn

2010

Page 2: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

ORM - Concepto

Conversión automática de objetos de aplicación a filas en tablas relacionales y viceversa

Page 3: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

ORM - Objetivos

Reducir la codificación de código SQL trivial para mantenimiento de objetos en la base de datos

Facilitar la navegación entre datos y sus relaciones en término de objetos de aplicación

Page 4: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

ORM - Frameworks

Hibernate - Java TopLink - Java Enterprise Java Beans - Java Zend – php NHibernate – .NET Rails – Ruby

Page 5: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Hibernate - Introducción

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

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

POJO: Plain Old Java Object

Page 6: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Configuración 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>

Page 7: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Crear y almacenar nuevo objeto

Session session = HibernateUtil.getSessionFactory().getCurrentSession();

//Iniciar transacciónsession.beginTransaction();

Event theEvent = new Event();

theEvent.setTitle(title);theEvent.setDate(theDate);

session.save(theEvent);

//Confirmar transacciónsession.getTransaction().commit();

Page 8: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Obtener lista de objetos desde BD

//Método en clase EventManagerprivate List listEvents() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); List result = session.createQuery("from Event").list(); return result;}

//Desde algún cliente de EventManagerList 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());}

Page 9: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Mapear asociacionespackage 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}

Page 10: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

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

Mapear asociaciones

Page 11: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Accediendo a las relacionesprivate 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();}

Page 12: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Annotations

Sustituir configuración XML por annotations

Annotations estándares de EJB 3.0 Annotations específicos de Hibernate POJO + Annotations EJB 3.0 =

Entity Java Beans Hibernate cumple con especificación JPA JPA puede ejecutarse fuera de contenedor

EJB, ejemplo Apache Tomcat

Page 13: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

POJO + Annotations

@Entitypublic class Flight implements Serializable {

Long id;

@Idpublic Long getId() { return id; }

public void setId(Long id) { this.id = id; }}

Anotaciones sobre los getters o declaración de los atributos

Page 14: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

@Table(…)

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

...}

Page 15: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Optimistic Locking

@Entitypublic 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í parabloqueo pesimista.

Page 16: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Mapeo de propiedades simplespublic transient int counter; //transient property

private String firstname; //persistent property

@TransientString getLengthInMeter() { ... } //transient property

String getName() {... } // persistent property

@Basicint getLength() { ... } // persistent property

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

Page 17: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

@Column

@Entitypublic class Flight implements Serializable { ...

@Column(name = "flight_name", nullable = false, length=50) public String getName() { ... }

Page 18: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

@Id

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

•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

Page 19: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

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

Page 20: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

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

@Entitypublic class DetalleFactura {

@Id DetalleFacturaKey id;

...}

@Embeddablepublic class DetalleFacturaKey { private Integer idCabeceraFactura; private Integer nroDetalle;}

Page 21: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Anotar la propiedad con @EmbeddedId

@Entitypublic class DetalleFactura {

@EmbeddedId DetalleFacturaKey id;

...}

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

Page 22: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

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

@Embeddablepublic class DetalleFacturaKey { private Integer idCabeceraFactura; private Integer nroDetalle;}

Page 23: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Asociación 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 relación entre las 2 entidades

Page 24: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Las entidades asociadas tienen las mismas claves primarias

@Entitypublic class Body { @Id public Long getId() { return id; }

@OneToOne(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn public Heart getHeart() {

return heart; } ...}

@Entitypublic class Heart { @Id public Long getId() { ...}}

Page 25: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Una de las entidades tiene un foreign key a la otra

@Entitypublic class Customer {

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

...}

@Entitypublic class Passport {

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

En relación bidireccional, owner class es la encargada del mantenimiento de la relación

Page 26: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Tabla intermedia mantiene la relación entre las 2 entidades

@Entitypublic class Customer implements Serializable {

@OneToOne(cascade = CascadeType.ALL) @JoinTable(name = "CustomerPassports", joinColumns = @JoinColumn(name="customer_fk"), inverseJoinColumns = @JoinColumn(name="passport_fk")) public Passport getPassport() {}...}

@Entitypublic class Passport implements Serializable { @OneToOne(mappedBy = "passport") public Customer getOwner() {}...}

Page 27: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Asociación muchos a uno

@Entity()public class Flight implements Serializable {

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

return company; } ...}

Page 28: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Collections

@Entity()public class Company implements Serializable {

public String getName() { …}

@OneToMany(mappedBy=“company") public List<Flight> getFlights() {

return flights; } ...}

Page 29: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Invertir el “owner” de la relación

@Entitypublic class Troop { @OneToMany @JoinColumn(name="troop_fk") public Set<Soldier> getSoldiers() {}

...}

@Entitypublic class Soldier { @ManyToOne @JoinColumn(name="troop_fk", insertable=false, updatable=false) public Troop getTroop() {}

...}

Page 30: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Foreign key compuestos@Entitypublic 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; ...}

Page 31: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

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

} ...}

Page 32: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

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

Page 33: Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010.

Conceptos de la plataforma

Session Factory Session Persistent objects Transient and detached objects Transaction Connection Provider Transaction Factory First Level Cache Second Level Cache