Vous êtes sur la page 1sur 5

Apoyo para el uso de JPA

Persistencia con JPA: Los componentes del Java Persistence API se encuentran en el paquete de javax.persistence JPA Est basado en annotations los cuales cuentan con la siguiente estructura:
@NombreAnotacion (parametro=valor, parametro2=Tipo.CONSTANTE) @Entity @Table (venta_mayoreo)

El acceso a bases de datos con el Java Persistence API, utiliza fuertemente los siguientes elementos: persistence.xml: Contiene la configuracin de la capa de Persistencia, la cual incluye: La Unidad de persistencia: Indica el nombre de la unidad de persistencia, la cual nos permite acceder a todos los recursos asignados a la conexin, tablas y entidades de la base de datos. La conexin a la base de datos : Indica el URL de acceso a datos, el Driver especfico de la base de datos. Transacciones: Indica el tipo de transacciones para la base de datos RESOURCE_LOCAL para Swing y JTA para aplicaciones Web y Empresariales. Entidades: Las entidades que estn mapeadas entre Java y la base de datos. EntityManagerFactory (EMF): Es el responsable de obtener la unidad de persistencia, la cual permitir ligar Java con el acceso a datos. La unidad de persistencia se puede obtener de la siguiente manera: EntityManagerFactory emf = Persistence.createEntityManagerFactory( "NombreUnidadPU"); EntityManager (EM): Es el responsable de actualizar y leer la base de datos utilizando las entidades descritas en Java. Un EntityManager se obtiene del EMF de la siguiente manera: EntityManager em = emf.createEntityManager();

Si no se describe la informacin de la columna utilizando la anotacin @Column se mapear utilizando el tipo equivalente en la base de datos y buscar un campo con el mismo nombre en la base de datos. Ver la Tabla 1. Si el campo de la llave primaria es un campo generado es necesario utilizar la anotacin de @GeneratedValue() acompaado de una estrategia, IDENTITY, TABLE, SEQUENCE, AUTO, . Las relaciones de uno a muchos, muchos a uno, muchos a muchos, se implementan utilizando Collections. Los tipos de datos de la tabla deben mapearse a los tipos de datos de Java: Base de Datos Integer Numeric Date TimeStamp Varchar, varchar2, char o text Blob Currency Java Integer o int Float, float, Double o double java.util.Date, java.sql.Date java.util.Date, java.sql.Date, java.sql.Timestamp String InputStream o byte[]. Depdende de la base de datos BigDecimal

Entidades: Las entidades se declaran utilizando annotations.


@Entity @Table(name = "articulo") @NamedQueries( { @NamedQuery(name = "Articulo.buscarTodos", query = "SELECT a FROM Articulo a "), @NamedQuery(name = "Articulo.buscarPorPK", query = "SELECT a FROM Articulo a " + "WHERE a.idArticulo = :idArticulo") }) public class Articulo implements Serializable { @Id @Column(name = "id_articulo", nullable = false) // NO OLVIDAR EL GENERADOR @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer idArticulo; @Column(name = "clave", nullable = false, unique=true ) private String clave; @Column(name = "nombre", nullable = false, leght=16) private String nombre;

Reglas bsicas Las entidades se declaran utilizando annotations a travs de los Plain Old Java Objects (POJO), los cuales no son ms que clases sencillas de Java, con propiedades y mtodos set y get. Es muy importante sealar que al utilizar anotaciones en Java, no se termina la instruccin con punto y coma. Se toman en cuenta algunas de las siguientes reglas: Cada clase que se desea utilizar en la capa de persistencia, debe tener la anotacin de @Entity En caso de que el nombre de la tabla, no coincida con el nombre de la clase se utiliza la anotacin @Table("nombreTabla") Cada una de las propiedades de la clase est mapeada a un campo de una tabla en la base de datos (a menos de que sea transitiva, @Transient).
Versin 1.2

Pgina 1 de 5

Apoyo para el uso de JPA


@Column(name = "cantidad", nullable = false) private int cantidad; @Column(name = "precio") private BigDecimal precio; //Constructores //Mtodos Sets y Gets (Son necesarios) }

Consultas: Las consultas en JPA se generar a partir de los Objetos generados en Java que utilicen el Annotation @Entity. Las consultas se crean utilizando EJB-QL el cual obliga a utilizar el nombre de las clases no el de las tablas. Por ejemplo: Si se cuenta con la tabla cuenta_cliente, y una clase CuentaCliente, la consulta se crea utilizando la clase CuentaCliente y sus propiedades:
SELECT cc FROM CuentaCliente cc WHERE cc.cliente.nombre LIKE :param

Para ejecutar la consulta se utiliza el objeto javax.persistence.Query el cual se obtiene del EntityManager. Ejemplo:
Query query = em.createQuery(SELECT cc FROM CuentaCliente); List<CuentaCliente> cuentas = query.getResultList();

Si se desea obtener slo un registro de la consulta


Query query = em.createQuery(SELECT cc FROM CuentaCliente + WHERE cc.numeroCuenta=:parametro); query.setParameter(parametro, new Integer(5566));

CuentaCliente cuenta = query.getSingleResult();

One-to-One(uno a uno)
Cada instancia de una entidad est relacionada a una sola instancia de otra entidad. Se indica con la anotacin @OneToOne
@Entity public class Empleado { ... @OneToOne @JoinColumn(name="usuario", referencedColumnName = "usuario", unique = true, nullable = true, updatable = false) private Usuario usuario; ... } @Entity public class Usuario { ... @OneToOne(mappedBy="usuario") private Empelado empleado; ... }

Relaciones con JPA

Versin 1.2

Pgina 2 de 5

Apoyo para el uso de JPA One-to-Many (uno a muchos)


Una entidad puede relacionarse a mltiples instancias de otra clase. Un ejemplo comn es una factura que tiene muchos detalles. Se indica con la anotacin @OneToMany y comnmente est asociada a un Set de elementos. Ejemplo de asociacin Bidireccional Definicin del one to many
@Entity public class Departamento { ... @OneToMany( cascade={CascadeType.PERSIST, CascadeType.MERGE}, mappedBy="departamento") private Set<Empleado> empelados; ... }

mappedBy en la forma inversa de la relacin. Es decir se utilizar por ejemplo el @ManyToOne que defina el lado opuesto de la relacin. Many-to-One (muchos a uno) Muchas intancias de una clase se relacionan a una sola instancia de otra clase (es la versin inversa de One to Many). Se indica con la anotacin @ManyToOne
@Entity public class Empleado { ... @ManyToOne @JoinColumn(name="id_departamento", nullable=false) public Departamento departamento; } ... }

Definicin del lado inverso de la relacin


@Entity public class Empleado { ... @ManyToOne @JoinColumn(name="id_departamento", nullable=false) public Departamento departamento; } ... }

Many-to-Many (muchos a muchos) Las instancias de una entidad se pueden relacionar con mltiples entidades de otra clase y viceversa. Un ejemplo sera un estudiante que tiene muchas clases y una clase que tiene muchos estudiantes a su vez. Se indica con la anotacin @ManyToMany
@Entity public class Empleado { ... @ManyToMany(fetch=FetchType.EAGER) @JoinTable( name="empleado_asignado", schema="public", joinColumns={ JoinColumn(name="id_empleado", referencedColumnName="numero_empleado") }, inverseJoinColumns={ @JoinColumn(name="id_proyecto", referencedColumnName="id_proyecto") } ) private Set<Proyecto> proyectosAsignados; @Entity public class Proyecto { ... @ManyToMany(mappedBy="proyectosAsignados") private Set<Empleado> empleados; ... }

Attributos de un @OneToMany cascade (Opcional ) Default: Un array vacio que contiene elementos del tipo CascadeType. Por default JPA no asigna ninguna operacin de cascada en una asociacin, sin embargo se pueden utilizar los siguientes tipos de operaciones en Cascada: ALL - Se realizan los cambios en las entidades sealadas por la operacin en cualquier operacin de persistencia realizada. MERGE - Si se realiza una operacin de actualizacin en la entidad se realizarn los cambios en las entidades sealadas por el @OneToMany. PERSIST -Si se realiza una operacin de escritura en la entidad se agregarn las entidades sealadas por el @OneToMany.. REFRESH - Si se realiza una actualizacin en la entidad se realizarn los cambios en las entidades sealadas por el @OneToMany.. REMOVE - Si se realiza una operacin que implique eliminar una entidad entidad se eliminarn las entidades sealadas por el @OneToMany.. mappedBy (Opcional) Opcional: Depende si es unidireccional o bidireccional Default: Si la relacin es unidereccional el proveedor de persistencia determinar el campo que contiene la unin. Si la relacin es bidireccional, es necesario definir el
Versin 1.2

Pgina 3 de 5

Apoyo para el uso de JPA

Checklist de Verificacin Hibernate


Verificacin de Inicio de la Unidad de persistencia:
Si la aplicacin presenta problemas al Iniciar es necesario verificar que: Las librerias estn completas. Donde en Hibernate 3.4 es necesario validar que cuente cuando menos con: antlr-2.XX.jar c3p0-0.9.x.jar commons-collections-3.x.jar dom4j.1.6.x.jar ehcache-1.2.x.jar ejb3-persistence.jar hibernate3.jar hibernate-annotations.jar hibernate-commons-annotations.jar hibernate-core.jar hibernate-entitymanager.jar javassits-3.4.G.A.jar jta-1.1.jar Adicionales que puede requerir asm.jar asm-attrs.jar cglib-2.1.3.jar commons-beanutils-1.7.x.jar commons-digester-1.6.jar commons-lang-2.x.jar Driver de la base de datos Las librerias se hayan sido cargadas en el espaci de trabajo, si est utilizando Eclipse Las librerias hayan sido seleccionadas en la seccin de Java EE Module Dependencies, si utiliza eclipse El archivo persistence.xml existe en la carpeta META-INF dentro de la carpeta src. Ejemplo: Source Folder/META-INF/persistence.xml El archivo persistence.xml este escrito en minsculas. Esten registradas todas las entidades que est utilziando Exista configurada una conexin El driver de jdbc para la base de datos est registrado en el proyecto y se exporte con la aplicacin. La estructura del XML est correcta. Es decir que no haya tags incompletos. En caso de que el sistema continue marcando error valide si es error del archivo persisntece.xml o de las entidades registradas.

La unidad de persistencia sea de tipo RESOURCE_LOCAL para Swing y Tomcat, y JTA en caso de que utilice un Servidor de aplicaciones. La conexin cuente con un: url usuario y password Driver Dialecto Proveedor en caso de Hibernate El pool de conexiones se encuentra registrado en el archivo, si est utilizando alguno.

Verificacin de las entitades:


Para veriricar las entidades estn correctas valide que: La entidad est registrada en el archivo persistence.xml Las clases y anotaciones que utilice en la declaracin de las entidades se encuentren en el paquete: javax.persistence.*; Las clases y anotaciones estn importadas correctamente. La entidad cuenta con la anotacin de @Entity. La entidad cuente con la anotacin de @Table(name=table_base). El nombre de la tabla est escrito correctamente en la anotacin @Table. La tabla exista en la base de datos a la cual se conecta. La entidad tenga una Llave primaria declada con la anotacin de @Id. La llave primaria que tiene un valor auto generado utilice la anotacin con el @GeneratedValue(strategy=GenerationType.XXXXX). Tenga declaradas todas las columnas con el @Column. El nombre de las columnas est escrito en el atributo name de la anotacin de @Column. Ejemplo @Column(name=id_tarea_programada) Las columnas descritas en la entidad existan en la base de datos. Las columnas que no puedan ser nulas es necesario marcarlas con el atributo de nullable = false en la anotacin de @Column. Las propiedades que no deban registrarse en la base de datos utilicen la anotacin de @Transient. Las relaciones entre entidades estn bien descritas. (Ver la seccin de relaciones entre entidades). Las propiedades de la clase ligadas a la base de datos cuenten con su mtodo set y get correspondiente.

Verificacin del archivo persistence.xml:


Para veriricar la configuracin de persistencia valide que: El archivo persistence.xml existe en la carpeta META-INF dentro de la carpeta src. Ejemplo: Source Folder/META-INF/persistence.xml El archivo persistence.xml este escrito en minsculas.
Versin 1.2 Pgina 4 de 5

Apoyo para el uso de JPA Ejemplo de Archivo de Persistencia para Hibernate:


<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="CallCenterPU" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>paquete.Clase</class> <properties> <!-- Configuracin de la conexin a la base de datos --> <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /> <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/database" /> <property name="hibernate.connection.username" value="usuario" /> <property name="hibernate.connection.password" value="password" /> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> <!-- property name="hibernate.hbm2ddl.auto" value="update" /--> <!-- Configuracin del pool de conexiones --> <property name="hibernate.c3p0.max_size" value="5" /> <property name="hibernate.c3p0.min_size" value="3" /> <property name="hibernate.c3p0.timeout" value="3600" /> <property name="hibernate.c3p0.max_statements" value="100" /> <property name="hibernate.c3p0.idle_test_period" value="360" /> <property name="hibernate.c3p0.acquire_increment" value="3" /> </properties> </persistence-unit> </persistence>

Mapeo de propiedades:

Versin 1.2

Pgina 5 de 5

Vous aimerez peut-être aussi