m3-uf2 persistencia con hibernate


eugeniaperez.es

Unidad 1: Arquitectura del ORM

m3-uf2 persistencia con hibernate

 

eugeniaperez.es

Unidad 1: Arquitectura del ORM

  • Es un framework ORM
  • Elimina código boilerplate
  • Aplicado junto con el patrón DAO
  • Diseño desacoplado, sencillo y mantenible
  • Abstracción del origen de datos
  • Mejora la productividad -> uso de Session
  •  Permite reemplazar fácilmente el SGBD 

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)

1.1.1 EL PATRÓN DAO

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.1 Arquitectura de gestión

 

Ejemplo práctico: BD ERP, con una tabla Customer

  • Customer: representa los datos de la tabla. Intercambiarinformación entre el programa y la clase DAO.
  • CustomerDAO: se encarga de todas las operaciones CRUD.
  • DataSource: se encarga de conseguir la conexión con el origen de datos.

1.1.1 EL PATRÓN DAO

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.1 Arquitectura de gestión

 

Ejemplo práctico: BD ERP, con una tabla Customer

  • Customer: datos tabla
  • CustomerDAO:  CRUD
  • DataSource: conexión 

1.1.1 EL PATRÓN DAO

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.1 Arquitectura de gestión

 

1.1.1 EL PATRÓN DAO

HIBERNATE 

Interactúa directamente con un SGBDR y SQL

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.2 Configuración del ORM

 

A través de Maven:

El diagrama en concreto a representar es:

 

 

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.2 Configuración del ORM

 

Elementos necesarios:

  • Incluye las dependencias (org.hibernate y mysql-connector) en el pom.xml
  • Crea un archivo hibernate.cfg.xml en src
  • Crea un fichero customer.hbm.xml que mapee la entidad del POJO correpondiente

 

unidad 1: arquitectura del orm

 

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>

unidad 1: arquitectura del orm

 

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>

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.2 Configuración del ORM

 

hibernate.cfg.xml : fichero de configuración de hbm

 

Propiedad hbm2ddl.auto:

  • Validate = Valida el esquema de la BD
  • Update = Solo actualiza la BD
  • Create = Borra el esquema existente y crea uno nuevo.
  • Create-drop = Crea una nueva base de datos y la elimina cuando la SessionFactory es destruida. 

 

 

unidad 1: arquitectura del orm

 

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>

unidad 1: arquitectura del orm

 

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>

unidad 1: arquitectura del orm

 

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>

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.2 Configuración del ORM

 

Estrategias de generación de id:

  • Si necesitamos un id autogenerado: class=identity
  • Si especificamo class=native estaremos permitiendo que sea Hibernate quién seleccione la estrategia adecuada al SGBD, esto es, identity para MySQL, sequence para Oracle, etc.
  • class = assigned permite que la propia aplicación sea quien le de el valor al Id.

 

unidad 2: JPA VS. HIBERNATE

 

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.

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.2 Configuración del ORM

 

Se crea la clase Java Customer que representa a la tabla (POJO):

  • Siempre un contructor por defecto.
  • Por cada propiedad deberemos tener un get/set asociado. 
  • De forma opcional, implementar la interfaz Serializable.
  • El Identificador será preferiblemente de tipos nullables (Integer, Long, etc.) mejor que de tipos básicos (int, long, etc.). 

 

 

unidad 1: arquitectura del orm

 

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
        */
        ...
}

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.2 Configuración del ORM

 

  • Crea la interfaz del DAO y su implementación con las operaciones CRUD que se van a probar
  • Finalmente, instancia el DAO desde un programa principal y pruébalo...

unidad 1: arquitectura 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);

}

unidad 1: arquitectura del orm

 

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

unidad 1: arquitectura del orm

 

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

unidad 1: arquitectura del orm

 

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

unidad 1: arquitectura del orm

 

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:

  • transient: nunca ha sido persistida...
  • persistent: asociado con una Session.
  • detached: ha sido persistente, pero ya NO está asociada con el objeto Session

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.2 Configuración del ORM

 

La sesión de Hibernate

 

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.2 Configuración del ORM

 

  • save(): persiste una transient a través de  INSERT SQL.
  • persist():se diferencia de save() en que la inserción no se produce inmediatamente, si no cuando se realiza un flush...
  • saveOrUpdate(): salva o actualiza una entidad.
  • delete(): borra una entidad de la base de datos.
  • get(): recupera una entidad da partir de su ID.
  • load(): recupera un proxy que contiene el ID de la entidad.
  • update():  actualizando los cambios producidos
  • merge(): igual que el anterior pero también fuera de la Sessión.

unidad 1: arquitectura 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;
}

unidad 1: arquitectura del orm

 

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

unidad 1: arquitectura del orm

 

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

 

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.2 Configuración del ORM

 

Configuración basada en anotaciones:

El infierno XML:

  • demasiado largo de escribir
  • muy repetitivo ,
  • susceptible y fuente de numerosos errores, etc.

Se crea una alternativa:  anotaciones Java en el propio código

  • Forma más compacta y sencilla

 

unidad 1: arquitectura del orm

 

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

unidad 1: arquitectura del orm

 

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
        */
}

unidad 1: arquitectura del orm

 

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
        */
}

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.2 Configuración del ORM

 

Estrictamente las anotaciones obligatorias que deberíamos incluir son (anotaciones estándar JPA -> javax.persistence):

  • @Entity: Se aplica a la clase e indica que esta clase Java es una entidad a persistir. 
  • @Id: Se aplica a una propiedad Java e indica que este atributo es la clave primaria. 

 

 

unidad 1: arquitectura del orm

 

eugeniaperez.es

1.2 Configuración del ORM

 

De manera opcional:

  • @Table(name=”CUSTOMERS”) 
  • @Column(name=“ID”):
  • @GeneratedValue: crea un id según estrategia. Strategy: mediante GenerationType, de valores:
    • IDENTITY: en MySQL -> AUTO_INCREMENT.
    • AUTO: equivalente a NATIVE

 

 

unidad 1: arquitectura del orm

 

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



m3-uf2 persistencia con hibernate

 

eugeniaperez.es

FIN DE LA UNIDAD 1: Arquitectura del ORM

Made with Slides.com