Download Jpa
Document related concepts
no text concepts found
Transcript
Java Persistance
API
JPA
¿Qué es una
Entidad?
¿Qué es una entidad?
Plain Old Java Object(POJO)
Se crean por medio de la palabra reservada new
No se requieren interfaces
Tiene una identidad de persistencia
Puede tener estados tanto persistentes como no
persistentes
Tipos Simples (ej. primitivos, enums ..)
Estados no persistentes (transient o @Transient)
Permite herencia entre entidades
Serializable; usable como objetos separados
en otras capas
No necesitan objetos de transferencia de datos
Ejemplo de Entidad
@Entity
public class Customer implements Serializable {
@Id protected Long id;
protected String name;
@Embedded protected Address address;
protected PreferredStatus status;
@Transient protected int orderCount;
}
public Customer() {}
public Long getId() {return id;}
protected void setId(Long id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
…
Llave primaria (Pk - Id) de la Entidad
Cada Entidad tiene una llave primaria (identity)
de persistencia.
Puede corresponder a un tipo simple
@EmbeddedId – campo simple/propiedad en la
clase entidad
@IdClass – corresponde a muchos campos Id en la
clase entidad
Debe ser definido en la raíz de la jerarquía d eal
entidad o clase padre mapeada
Modelo de
Programación
Modelo de Programación de Persistencia de Java
La entidad es un POJO (no necesita implementar
un EntityBean)
Uso de Annotations para denotar un POJO como
una entidad (en lugar de un descriptor)
// @Entity is an annotation
// It annotates Employee POJO class to be Entity
@Entity
public class Employee {
// Persistent/transient fields
// Property accessor methods
// Persistence logic methods
}
Ejemplo de Entidad de Persistencia (1)
@Entity
public class Customer {
Annotation denota que es Entidad
private Long id;
private String name;
private Address address;
private Collection<Order> orders = new HashSet();
public Customer() {}
@Id denota la llave primaria
@Id public Long getID() {
return id;
}
protected void setID (Long id) {
this.id = id;
}
...
Métodos accesores para
acceder el estado
Ejemplo de Entidad de Persistencia (2)
...
// Relationship between Customer and Orders
@OneToMany
public Collection<Order> getOrders() {
return orders;
}
public void setOrders(Collection<Order> orders) {
this.orders = orders;
}
// Other business methods
...
}
Código de Cliente: De Java SE Client
public static void main(String[] args) {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("EmployeeService);
EntityManager em = emf.createEntityManager();
Collection emps = em.createQuery("SELECT e FROM
Employee e")
.getResultList();
// More codes
Contexto de
Persistencia y
Manejador de Entidad
Persistance Context &
Entity Manager (EM)
Contexto de Persistencia y Manejador de Entidad
Contexto de Persistencia
Representa un conjunto de instancias de entidad
administradas por la capa de persistencia en tiempo de
ejecución
“Una instancia de Entidad es un estado administrado”
significa que la instancia está contenida en un contexto de
persistencia
Inclusión o exclusión de una entidad en/de el contexto de
persistencia determina la salida de cualquier operación de
persistencia en él
No es directamente accesible para la aplicación
es accedido indirectamente a través del
EM – el tipo de EM determina cómo un contexto de
persistencia es creado y borrado
Manejador de Entidad (EM)
Realiza operaciones del ciclo de vida en entidades –
administra el contexto de persistencia
Operaciones de ciclo
de vida de una Entidad
Administrador de Entidad (EM)
En funcionalidad es similar a el Hibernate
Session, JDO PErsistanceManajer, etc
Controla el ciclo de vida de las entidades
persist() – inserta una entidad a la BD
remove() – remueve una entidad de la BD
merge() – sincroniza el estado de entidades
separadas
refresh() – refresca el estado desde la BD
Operación de Persistencia
public Order createNewOrder(Customer customer) {
Order order = new Order(customer);
// Transitions new instances to managed. On the
// next flush or commit, the newly persisted
// instances will be inserted into the datastore.
entityManager.persist(order);
return order;
}
Operaciones de Búsqueda y Eliminación
public void removeOrder(Long orderId) {
Order order = entityManager.find(Order.class, orderId);
// The instances will be deleted from the datastore
// on the next flush or commit. Accessing a
// removed entity has undefined results.
entityManager.remove(order);
}
Operación de Merge
public OrderLine updateOrderLine(OrderLine
orderLine) {
// The merge method returns a managed copy of
// the given detached entity. Changes made to the
// persistent state of the detached entity are
// applied to this managed instance.
return entityManager.merge(orderLine);
}
Transacciones
Tipos de Transacciones
Dos tipos de transacciones
Transacciones de recurso local (Resource - local)
JTA (Java Transaction API)
Participan múltiples recursos
Transacciones XA distribuidas
El tipo de transacción es definido en la unidad de
persistencia (archivo persistance.xml)
El valor default es JTA para JavaEE y RESOURCE_LOCAL
para Java SE
EM administrado por un contendor utiliza
transacciones de JTA
Propagación del contexto de persistencia con
transacciones de JTA es gestionado por el contenedor –
compartiendo el mismo contexto de persistencia entre
múltiples EMs
Transacciones Y Contexto de Persistencia
Las transacciones definen cuando las entidades
nuevas, modificadas, o borradas so sincronizadas
con la base de datos
La creación y uso del contexto de persistencia es
determinado por el tipo de Transacción
(Resource-local o JTA) y el atributo de
Transacción (REQUIRED o ..)
Mapeo a O/R
Mapeo a O/R
Conjunto de annotations extenso definido por el
mapeo
Relaciones
Joins
Tablas y columnas de BD
Generadores de secuencias de BD
Especificadas utilizando
Annotations en el código
Archivo de mapeo por separado
Mapeos Simples
@Entity(access=FIELD)
public class Customer {
@Id
int id;
String name;
@Column(name=“CREDIT”)
int c_rating;
@Lob
Image photo;
}
CUSTOMER
ID
NAME
CREDIT
PHOTO
Ejemplo de Mapeo O/R
@Entity
@Table(name="EMPLOYEE",
schema="EMPLOYEE_SCHEMA")
uniqueConstraints=
{@UniqueConstraint(columnNames={"EMP_ID",
"EMP_NAME"})}
public class EMPLOYEE {
... @Column(name="NAME", nullable=false, length=30)
public String getName() { return name; }
}
Relaciones de
Entidades
Relaciones de Entidades
Modela asociación entre entidades
Soporta relaciones tanto unidireccionales como
bidireccionales
Relación unidireccional: Entidad A hace referencia a
B, pero B no hace referencia a A
Cardinalidades
Uno a uno
Uno a muchos
Muchos a uno
Muchos a muchos
Relaciones de Entidades:
Ejemplo Muchos a Muchos
@Entity
public class Project {
private Collection<Employee> employees;
@ManyToMany
public Collection<Employee> getEmployees() {
return employees;
}
public void setEmployees(Collection<Employee> employees) {
this.employees = employees;
}
...
}
Comportamiento en Cascada
“Cascading” es utilizado para propagar el efecto
de una operación en todas las entidades
relacionadas
Cascade = PERSIST
Cascade = REMOVE
Cascade = MERGE
Cascade = REFRESH
Cascade = ALL
QUERY
Mejora a EJB-QL
Soporta queries dinámicos, además de queries
prefabricados o queries estáticos
Queries polimórficos
Operaciones de actualización y eliminación en
grandes bloques
Joins
Agrupaciones
Subqueries
Funciones de SQL Adicionales
UPPER, LOWER, TRIM, CURRENT_DATE
Queries
Queries Estáticos
Definidos con metadatos de lenguaje de java o XML
Annotations: @NamedQuery, @NamedNativeQuery
Queries Dinámicos
El query se especifica en tiempo de ejecución
Utiliza Lenguaje de Query de Persistencia de Java
o SQL
Parámetros nombrados o posicionados
El EM es fábrica de objetos de query
createNamedQuery, createQuery,
createNativeQuery
Métodos de query para contolar resultados
máximos, paginación, modo flush
Queries Dinámicos
// Build and execute queries dynamically at runtime.
public List findWithName (String name) {
return em.CreateQuery (
“SELECT c FROM Customer c ” +
“WHERE c.name LIKE :custName”)
.setParameter(“custName”, name)
.setMaxResults(10)
.getResultList();
}
Named Query
// Named queries are a useful way to create reusable queries
@NamedQuery(
name=“findCustomersByName”,
queryString=“SELECT c FROM Customer c ” +
“WHERE c.name LIKE :custName”
)
@PersistenceContext public EntityManager em;
List customers =
em.createNamedQuery(“findCustomersByName”).
setParameter(“custName”, “smith”).getResultList();
Referencias
Java Persistence API: Simplifying Persistence
Sang Shin
Java Technology Evangelist
Sun Microsystems, Inc.