1 16 17 package org.springframework.orm.jpa.support; 18 19 import java.io.IOException ; 20 21 import javax.persistence.EntityManager; 22 import javax.persistence.EntityManagerFactory; 23 import javax.persistence.PersistenceException; 24 import javax.servlet.FilterChain ; 25 import javax.servlet.ServletException ; 26 import javax.servlet.http.HttpServletRequest ; 27 import javax.servlet.http.HttpServletResponse ; 28 29 import org.springframework.dao.DataAccessResourceFailureException; 30 import org.springframework.orm.jpa.EntityManagerHolder; 31 import org.springframework.transaction.support.TransactionSynchronizationManager; 32 import org.springframework.web.context.WebApplicationContext; 33 import org.springframework.web.context.support.WebApplicationContextUtils; 34 import org.springframework.web.filter.OncePerRequestFilter; 35 36 64 public class OpenEntityManagerInViewFilter extends OncePerRequestFilter { 65 66 public static final String DEFAULT_PERSISTENCE_MANAGER_FACTORY_BEAN_NAME = "entityManagerFactory"; 67 68 private String entityManagerFactoryBeanName = DEFAULT_PERSISTENCE_MANAGER_FACTORY_BEAN_NAME; 69 70 71 76 public void setEntityManagerFactoryBeanName(String entityManagerFactoryBeanName) { 77 this.entityManagerFactoryBeanName = entityManagerFactoryBeanName; 78 } 79 80 84 protected String getEntityManagerFactoryBeanName() { 85 return this.entityManagerFactoryBeanName; 86 } 87 88 89 protected void doFilterInternal( 90 HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 91 throws ServletException , IOException { 92 93 EntityManagerFactory emf = lookupEntityManagerFactory(request); 94 boolean participate = false; 95 96 if (TransactionSynchronizationManager.hasResource(emf)) { 97 participate = true; 99 } 100 else { 101 logger.debug("Opening JPA EntityManager in OpenEntityManagerInViewFilter"); 102 try { 103 EntityManager em = createEntityManager(emf); 104 TransactionSynchronizationManager.bindResource(emf, new EntityManagerHolder(em)); 105 } 106 catch (PersistenceException ex) { 107 throw new DataAccessResourceFailureException("Could not create JPA EntityManager", ex); 108 } 109 } 110 111 try { 112 filterChain.doFilter(request, response); 113 } 114 115 finally { 116 if (!participate) { 117 EntityManagerHolder emHolder = (EntityManagerHolder) 118 TransactionSynchronizationManager.unbindResource(emf); 119 logger.debug("Closing JPA EntityManager in OpenEntityManagerInViewFilter"); 120 emHolder.getEntityManager().close(); 121 } 122 } 123 } 124 125 133 protected EntityManagerFactory lookupEntityManagerFactory(HttpServletRequest request) { 134 return lookupEntityManagerFactory(); 135 } 136 137 144 protected EntityManagerFactory lookupEntityManagerFactory() { 145 if (logger.isDebugEnabled()) { 146 logger.debug("Using EntityManagerFactory '" + getEntityManagerFactoryBeanName() + 147 "' for OpenEntityManagerInViewFilter"); 148 } 149 WebApplicationContext wac = 150 WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); 151 return (EntityManagerFactory) 152 wac.getBean(getEntityManagerFactoryBeanName(), EntityManagerFactory.class); 153 } 154 155 161 protected EntityManager createEntityManager(EntityManagerFactory emf) { 162 return emf.createEntityManager(); 163 } 164 165 } 166 | Popular Tags |