Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/10/2011, 08:02
Avatar de rocka8613
rocka8613
 
Fecha de Ingreso: abril-2010
Mensajes: 33
Antigüedad: 10 años, 1 mes
Puntos: 0
Error de transaccion activa con JPA

Saludos a todos, tengo el siguiente inconveniente guardando en BD con JPA, resulta k al realizar el manager.persist(imp); o manager.merge(imp); la aplicacion se cualga y me sale error pork existe una transaccion activa, podria alguien ayudarme, no se k pueda ser ya que de la misma manera e construido otros metodos y me funcionan perfectamente.


la BD esta en un servidor diferente pero incluso apuntando a una base de datos local me sale el mismo error, muchas gracias por cualquier colaboracion

el metodo es el siguiente, recibe una lista de entidades y un numero de registros a guardar por lote.


@SuppressWarnings("unchecked")
public void saveCalculations(List<ImaTitulosOperacion> result, int numLotes) {

if (result.isEmpty())
return;

EntityManager manager = EntityManagerHelper.getEntityManager();
EntityTransaction transaction = manager.getTransaction();

if(numLotes > result.size()){
numLotes = result.size();
}

try {

Query selectHistorical = manager.createQuery("SELECT x FROM ImaTitulosOperacion x WHERE x.pk.itoFecha=?1");
selectHistorical.setParameter(1, result.get(0).getPk().getItoFecha());

List<ImaTitulosOperacion> dbHistorical = (List<ImaTitulosOperacion>)selectHistorical.getRes ultList();
Hashtable<String, ImaTitulosOperacion> hash = new Hashtable<String, ImaTitulosOperacion>();

for (ImaTitulosOperacion historical : dbHistorical)
hash.put(historical.getPk().getItoFecha().toString ()+ "-" + historical.getPk().getItoOrigenComercial(), historical);

transaction.begin();
int i=0;
for (ImaTitulosOperacion imp : result) {

ImaTitulosOperacion validate = hash.get(imp.getPk().getItoFecha().toString() + "-" + imp.getPk().getItoOrigenComercial());

if (validate == null) {
log4j.info("Almacenando Operación: " + imp.getPk().getItoOrigenComercial() +
" fecha: " + imp.getPk().getItoFecha());
manager.persist(imp);
hash.put(imp.getPk().getItoFecha().toString() + "-" + imp.getPk().getItoOrigenComercial(), imp);
} else {
log4j.info("Actualizando Operación: " + imp.getPk().getItoOrigenComercial() +
" fecha: " + imp.getPk().getItoFecha());
manager.merge(imp);

i++;
if(i%numLotes==0){
transaction.commit();
manager.close();
manager = EntityManagerHelper.getEntityManager();
transaction = manager.getTransaction();

if(i!=result.size()){
transaction.begin();
}
}
}

if (transaction.isActive()){
transaction.commit();
}
log4j.info("Se almacenaron los datos correctamente");
} catch (IllegalStateException ex) {
if (transaction.isActive())
transaction.rollback();
log4j.error("operación inválida contra la BD al almacenar los cálculos", ex);
throw new DataAccessOperationException("operación inválida contra la BD al almacenar los cálculos", ex);
} catch (TransactionRequiredException ex) {
if (transaction.isActive())
transaction.rollback();
log4j.error("operación inválida contra la BD al almacenar los cálculos", ex);
throw new DataAccessOperationException("operación inválida contra la BD al almacenar los cálculos", ex);
} catch (PersistenceException ex) {
if (transaction.isActive())
transaction.rollback();
log4j.error("Actualización no permitida por restricción de relaciones al almacenar los cálculos.", ex);
throw new DataAccessOperationException("Actualización no permitida por restricción de relaciones al almacenar los cálculos.", ex);
} catch (Exception ex) {
if (transaction.isActive())
transaction.rollback();
log4j.error("Ocurrio un error inesperado al almacenar los cálculos", ex);
throw new DataAccessUnexpectedException("Ocurrio un error inesperado al almacenar los cálculos", ex);
} finally {
if (manager.isOpen())
manager.close();
}

}