public class PersistenceFilter implements Filter { protected static final Logger log = Logger.getLogger(PersistenceFilter.class.getName()); private EntityManagerFactory factory; @Override public void init(FilterConfig filterConfig) throws ServletException { factory = Persistence.createEntityManagerFactory("mydb"); } @Override public void destroy() { factory.close(); } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { EntityManager em = factory.createEntityManager(); ThreadLocalEntityManager.set(em); EntityTransaction tx = em.getTransaction(); tx.begin(); try { chain.doFilter(req, res); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { log.info("closing EntityManager: " + EMF.entityManager()); em.close(); } } } ThreadLocalEntityManager { private static ThreadLocal holder = new ThreadLocal(); private ThreadLocalEntityManager() { } public static EntityManager get() { return holder.get(); } public static void set(EntityManager em) { holder.set(em); } }