Boa Tarde Colegas,
estou com um problema ao criar um open session in view filter, para resolver os problemas com lazy. porem não estou conseguindo
recuperar a transação para poder abrir e fechar.
segue abaixo como estou fazendo
import java.io.IOException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import com.ibm.ejs.util.ThreadLocal;
public class JPASessionRequestFilter implements Filter {
private static EntityManagerFactory sf;
private static final ThreadLocal tls = new ThreadLocal();
private static final ThreadLocal tltx = new ThreadLocal();
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
beginTransaction();
chain.doFilter(request, response);
commitTransaction();
} catch (Throwable ex) {
rollbackTransaction();
throw new ServletException(ex);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
openSession();
}
protected static synchronized
EntityManagerFactory getSessionFactory(String name) {
if (sf == null) {
sf = Persistence.createEntityManagerFactory(name);
}
return sf;
}
public static void openSession() {
EntityManager s = (EntityManager) tls.get();
if (s == null) {
s = getSessionFactory("saog-core-service").createEntityManager();
tls.set(s);
tls.get();
}
}
public static EntityManager getCurrentSession() {
return (EntityManager) tls.get();
}
public static void closeSession() {
EntityManager s = (EntityManager) tls.get();
tls.set(null);
if (s != null && s.isOpen()) s.close();
}
public static void beginTransaction() {
EntityTransaction tx = (EntityTransaction) tltx.get();
if (tx == null) {
tx = getCurrentSession().getTransaction();
tx.begin();
tltx.set(tx);
}
}
public static void commitTransaction() {
EntityTransaction tx = (EntityTransaction)tltx.get();
if (tx != null && tx.isActive()) tx.commit();
tltx.set(null);
}
public static void rollbackTransaction() {
EntityTransaction tx = (EntityTransaction)tltx.get();
tltx.set(null);
if (tx != null && tx.isActive()) tx.rollback();
}
}
porem quando uso o begin no qual ele vai pelo getCurrentSession para recuperar o getTransaction da o seguinte erro:
org.apache.openjpa.persistence.InvalidStateException: You cannot access the EntityTransaction when using managed transactions.
Att,