OpenEntityManagerView 的使用

本文介绍了OpenEntityManagerInView的工作原理及其在解决JPA延迟加载时出现的LazyInitialize异常的应用场景。此外,还探讨了该模式在高并发环境下的局限性,并提供了配置示例。
摘要由CSDN通过智能技术生成

OpenEntityManagerInViewHibernateOpenSessionInView一样,服务端在接收到一个请求的时候开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中,这样的话可以不会破坏其私有属性的,如果放在属性中的话会利用反射机制去获取对象


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值