orbeon-bluedb-integration/registration/registration-form/src/main/java/eu/mooseinc/dell/form/dao/impl/base/AbstractDao.java

115 lines
3.1 KiB
Java

/*********************************************************************************************************************************
* Autorskie Prawa Majątkowe - Moose Spółka z ograniczoną odpowiedzialnością
*
* Copyright 2017 Moose Spółka z ograniczoną odpowiedzialnością
********************************************************************************************************************************/
package eu.mooseinc.dell.form.dao.impl.base;
import eu.mooseinc.dell.form.dao.base.Dao;
import eu.mooseinc.dell.form.entity.base.BaseEntity;
import eu.mooseinc.dell.form.exception.ObjectNotFoundException;
import eu.mooseinc.dell.form.type.Entity;
import java.lang.reflect.ParameterizedType;
import java.text.MessageFormat;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Bazowa implementacja dla {@link Dao}.
*
* @param <T> typ encji.
*/
public abstract class AbstractDao<T extends BaseEntity> implements Dao<T> {
@Autowired
protected SessionFactory sessionFactory;
/**
* Klasa obiektu obsługiwanego przez DAO.
*/
private final Class<T> clazz;
/**
* Typ encji.
*/
private final Entity entity;
/**
* Konstruktor.
*
* @param entity typ encji.
*/
public AbstractDao(final Entity entity) {
this.clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
this.entity = entity;
}
@Override
public T persist(final T t) {
sessionFactory.getCurrentSession().persist(t);
return t;
}
@Override
public void delete(final long id) throws ObjectNotFoundException {
sessionFactory.getCurrentSession().delete(get(id));
}
@Override
public void remove(final T t) {
sessionFactory.getCurrentSession().delete(t);
}
@Override
public T find(final long id) {
return sessionFactory.getCurrentSession().get(clazz, id);
}
@Override
public T get(final long id) throws ObjectNotFoundException {
final T t = find(id);
if (t == null)
throw new ObjectNotFoundException(
MessageFormat.format("Nie odnaleziono obiektu {0} o identyfikatorze {1}", entity.getName(), id));
return t;
}
@Override
public List<T> getAll() {
final Session session = sessionFactory.getCurrentSession();
final CriteriaBuilder builder = session.getCriteriaBuilder();
final CriteriaQuery<T> criteriaQuery = builder.createQuery(clazz);
final Root<T> from = criteriaQuery.from(clazz);
criteriaQuery.select(from);
final Query<T> query = session.createQuery(criteriaQuery);
return query.getResultList();
}
/**
* Tworzy zapytanie nazwane.
*
* @param queryName nazwa zapytania HQL.
*
* @return obiekt zapytania.
*/
protected Query<T> createNamedQuery(final String queryName) {
return sessionFactory.getCurrentSession().createNamedQuery(queryName, clazz);
}
/**
* Zwraca rodzaj encji.
*
* @return rodzaj encji.
*/
protected Entity getEntity() {
return entity;
}
}