12/10/2011, 08:02
|
| | | Fecha de Ingreso: abril-2010
Mensajes: 33
Antigüedad: 14 años, 7 meses 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();
}
} |