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 }