/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2014, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.jpa;
import javax.persistence.EntityManager;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Ленивая транзакция для JPA Container.
*/
final public class LazyJtaTransactionContext {
final private UserTransaction userTransaction;
final private EntityManager entityManager;
boolean active;
public LazyJtaTransactionContext(UserTransaction userTransaction, EntityManager entityManager) {
this.userTransaction = userTransaction;
this.entityManager = entityManager;
}
public EntityManager getEntityManager() {
if (!active) {
try {
if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION) {
userTransaction.begin();
active = true;
}
} catch (NotSupportedException e) {
logger().log(Level.WARNING, "failure", e);
throw new RuntimeException(e);
} catch (SystemException e) {
logger().log(Level.WARNING, "failure", e);
throw new RuntimeException(e);
}
}
return entityManager;
}
public void close(boolean success) {
if (active) {
active = false;
try {
if (success) {
userTransaction.commit();
} else {
userTransaction.rollback();
}
} catch (RollbackException e) {
logger().log(Level.WARNING, "rollback", e);
} catch (HeuristicMixedException e) {
logger().log(Level.WARNING, "heuristic failure", e);
} catch (HeuristicRollbackException e) {
logger().log(Level.WARNING, "heuristic rollback", e);
} catch (SystemException e) {
logger().log(Level.WARNING, "failure", e);
}
}
}
private Logger logger() {
return Logger.getLogger(getClass().getName());
}
}