4 Orm
Upcoming SlideShare
Loading in...5
×
 

4 Orm

on

  • 2,893 views

 

Statistics

Views

Total Views
2,893
Views on SlideShare
2,860
Embed Views
33

Actions

Likes
0
Downloads
105
Comments
0

2 Embeds 33

http://www.progress.com.py 21
http://www.slideshare.net 12

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Pagina 30 de referencia hibernate

4 Orm 4 Orm Presentation Transcript

  • Progress S.R.L. Software y Servicios 2010 Object Relational Mapping - ORM
  • ORM - Concept
    • Conversión automática de objetos de aplicación 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 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
  • 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 método getClass, cuya firma es public final Class getClass(). Este método nos devuelve un objeto java.lang.Class.
  • 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
  • Configuración de mapeo <hibernate-mapping> <class name=&quot;events.Event&quot; table=&quot;EVENTS&quot;> <id name=&quot;id&quot; column=&quot;EVENT_ID&quot;> <generator class=&quot;native&quot;/> </id> <property name=&quot;date&quot; type=&quot;timestamp&quot; column=&quot;EVENT_DATE&quot;/> <property name=&quot;title&quot;/> </class> </hibernate-mapping>
  • 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();
  • Obtener lista de objetos desde BD //Método en clase EventManager private List listEvents() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); List result = session.createQuery(&quot;from Event&quot;).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(&quot;Event: &quot; + theEvent.getTitle() + &quot; Time: &quot; + 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=&quot;events.Person&quot; table=&quot;PERSON&quot;> <id name=&quot;id&quot; column=&quot;PERSON_ID&quot;> <generator class=&quot;native&quot;/> </id> <property name=&quot;age&quot;/> <property name=&quot;firstname&quot;/> <property name=&quot;lastname&quot;/> <set name=&quot;events&quot; table=&quot;PERSON_EVENT&quot;> <key column=&quot;PERSON_ID&quot;/> <many-to-many column=&quot;EVENT_ID&quot; class=&quot;events.Event&quot;/> </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 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
  • 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
  • @Table(…) @Entity @Table(name=&quot;tbl_sky&quot;) public class Sky implements Serializable { ... }
  • Optimistic Locking @Entity public class Flight implements Serializable { private Integer version; ... @Version @Column(name=&quot;OPTLOCK&quot;) 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 = &quot;flight_name&quot;, nullable = false, length=50) public String getName() { ... }
  • @Id @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator=&quot;SEQ_STORE&quot;) @SequenceGenerator(name= “ SEQ_STORE&quot;,sequenceName= “ SQ_IDSTORE&quot;) 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
  • 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; }
  • 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
  • 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=&quot;passport_fk&quot;) public Passport getPassport() {} ... } @Entity public class Passport { @OneToOne(mappedBy = &quot;passport&quot;) public Customer getOwner() {} ... } En relación bidireccional, owner class es la encargada del mantenimiento de la relaci ón
  • Tabla intermedia mantiene la relación entre las 2 entidades @Entity public class Customer implements Serializable { @OneToOne(cascade = CascadeType.ALL) @JoinTable(name = &quot;CustomerPassports&quot;, joinColumns = @JoinColumn(name=&quot;customer_fk&quot;), inverseJoinColumns = @JoinColumn(name=&quot;passport_fk&quot;)) public Passport getPassport() {} ... } @Entity public class Passport implements Serializable { @OneToOne(mappedBy = &quot;passport&quot;) public Customer getOwner() {} ... }
  • Asociaci ón muchos a uno @Entity() public class Flight implements Serializable { @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE} ) @JoinColumn(name=&quot;COMP_ID&quot;) public Company getCompany() { return company; } ... }
  • Collections @Entity() public class Company implements Serializable { public String getName () { … } @OneToMany(mappedBy= “ company&quot;) public List<Flight> getFlights() { return flights; } ... }
  • Invertir el “owner” de la relaci ón @Entity public class Troop { @OneToMany @JoinColumn(name=&quot;troop_fk&quot;) public Set<Soldier> getSoldiers() {} ... } @Entity public class Soldier { @ManyToOne @JoinColumn(name=&quot;troop_fk&quot;, 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=&quot;parentCivility&quot;, referencedColumnName = &quot;isMale&quot;), @JoinColumn(name=&quot;parentLastName&quot;, referencedColumnName = &quot;lastName&quot;), @JoinColumn(name=&quot;parentFirstName&quot;, referencedColumnName = &quot;firstName&quot;) }) public Set<Child> children; ... }
  • Named Query
    • <entity-mappings>
    • <named-query name=&quot;plane.getAll&quot;>
    • <query>select p from Plane p</query>
    • </named-query>
    • ...
    • </entity-mappings>
    • @Entity
    • @NamedQuery(name=&quot;night.moreRecentThan&quot;,
    • query=&quot;select n from Night n where n.date >= :date&quot;)
    • public class Night {
    • ...
    • }
    • public class MyDao {
    • doStuff() {
    • Query q = s.getNamedQuery(&quot;night.moreRecentThan&quot;);
    • q.setDate( &quot;date&quot;, aMonthAgo );
    • List results = q.list();
        • ...
    • }
    • ...
    • }
  • Criteria Query List cats = sess.createCriteria(Cat.class) .add( Restrictions.like(&quot;name&quot;, &quot;Fritz%&quot;) ) .add( Restrictions.between(&quot;weight&quot;, minWeight, maxWeight) ) .list(); List cats = sess.createCriteria(Cat.class) .add( Restrictions.like(&quot;name&quot;, &quot;Fritz%&quot;) ) .add( Restrictions.or( Restrictions.eq( &quot;age&quot;, new Integer(0) ), Restrictions.isNull(&quot;age&quot;) ) ).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