Commit 5a166841528cae6c07e81a5003dfdd7bffb84bce
1 parent
78b1332d
Fix EntityManager injection in DAO implementation
Showing
3 changed files
with
45 additions
and
60 deletions
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 | ... | ... |