
org.javabeanstack.data.AbstractDAO Maven / Gradle / Ivy
The newest version!
/*
* JavaBeanStack FrameWork
*
* Copyright (C) 2017 Jorge Enciso
* Email: [email protected]
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.javabeanstack.data;
import org.javabeanstack.error.ErrorManager;
import org.javabeanstack.error.IErrorReg;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
import javax.transaction.Status;
import javax.transaction.TransactionSynchronizationRegistry;
import org.apache.log4j.Logger;
import org.javabeanstack.error.ErrorReg;
import org.javabeanstack.security.ISessionsLocal;
import org.javabeanstack.security.IUserSession;
import org.javabeanstack.util.Fn;
import org.javabeanstack.util.Strings;
/**
* Esta clase se encarga de la conexión con la base de datos. Provee metodos que
* permiten la recuperación, busqueda, refresco, borrado, inserción y
* actualización de los registros. Esta clase se ejecuta como EJB en la capa de
* la lógica del negocio.
*
* @author Jorge Enciso
*/
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public abstract class AbstractDAO implements IGenericDAO, Serializable {
private static final Logger LOGGER = Logger.getLogger(AbstractDAO.class);
@Resource
TransactionSynchronizationRegistry tsr;
/**
* Es el objeto responsable de la creación y gestión de los entity manager
*/
@EJB
private IDBManagerLocal dbManager;
/**
* Es el objeto responsable gestión de las sesiones de usuarios
*/
@EJB
private ISessionsLocal sessions;
public AbstractDAO() {
}
/**
* Devuelve un entity manager. Se crea un entity manager por cada thread y
* unidad de persistencia.
*
* @param keyId
* @return un entity manager
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public EntityManager getEntityManager(String keyId) {
String persistUnit = keyId.substring(0, keyId.indexOf(":")).toLowerCase();
LOGGER.debug("getEntityManager()");
LOGGER.debug("pu: " + persistUnit + ", id: " + keyId);
return dbManager.getEntityManager(keyId);
}
/**
* Recupera todos los registros de una tabla
*
* @param
* @param entityClass clase mapeada a la tabla
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @return un list con los registros de una tabla
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findAll(Class entityClass,
IDBLinkInfo dbLinkInfo) throws Exception {
LOGGER.debug("---------------------------");
LOGGER.debug("findAll");
LOGGER.debug(entityClass.toString());
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
CriteriaQuery cq = em.getCriteriaBuilder().createQuery(entityClass);
cq.select(cq.from(entityClass));
List result = em.createQuery(cq).getResultList();
return result;
}
/**
* Devuelve un registro de una tabla dada
*
* @param
* @param entityClass clase mapeada a la tabla
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @param id identificador del registro
* @return un registro solicitado
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public T find(Class entityClass,
IDBLinkInfo dbLinkInfo,
Object id) throws Exception {
LOGGER.debug("---------------------------");
LOGGER.debug("find");
LOGGER.debug(entityClass.toString());
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
T row = em.find(entityClass, id);
// Si no hay transacción activada
if (Status.STATUS_NO_TRANSACTION == tsr.getTransactionStatus()) {
return row;
}
// Refrescar lazy members
List fields = DataInfo.getLazyMembers(row.getClass());
if (!fields.isEmpty()) {
List obj;
for (Field field : fields) {
field.setAccessible(true);
obj = (List) field.get(row);
obj.size();
}
}
return row;
}
/**
* Devuelve un registro a travéz de su clave unica.
*
* @param
* @param entityClass clase mapeada a una tabla
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @param ejb objeto ejb con los datos de la clave unica
* @return
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public T findByUk(Class entityClass,
IDBLinkInfo dbLinkInfo, T ejb) throws Exception {
LOGGER.debug("---------------------------");
LOGGER.debug("findByUk");
LOGGER.debug(entityClass.toString());
// Verificar que exista manera de generar la sentencia para buscar
// el registro o de lo contrario va a dar error.
if (ejb.getQueryUK() == null) {
return null;
}
// Buscar registro por la clave unica
T row;
Query q;
q = getEntityManager(getEntityId(dbLinkInfo)).createQuery(ejb.getQueryUK());
for (Parameter param : q.getParameters()) {
q.setParameter(param, ejb.getValue(param.getName()));
}
try {
row = (T) q.getSingleResult();
// Si no hay transacción activada
if (Status.STATUS_NO_TRANSACTION == tsr.getTransactionStatus()) {
return row;
}
// Refrescar lazy members
List fields = DataInfo.getLazyMembers(row.getClass());
if (!fields.isEmpty()) {
List obj;
for (Field field : fields) {
field.setAccessible(true);
obj = (List) field.get(row);
obj.size();
}
}
} catch (NoResultException exp) {
row = null;
}
return row;
}
/**
*
* @param
* @param entityClass clase mapeada a una tabla
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @param queryString sentencia jpql
* @param parameters parametros de la sentencia
* @return un objeto con valores del registro de la tabla solicitada
* @throws Exception
*/
@Override
public T findByQuery(Class entityClass, IDBLinkInfo dbLinkInfo,
String queryString, Map parameters)
throws Exception {
LOGGER.debug("---------------------------");
LOGGER.debug("findByQuery");
LOGGER.debug(queryString);
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
Query query = em.createQuery(queryString);
if (parameters != null && !parameters.isEmpty()) {
populateQueryParameters(query, parameters, queryString);
}
T result;
try {
result = (T) query.getSingleResult();
// Si hay transacción activada
if (Status.STATUS_NO_TRANSACTION != tsr.getTransactionStatus()) {
// Refrescar lazy members
List fields = DataInfo.getLazyMembers(result.getClass());
if (!fields.isEmpty()) {
List obj;
for (Field field : fields) {
field.setAccessible(true);
obj = (List) field.get(result);
obj.size();
}
}
}
} catch (NoResultException exp) {
result = null;
}
LOGGER.debug("-RESULT-");
LOGGER.debug(result);
return result;
}
/**
*
* @param
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @param queryString sentencia jpql
* @param parameters parametros de la sentencia
* @return una lista de objetos conteniendo los registros de la tabla
* solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByQuery(IDBLinkInfo dbLinkInfo,
String queryString,
Map parameters) throws Exception {
return findListByQuery(dbLinkInfo, queryString, parameters, 0, 0);
}
/**
*
* @param
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @param queryString sentencia jpql
* @param parameters parametros de la sentencia
* @param first a partir de este nro. de registro se va a traer los datos
* @param max cantidad maxima de registros
* @return una lista de objetos conteniendo los registros de la tabla
* solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByQuery(IDBLinkInfo dbLinkInfo,
String queryString,
Map parameters,
int first, int max) throws Exception {
LOGGER.debug("---------------------------");
LOGGER.debug("findListByQuery");
LOGGER.debug(queryString);
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
Query query = em.createQuery(queryString);
if (parameters != null && !parameters.isEmpty()) {
populateQueryParameters(query, parameters, queryString);
}
query.setFirstResult(first);
query.setMaxResults(max);
List result = (List) query.getResultList();
return result;
}
/**
*
* @param
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @param queryString sentencia jpql
* @param first a partir de este nro. de registro se va a traer los datos
* @param max cantidad maxima de registros
* @return una lista de objetos conteniendo los registros de la tabla
* solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByQuery(IDBLinkInfo dbLinkInfo,
String queryString,
int first, int max) throws Exception {
Map parameters = new HashMap<>();
return findListByQuery(dbLinkInfo, queryString, parameters, first, max);
}
/**
*
* @param
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @param namedQuery namedQuery
* @param parameters parámetros de la sentencia.
* @return un objeto con los datos del registro de la tabla solicitada
* @throws Exception
*/
@Override
public T findByNamedQuery(IDBLinkInfo dbLinkInfo,
String namedQuery,
Map parameters) throws Exception {
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
Query query = em.createNamedQuery(namedQuery);
if (parameters != null && !parameters.isEmpty()) {
populateQueryParameters(query, parameters, null);
}
query.setMaxResults(1);
T result;
try {
result = (T) query.getSingleResult();
// Si hay transacción activada
if (Status.STATUS_NO_TRANSACTION != tsr.getTransactionStatus()) {
// Refrescar lazy members
List fields = DataInfo.getLazyMembers(result.getClass());
if (!fields.isEmpty()) {
List obj;
for (Field field : fields) {
field.setAccessible(true);
obj = (List) field.get(result);
obj.size();
}
}
}
} catch (NoResultException exp) {
result = null;
}
return result;
}
/**
*
* @param
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @param namedQuery namedQuery
* @param parameters parámetros de la sentencia.
* @return una lista de objetos con los datos de los registros de la tabla
* solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByNamedQuery(IDBLinkInfo dbLinkInfo,
String namedQuery,
Map parameters)
throws Exception {
return findListByNamedQuery(dbLinkInfo, namedQuery, parameters, 0, 0);
}
/**
*
* @param
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @param namedQuery namedQuery
* @param first a partir de este nro. de registro se va a traer los datos
* @param max cantidad maxima de registros
* @return una lista de objetos con los datos de los registros de la tabla
* solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByNamedQuery(IDBLinkInfo dbLinkInfo,
String namedQuery,
int first, int max)
throws Exception {
Map parameters = new HashMap<>();
return findListByNamedQuery(dbLinkInfo, namedQuery, parameters, first, max);
}
/**
*
* @param
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @param namedQuery namedQuery
* @param parameters parámetros de la sentencia.
* @param first a partir de este nro. de registro se va a traer los datos
* @param max cantidad maxima de registros
* @return una lista de objetos con los registros de la tabla solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByNamedQuery(IDBLinkInfo dbLinkInfo,
String namedQuery,
Map parameters,
int first, int max) throws Exception {
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
Query query = em.createNamedQuery(namedQuery);
if (parameters != null && !parameters.isEmpty()) {
populateQueryParameters(query, parameters, null);
}
if (first > 0 && max > 0) {
query.setFirstResult(first);
query.setMaxResults(max);
}
List result = (List) query.getResultList();
return result;
}
/**
*
* @param dbLinkInfo información necesaria para acceder a la conexión de
* datos correcta (unidad de persistencia, sesión id etc).
* @param queryString sentencia sql
* @param parameters parámetros de la sentencia.
* @return una lista de objetos con datos de los registros solicitados
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy