Commit 5a166841528cae6c07e81a5003dfdd7bffb84bce

Authored by Benjamin Rühl
1 parent 78b1332d

Fix EntityManager injection in DAO implementation

services/Global/src/main/java/de/bht/beuthbot/daos/AppUserDAO.java
... ... @@ -10,11 +10,7 @@ import javax.ejb.Stateless;
10 10 * Created by Benjamin Rühl on 19.12.2017.
11 11 */
12 12 @Stateless
13   -public class AppUserDAO extends GenericHibernateDAO<User, Long> implements UserDAO {
14   -
15   - public AppUserDAO() {
16   - setEntityClass(AppUser.class);
17   - }
  13 +public class AppUserDAO extends GenericHibernateDAO<User, AppUser, Long> implements UserDAO {
18 14  
19 15 @Override
20 16 public User createUser() {
... ...
services/Global/src/main/java/de/bht/beuthbot/daos/GenericHibernateDAO.java
... ... @@ -2,102 +2,91 @@ package de.bht.beuthbot.daos;
2 2  
3 3 import de.bht.beuthbot.dataAccess.GenericDAO;
4 4 import de.bht.beuthbot.model.entities.Entity;
5   -import org.hibernate.Criteria;
6 5 import org.hibernate.Session;
7   -import org.hibernate.criterion.Criterion;
8 6  
  7 +import javax.annotation.PostConstruct;
9 8 import javax.ejb.Stateless;
10   -import javax.enterprise.inject.InjectionException;
11 9 import javax.persistence.EntityManager;
12 10 import javax.persistence.EntityManagerFactory;
13 11 import javax.persistence.PersistenceContext;
14 12 import javax.persistence.PersistenceUnit;
  13 +import javax.persistence.criteria.CriteriaBuilder;
  14 +import javax.persistence.criteria.CriteriaQuery;
  15 +import javax.persistence.criteria.Predicate;
  16 +import javax.persistence.criteria.Root;
15 17 import java.io.Serializable;
16 18 import java.lang.reflect.ParameterizedType;
17 19 import java.util.List;
18 20  
19 21 /**
20 22 * Created by Benjamin Rühl on 19.12.2017.
  23 + * Base class for DAO implementations using hibernate for persistence.
  24 + * Provides generic functionality for interaction with entities.
  25 + * @param <I> Interface type of entity class
  26 + * @param <T> Implementation type of entity class
  27 + * @param <ID> Type of entity's primary id
21 28 */
22 29 @Stateless
23   -public class GenericHibernateDAO<T extends Entity, ID extends Serializable> implements GenericDAO<T, ID> {
  30 +public class GenericHibernateDAO<I extends Entity, T extends I, ID extends Serializable> implements GenericDAO<I, ID> {
24 31  
25   - private Class<? extends T> entityClass;
26   - private Session session;
  32 + private Class<T> entityClass;
27 33  
28   - @PersistenceUnit(unitName = "PostgreSQLDS")
29   - private EntityManagerFactory emf;
  34 + @PersistenceUnit(unitName = "PostgresPU")
  35 + private EntityManagerFactory entityManagerFactory;
30 36  
31   - @PersistenceContext(unitName = "PostgreSQLDS")
32   - private EntityManager em;
  37 + @PersistenceContext(unitName = "PostgresPU")
  38 + private EntityManager entityManager;
33 39  
34 40 @SuppressWarnings("unchecked cast")
35   - public GenericHibernateDAO() {
36   - if (em == null)
  41 + @PostConstruct
  42 + public void init() {
  43 + if (entityManager == null)
37 44 throw new RuntimeException("EntityManager must not be null");
38 45  
39   - entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
40   - setSession( (Session)em.getDelegate() );
  46 + entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
41 47 }
42 48  
43   - public void setSession(Session s) {
44   - this.session = s;
45   - }
46   -
47   - protected Session getSession() {
48   - if (session == null)
49   - throw new IllegalStateException("Session has not been set on DAO before usage");
50   - return session;
51   - }
52   -
53   - /**
54   - * Use this in subclasses to set entityClass to derived type of T
55   - */
56   - protected void setEntityClass(Class<? extends T> entityClass) {
57   - this.entityClass = entityClass;
58   - }
59   -
60   - public Class<? extends T> getEntityClass() {
  49 + public Class<T> getEntityClass() {
61 50 return entityClass;
62 51 }
63 52  
64 53 @Override
65   - public T findById(ID id) {
66   - return getSession().load(getEntityClass(), id);
  54 + public I findById(ID id) {
  55 + return entityManager.find(getEntityClass(), id);
67 56 }
68 57  
69   - public List<T> findAll() {
  58 + @Override
  59 + public List<I> findAll() {
70 60 return findByCriteria();
71 61 }
72 62  
73 63 @Override
74   - public T saveOrUpdate(T entity) {
75   - getSession().saveOrUpdate(entity);
  64 + public I saveOrUpdate(I entity) {
  65 + entityManager.merge(entity);
76 66 return entity;
77 67 }
78 68  
79 69 @Override
80   - public void delete(T entity) {
81   - getSession().delete(entity);
82   - }
83   -
84   - public void flush() {
85   - getSession().flush();
86   - }
87   -
88   - public void clear() {
89   - getSession().clear();
  70 + public void delete(I entity) {
  71 + entityManager.remove(entity);
90 72 }
91 73  
92 74 /**
93 75 * Use this inside subclasses as a convenience method.
94 76 */
95   - @SuppressWarnings("unchecked")
96   - protected List<T> findByCriteria(Criterion... criterion) {
97   - Criteria crit = getSession().createCriteria(getEntityClass());
98   - for (Criterion c : criterion) {
99   - crit.add(c);
100   - }
101   - return crit.list();
  77 + protected List<I> findByCriteria(Predicate... restrictions) {
  78 + CriteriaBuilder builder = entityManager.getCriteriaBuilder();
  79 + CriteriaQuery<T> criteria = builder.createQuery(getEntityClass());
  80 + Root<T> criteriaRoot = criteria.from(getEntityClass());
  81 +
  82 + criteria.select(criteriaRoot);
  83 + criteria.where(restrictions);
  84 +
  85 + List<T> elements = entityManager.createQuery(criteria).getResultList();
  86 + return (List<I>) elements;
  87 + }
  88 +
  89 + protected EntityManager getEntityManager() {
  90 + return entityManager;
102 91 }
103 92 }
... ...
services/Global/src/main/resources/META-INF/persistence.xml
... ... @@ -4,7 +4,7 @@
4 4 http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
5 5 version="2.1">
6 6  
7   - <persistence-unit name="PostgreSQLDS" transaction-type="JTA">
  7 + <persistence-unit name="PostgresPU" transaction-type="JTA">
8 8  
9 9 <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
10 10  
... ...