eugeniaperez.es
Unidad 1: Arquitectura del ORM
eugeniaperez.es
Unidad 1: Arquitectura del ORM
eugeniaperez.es
1.1 Arquitectura de gestión
El patrón DAO es un patrón de diseño que permite separar la lógica de negocio con los detalles de acceso a datos
Implementa operaciones CRUD necesarias y adicionales
La información entre el DAO y la aplicación se realiza mediante objetos (tablas de la BD)
eugeniaperez.es
1.1 Arquitectura de gestión
Ejemplo práctico: BD ERP, con una tabla Customer
eugeniaperez.es
1.1 Arquitectura de gestión
Ejemplo práctico: BD ERP, con una tabla Customer
eugeniaperez.es
1.1 Arquitectura de gestión
HIBERNATE
Interactúa directamente con un SGBDR y SQL
eugeniaperez.es
1.2 Configuración del ORM
A través de Maven:
El diagrama en concreto a representar es:
eugeniaperez.es
1.2 Configuración del ORM
Elementos necesarios:
eugeniaperez.es
1.2 Configuración del ORM
hibernate.cfg.xml : fichero de configuración de hbm
<?xml version='1.0' encoding='utf-8'?>
<!-- Hibernate configuration file, here is were we set up hibernate db collection
and mapping between classes and database tables. -->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- contenido -->
</hibernate-configuration>
eugeniaperez.es
1.2 Configuración del ORM
hibernate.cfg.xml : fichero de configuración de hbm
<session-factory>
<!-- Database connection settings -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/testdb</property>
<property name="connection.username">test</property>
<property name="connection.password">test</property>
<property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory
</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.show_sql">false</property>
<property name="hbm2ddl.auto">create</property>
</session-factory>
eugeniaperez.es
1.2 Configuración del ORM
hibernate.cfg.xml : fichero de configuración de hbm
Propiedad hbm2ddl.auto:
eugeniaperez.es
1.2 Configuración del ORM
hibernate.cfg.xml : fichero de configuración de hbm
Existe otra propiedad pool_size:
Por defecto tiene valor 1. Cuanto mayor sea el valor menos posibilidad de peticiones pendientes en cola, pero también será más lenta...
<property name="connection.pool_size">10</property>
eugeniaperez.es
1.2 Configuración del ORM
hibernate.cfg.xml : fichero de configuración de hbm
<session-factory>
...
<!-- Database connection settings -->
<mapping resource="Customer.hbm.xml" />
</session-factory>
eugeniaperez.es
1.2 Configuración del ORM
Customer.hbm.xml : representa la entidad JAVA Customer
<hibernate-mapping package="org.sistema.test.Test">
<class name="Customer" table="CUSTOMERS">
<id name="id" column="ID">
<generator class="identity" />
</id>
<property name="name" column="NAME" />
<property name="address" column="ADDRESS" />
<property name="email" column="EMAIL" />
</class>
</hibernate-mapping>
eugeniaperez.es
1.2 Configuración del ORM
Estrategias de generación de id:
eugeniaperez.es
1.1 Java Persistence API
Java Persistence API (JPA) es la API de persistencia desarrollada para la plataforma Java EE. Es un framework que maneja datos relacionales en aplicaciones usando la Plataforma Java en sus ediciones Java SE y Java EE.
Conserva las ventajas de la OO al seguir el patrón de mapeo objeto-relacional y permitir usar POJOs.
eugeniaperez.es
1.2 Configuración del ORM
Se crea la clase Java Customer que representa a la tabla (POJO):
eugeniaperez.es
1.2 Configuración del ORM
Text
public class Customer {
private Long id;
private String name;
private String address;
private String email;
/**
* Default constructor
*/
public Customer() {
}
/**
* GETTERS AND SETTERS
*/
...
}
eugeniaperez.es
1.2 Configuración del ORM
eugeniaperez.es
1.2 Configuración del ORM
Interfaz DAO:
public interface CustomerDAO {
public Customer selectById(Long id);
public List<Customer> selectAll();
public void insert(Customer customer);
public void update(Customer customer);
public void delete(Customer customer);
}
eugeniaperez.es
1.2 Configuración del ORM
Implementación DAO:
public class HibernateCustomerDAO implements CustomerDAO {
public Customer selectById(Long id) {
SessionFactory sessionFactory = HibernateSession.getSessionFactory();
Session session = sessionFactory.openSession();
Customer customer = (Customer) session.get(Customer.class, id);
session.close();
return customer;
}
public List<Customer> selectAll() {
SessionFactory sessionFactory = HibernateSession.getSessionFactory();
Session session = sessionFactory.openSession();
List<Customer> customers = session.createCriteria(Customer.class).list();
session.close();
return customers;
}
eugeniaperez.es
1.2 Configuración del ORM
Text
public void insert(Customer customer) {
SessionFactory sessionFactory = HibernateSession.getSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
Long id = (Long) session.save(customer);
customer.setId(id);
session.getTransaction().commit();
session.close();
}
public void update(Customer customer) {
SessionFactory sessionFactory = HibernateSession.getSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
session.merge(customer);
session.getTransaction().commit();
session.close();
}
eugeniaperez.es
1.2 Configuración del ORM
La sesión de Hibernate
Hbm carga el fichero de config para crear una SessionFactory o factoría global de objetos Session
La Sesión nos permitirá realizar todo tipo de operaciones contra BD (inserción, borrado, cargado de registros, etc) manteniendo un medio transaccional.
Se define un SessionFactory por cada una y solo una de las BD
eugeniaperez.es
1.2 Configuración del ORM
La sesión de Hibernate
La principal función de esta interfaz es ofrecer operaciones de creación, lectura y borrado de entidades de nuestro modelo.
Una entidad puede estar en estos 3 estados:
eugeniaperez.es
1.2 Configuración del ORM
La sesión de Hibernate
eugeniaperez.es
1.2 Configuración del ORM
eugeniaperez.es
1.2 Configuración del ORM
Por último la clase HibernateSession:
public class HibernateSession {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static Session session;
private static SessionFactory buildSessionFactory() {
Configuration configuration = new Configuration();
configuration.configure(); //Reconoce el fichero hibernate.cfg.xml
//configuration.configure("otro_nombre_hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
eugeniaperez.es
1.2 Configuración del ORM
Por último la clase HibernateSession:
public class HibernateSession {
...
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() {
if (null == session) {
session = sessionFactory.openSession();
}
return session;
}
}
eugeniaperez.es
1.2 Configuración del ORM
Descarga el proyecto maven_test del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/maven_test.git
eugeniaperez.es
1.2 Configuración del ORM
Configuración basada en anotaciones:
El infierno XML:
Se crea una alternativa: anotaciones Java en el propio código
eugeniaperez.es
1.2 Configuración del ORM
Configuración basada en anotaciones:
En el fichero hibernate.cfg.xml especificaremos un POJO, en lugar del fichero de mapeo.
<!-- Here comes the concrete path to refer our AJO file -->
<mapping class="org.sistema.test.TestAnnotations.Customer" />
eugeniaperez.es
1.2 Configuración del ORM
Y anotamos nuestro POJO o AJO (Annotated Java Object).
@Entity
public class Customer {
@Id
private Long id;
private String name;
private String address;
private String email;
/**
* Default constructor
* Getters and setters
*/
}
eugeniaperez.es
1.2 Configuración del ORM
Y anotamos nuestro POJO o AJO (Annotated Java Object).
@Entity
@Table(name="CUSTOMERS")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="CUSTOMER_ID")
private Long id;
@Column(name="CUSTOMER_NAME")
private String name;
private String address;
private String email;
/**
* Default constructor
* Getters and setters
*/
}
eugeniaperez.es
1.2 Configuración del ORM
Estrictamente las anotaciones obligatorias que deberíamos incluir son (anotaciones estándar JPA -> javax.persistence):
eugeniaperez.es
1.2 Configuración del ORM
De manera opcional:
eugeniaperez.es
1.2 Configuración del ORM
Descarga el proyecto maven_test_annotations del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/maven_test.git
eugeniaperez.es
FIN DE LA UNIDAD 1: Arquitectura del ORM