Está en la página 1de 9

Java Persistence API (JPA)

1. Que es Jpa JPA es una api desarrollada para trabajar directamente sobre una base de datos relacional como si esta fuese orientada a objetos, la idea principal es trabajar dinmicamente insertando, actualizando, recuperando y eliminando de la base de datos trabajando directamente con los objetos y no con las sentencias SQL. JPA puede ser trabajada bajo una serie de implementaciones o proveedores de persistencia, de este modo es el proveedor el que realiza el trabajo funcionando bajo la Api de JPA, estos pueden ser: Hibernate TopLink CocoBase EclipseLink OpenJPA Kodo DataNucleus Amber

Bajo JPA los objetos de un sistema pasan a llamarse entidades y el mapeo entre los objetos de java se realiza mediante la insercin se metadatos en las clases, los metadatos son anotaciones que el proveedor utiliza para realizar la persistencia, una entidad simple sera la siguiente: @Entity @Table (name= Usuario) public class Usuario { @Id @Column(name=Id, nulllable=false) private Long id; @Column (name="nombre", nullable=false) private String nombre;

@Column (name="nombre", nullable=false) private String apellido;; // Getters y Setters }

@Entity significa que el proveedor debe reconocer la clase como una entidad persistente, a su vez @Id se encuentra asociado con una columna, tambin se puede dejar especificado que se usara el generador de ids de la base de datos usando @GeneratedValue el proveedor de la base de datos le asignar un valor.

2. Anotaciones bsicas de la Api Anotaciones a nivel de campos y propiedades @Basic @Transient @Temporal @Lob @Enumerated @Embeddable y @Embedded

3. Asociaciones entre entidades: Estas se refieren a als tipicas relaciones entre objetos de la POO, las cuales se mapearon directamente a la BD, las asociaciones pueden ser: uno a uno <one-to-one name="employee" class="Employee" constrained="true"/> uno a muchos <one-to-one name="employee" class="Job"/>

muchos a uno <many-to-one name="product" class="Product" column="PRODUCT_ID"/> muchos a muchos <many-to-many column="addressId" unique="true" class="Address"/> Cuando creamos este tipo de asociaciones al igual que en una base de datos relacional debemos establecer comportamientos de los datos relacionados en distintas circunstancias: Ej: @OneToMany(cascade = CascadeType.ALL, mappedBy = "Alumno") private ArrayList<Alumno> Curso; CascadeType.PERSIST: Si perisitimos la entidad todas las entidades que contenga esta variable sern persistidas tambin CascadeType.REMOVE- Si borramos la entidad, todas las entidades que esten relacionadas con esta tambien se borraran (Si borramos el Curso se borraran tambien los Alumnos) CascadeType.REFRESH- Si actualizamos, todas las entidades que contengan la variable se actualizaran tambien CascadeType.MERGE: Si hacemos un "merge" de la entidad todas las entidades que contenga esta variable realizarn la misma operacin. CascadeType.ALL: Realizara todas las anteriores operaciones. 4. Clases de persistencia Las clases de persistencia son las clases donde se especifica como cada entidad sera mapeada a la bese de datos, de esta forma si tenemos una entidad contenida en la clase Cliente.java tendremos una clase de persistencia que podemos llamar Cliente.hbm.xml en donde queda especificado la forma y campos que seran mapeados. Ej: <class name="Estudiante" table="estudiante"> <comment>Determina la forma del mapeo de la entidad estudiante.</comment> <id name="id"> <generator class="increment"/> <!-- MySQL generator for a increment field --> </id>

<property name="nombre" column="fooname"/> <property name="apellido" column="bartaste"/> </class> Las clases de persistencia pueden ser definidas por separado, es decir tener Cliente.bhm.xml y tambien Usuario.bhm.xml, pero la forma ms adecuada es generar un nico .bhm.xml que contenga todas las clases de persistencia.

5. Transacciones

Hibernate + MySql Workbench En el presente texto se explicara en forma practica la configuracin y funcionamiento de la conexin de hibernate con MySql usando JDBC connection manager.

Lo primero es descargar los paquetes desde la pagina oficial de Hibernate, en este caso se utilizo hibernate-release-4.0.0.CR6 , asi mismo descargar el conector JDBC para MySql desde la pagina de este, en este caso mysql-connector-java-5.1.18-bin.

Los pasos de instalacin y configuracin son los siguientes:

1. Crear un proyecto en eclipse, en este caso llamado ejemplo 2. Crear una carpeta llamada lib y copiar los .jar que se encuentran en la carpeta lib del paquete descargado de Hibernate 3. Ahora haciendo click derecho sobre el proyecto ingresamos a propierties/Java Build Path / Libraries / y presionamos Add JARs 4. Luego de esto seleccionamos todos los .jar contenidos en la carpeta lib, y damos ok. 5. Luego de esto repetimos los mismos pasos ahora con el .jar del JDBC connection manager

Con estos simples pasos tenemos instalado Hibernate en el proyecto de eclipse, solo falta las clases para su configuracin. Las clases necesarias son: 1. hibernate.cfg.xml 2. SessionFactoryUtil 3. Clases persistentes 4. Clases .bhm.xml

1. hibernate.cfg.xml Esta es la clase que brinda la conexin con la bese de datos, adems de indicar a esta cuales son las entidades que se desean persistir. <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="connection.url">jdbc:hsqldb:hsql://localhost/nombreBD</property> <property name="connection.username">sa</property> <property name="connection.password"></property> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.HSQLDialect</property> <!-- Enable Hibernate's automatic session context management -->

<property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">update</property> <mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/> </session-factory> </hibernate-configuration> En esta clase es importante destacar las siguientes lineas: Conneccion con la BD <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="connection.url">jdbc:hsqldb:hsql://localhost/nombreBD</property> <property name="connection.username">Username</property> <property name="connection.password">Password<</property> Accion que se debe realizar sobre las tablas <property name="hbm2ddl.auto">update</property> Mapeo de clases <mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml"/>

2. SessionFactoryUtil Clase encargada de administrar sesiones y accesos para persistir algun elemento a la base de datos.

public class HibernateUtil {

private static final SessionFactory sessionFactory; static { try { // Create the SessionFactory from hibernate.cfg.xml sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; }

Ejemplo practico:

/** * Ejemplo * @author Victor Silva * creado 22 nov */ package persistentes; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.GeneratedValue;

@Entity public class Cliente { @Id @GeneratedValue private Integer id; private String nombre; private String apellido; public Cliente() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApellido() {

return apellido; } public void setApellido(String apellido) { this.apellido = apellido; } @Override public String toString() { return "Cliente: "+getId()+" Nombre: "+getNombre()+ " Apellido: "+getApellido(); } }

También podría gustarte