View Javadoc
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 }