OpenEntityManagerInView和Hibernate的OpenSessionInView一样,服务端在接收到一个请求的时候开启EntityManager,在请求结束的时候才去关闭这个EntityManager,和JpaDaoSupport一起可以很好地工作。
使用OpenEntityManagerInView可以解决JPA延迟加载出现的LazyInitialize异常。如果不使用JPA的 OpenEntityManagerInViewFilter,那么当使用玩getJpaTemplate().persist()或者remove() 方法后,Spring就会自动关闭EntityManager,因此,你使用了延迟加载的对象加载属性的时候将会出现LazyInitialize异常。
OpenEntityManagerInViewFilter会把连接放到线程池里面,不是马上关闭。因此,在请求的过程当中,我们可以随时使用这个EntityManager。当请求结束之后才会关闭这个EntityManager。
不过在高并发的时候,EntityManager的生命周期会比较长(因为请求开始到请求结束这段时间长),EntityManager不会立刻关闭,导致连接池连接数占用的问题。因此高并发的系统最好不要使用OpenEntityManagerInView模式。
配置如下,在web.xml里面添加一个filter:
<filter>
<filter-name>jpaFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>jpaFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@Repository用于标注数据访问组件,即DAO组件
@Service用于标注业务层组件,即Service层
@Controller用于标注控制层组件(如struts中的action)
@Component泛指组件,当组件不好归类的时候可以使用这个注解进行标注
@Resource根据指定的名称进行反射获取所指向的bean
@Autowired对类成员变量、方法及构造函数进行标注,完成自动装配的工作
@Repository、 @Service、@Component、@Service一般放在class上面进行注解,@Resource、@Autowired一般最好放在 setter中,这样的话可以不会破坏其私有属性的,如果放在属性中的话会利用反射机制去获取对象