La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "Object Relational Mapping - ORM Tutor: Ing. Juan E. Talavera Horn 2010."— Transcripción de la presentación:

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

2 ORM - Concepto  Conversión automática de objetos de aplicación a filas en tablas relacionales y viceversa

3 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

4 ORM - Frameworks  Hibernate - Java  TopLink - Java  Enterprise Java Beans - Java  Zend – php  NHibernate –.NET  Rails – Ruby

5 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

6 Configuración de mapeo <property name="date" type="timestamp" column="EVENT_DATE"/>

7 Crear y almacenar nuevo objeto Session session = HibernateUtil.getSessionFactory().getCurrentSession(); //Iniciar transacción session.beginTransaction(); Event theEvent = new Event(); theEvent.setTitle(title); theEvent.setDate(theDate); session.save(theEvent); //Confirmar transacción session.getTransaction().commit();

8 Obtener lista de objetos desde BD //Método en clase EventManager private List listEvents() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); List result = session.createQuery("from Event").list(); return result; } //Desde algún 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()); }

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

10 <many-to-many column="EVENT_ID" class="events.Event"/> Mapear asociaciones

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

12 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

13 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 declaraci ó n de los atributos

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

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

16 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

17 @Column @Entity public class Flight implements Serializable {... @Column(name = "flight_name", nullable = false, length=50) public String getName() {... }

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

19 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

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

21 Anotar la propiedad con @EmbeddedId @Entity public class DetalleFactura { @EmbeddedId DetalleFacturaKey id;... } public class DetalleFacturaKey { private Integer idCabeceraFactura; private Integer nroDetalle; }

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

23 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

24 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() {...} }

25 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 relación bidireccional, owner class es la encargada del mantenimiento de la relación

26 Tabla intermedia mantiene la relación 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() {}... }

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

28 Collections @Entity() public class Company implements Serializable { public String getName() { … } @OneToMany(mappedBy= “ company") public List getFlights() { return flights; }... }

29 Invertir el “owner” de la relación @Entity public class Troop { @OneToMany @JoinColumn(name="troop_fk") public Set getSoldiers() {}... } @Entity public class Soldier { @ManyToOne @JoinColumn(name="troop_fk", insertable=false, updatable=false) public Troop getTroop() {}... }

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

31 Named Query select p from Plane p... @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();... }... }

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

33 Conceptos de la plataforma  Session Factory  Session  Persistent objects  Transient and detached objects  Transaction  Connection Provider  Transaction Factory  First Level Cache  Second Level Cache


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

Presentaciones similares


Anuncios Google