1 package model.repository;
2
3 import org.hibernate.Session;
4 import org.hibernate.SimpleNaturalIdLoadAccess;
5
6 import javax.persistence.EntityManager;
7 import javax.persistence.LockModeType;
8 import javax.persistence.PersistenceContext;
9 import javax.persistence.criteria.CriteriaQuery;
10 import java.io.Serializable;
11 import java.util.List;
12
13 /**
14 * Classe che incapsula la logica CRUD di base per tutte le entità persistenti
15 * @see javax.persistence.EntityManager
16 */
17 public class GenericRepository implements Serializable {
18
19 @PersistenceContext
20 protected EntityManager em;
21
22 /**
23 * Trova per chiave primaria
24 * @return L'entità trovata o null se l'entità non esiste
25 * @throws IllegalArgumentException se la chiave primaria fornita è null o non valida per l'entità da cercare
26 * @see javax.persistence.EntityManager#find(Class, Object)
27 */
28 public <T> T findById(Class<T> entityClass, Object primaryKey, boolean loadLazily) {
29 return loadLazily ? em.getReference(entityClass, primaryKey) :
30 em.find(entityClass, primaryKey, LockModeType.NONE);
31 }
32
33 /**
34 * Trova per chiave primaria, restituendo un'entità caricata pigramente (lazy-loaded). L'entità restituita viene
35 * caricata al primo accesso effettuato. Se l'istanza non esiste, viene lanciato {@link javax.persistence.EntityNotFoundException}
36 * quando l'istanza viene acceduta per la prima volta.
37 * @return L'entità caricata pigramente
38 * @throws IllegalArgumentException se la chiave primaria fornita è null o non valida per l'entità da cercare
39 * @throws javax.persistence.EntityNotFoundException se l'entità non può essere acceduta
40 * @see javax.persistence.EntityManager#getReference(Class, Object)
41 */
42 public <T> T findById(Class<T> entityClass, Object primaryKey){
43 return findById(entityClass,primaryKey,false);
44 }
45
46 public <T> T findByNaturalId(Class<T> entityClass, Object naturalKey) {
47 return findByNaturalId(entityClass,naturalKey,false);
48 }
49
50 public <T> T findByNaturalId(Class<T> entityClass, Object naturalKey, boolean getReference) {
51 SimpleNaturalIdLoadAccess<T> entity = em.unwrap(Session.class).bySimpleNaturalId(entityClass);
52 return getReference ? entity.getReference(naturalKey) : entity.load(naturalKey);
53 }
54
55 /**
56 * Restituisce una lista tipata contenente tutte le istanze di una determinata entità di persistenza
57 * @return La lista dei risultati
58 * @throws javax.persistence.QueryTimeoutException In caso di timeout raggiunto
59 * @throws javax.persistence.PersistenceException
60 */
61 public <T> List<T> findAll(Class<T> entityClass) {
62 CriteriaQuery<T> c = em.getCriteriaBuilder().createQuery(entityClass);
63 c.select(c.from(entityClass));
64 return em.createQuery(c).getResultList();
65 }
66
67 /**
68 * Restituisce il numero indicante la quantità di istanze di una determinata entità di persistenza
69 * @return La quantità di istanze
70 * @throws javax.persistence.QueryTimeoutException In caso di timeout raggiunto
71 * @throws javax.persistence.PersistenceException
72 */
73 public <T> Long getCount(Class<T> entityClass) {
74 CriteriaQuery<Long> c =
75 em.getCriteriaBuilder().createQuery(Long.class);
76 c.select(em.getCriteriaBuilder().count(c.from(entityClass)));
77 return em.createQuery(c).getSingleResult();
78 }
79
80 /**
81 * Crea un'istanza persistente e gestita (managed entity)
82 * @param entity L'istanza di entità
83 * @return L'istanza passata come parametro
84 * @throws javax.persistence.EntityExistsException se l'entità esiste già
85 * @see javax.persistence.EntityManager#persist(Object)
86 */
87 public <T> T insert(T entity) {
88 em.persist(entity);
89 em.flush();
90 return entity;
91 }
92
93 /**
94 * Unisce lo stato di una data entità allo stato nel contesto di persistenza
95 * @param entity
96 * @return Una copia <i>managed</i> dell'entità passata come parametro
97 * @see javax.persistence.EntityManager#merge(Object)
98 */
99 public <T> T merge(T entity) {
100 return em.merge(entity);
101 }
102
103 /**
104 * Rimuove l'istanza dal contesto di persistenza
105 * @param entity L'entità managed da rimuovere
106 * @throws IllegalArgumentException se l'entità passata non è managed
107 */
108 public <T> void remove(T entity) {
109 em.remove(entity);
110 }
111 }