Java Generic Repository y JPA
Java Generic Repository y JPA
El concepto de Java Generic Repository es muy habitual cuanto trabajamos con tecnologías
de persistencia. El concepto de Repository como clase que se encarga de gestionar todas las
operaciones de persistencia contra una tabla de la base de datos es hace ya mucho tiempo
un clásico.
www.arquitecturajava.com
Java Generic Repository y JPA
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
www.arquitecturajava.com
Java Generic Repository y JPA
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.12.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
Una vez añadidas las dependencias vamos a construir el fichero persistence.xml que nos
configura los parametros de acceso a la base de datos.
<persistence 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_2_0.xsd"
version="2.0">
<persistence-unit name="mislibros">
<properties>
<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-
drop"/>
www.arquitecturajava.com
Java Generic Repository y JPA
<property name="javax.persistence.jdbc.driver"
value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost:8889/mibasedatos"/>
<property name="javax.persistence.jdbc.user"
value="root"/>
<property name="javax.persistence.jdbc.password"
value="root "/>
</properties>
</persistence-unit>
</persistence>
package bo;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Libro {
@Id
private String titulo;
private String autor;
private int paginas;
private String categorias;
public Libro() {
super();
}
www.arquitecturajava.com
Java Generic Repository y JPA
www.arquitecturajava.com
Java Generic Repository y JPA
}
}
Es momento de construir el Java Generic Repository del cual el resto de nuestras clases se
va a apoyar junto con su interface.
package com.arquitecturajava.repository;
T create(T t);
T find(T t);
T update(T t);
Iterable<T> findAll();
}
package com.arquitecturajava.repository;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
www.arquitecturajava.com
Java Generic Repository y JPA
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public GenericRepositoryJPA() {
Type t = getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) t;
type = (Class) pt.getActualTypeArguments()[0];
}
public T create(final T t) {
entityManager.persist(t);
return t;
}
www.arquitecturajava.com
Java Generic Repository y JPA
public T update(final T t) {
return entityManager.merge(t);
}
Creada la clase Genérica nos queda extender de ella y construir nuestro repositorio para la
clase Libro. En este caso es muy sencillo ya que no vamos a añadir métodos adicionales
www.arquitecturajava.com
Java Generic Repository y JPA
package com.arquitecturajava.repository;
import bo.Libro;
www.arquitecturajava.com
Java Generic Repository y JPA
package com.arquitecturajava;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.arquitecturajava.repository.LibroRepository;
import bo.Libro;
www.arquitecturajava.com
Java Generic Repository y JPA
www.arquitecturajava.com