Spring 接管 Hibernate 配置 延迟加载(总结)

Spring配置延迟加载

两种方法:

1. 使用Spring提供的Open Session In View机制,它有两种配置方式OpenSessionInViewInterceptorOpenSessionInViewFilter,功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。

Open Session In Viewrequestsession绑定到当前thread期间一直保持hibernate sessionopen状态,使sessionrequest的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过FilterdoFilter方法或InterceptorpostHandle方法自动关闭session

a. web.xml中配置,使用OpenSessionInViewFilter过滤URL

1. <filter>

2.     <filter-name>hibernateFilter</filter-name>

3.     <filter-class>

4.         org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

5.     </filter-class>

6. </filter>

 

7. <filter-mapping>

8.     <filter-name>hibernateFilter</filter-name>

9.     <url-pattern>/*</url-pattern>

10. </filter-mapping>

 

b. application.xml配置,使用OpenSessionInViewInterceptor过滤URL

1.   <bean name="openSessionInViewInterceptor"

class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">

2.       <property name="sessionFactory">

3.           <ref bean="sessionFactory"/>

4.       </property>

5.   </bean>

6.   <bean id="urlMapping"

class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

7.       <property name="interceptors">

8.           <list>

9.               <ref bean="openSessionInViewInterceptor"/>

10.         </list>

11.     </property>

12.     <property name="mappings">

//配置需要过滤的URL

13.     </property>

14. </bean>

2. 通过在 Spring 应用程序上下文中的一些配置,我们可以让将调用 serviceProxy的方法拦截下来,再令它的方法支持延迟加载。当 serviceProxy被调用的时候, HibernateInterceptor 打开一个 Hibernate 会话,并将调用请求传递给 service对象。当 service执行完成后, HibernateInterceptor 透明地关闭了会话。应用层的代码不用了解任何持久层逻辑,还是实现了延迟加载。

1. <bean id="hibernateInterceptor"
    class="org.springframework.orm.hibernate3.HibernateInterceptor">

2.     <property name="sessionFactory" ref="sessionFactory"/>

3. </bean>

4. //配置对于的service例如配置Service

5. <bean id="service"
    class="xx.xxx.xxx.Service">

6.     <property name="xxxDao" ref="XXXDao"/>

7. </bean>

8. //配置代理

9. <bean id="serviceProxy"
    class="org.springframework.aop.framework.ProxyFactoryBean">

10.         <property name="target">

11.             <ref bean="service"/>

12.         </property>

13.         <property name="proxyInterfaces">

14.             <value>对于的service的接口</value>

15.         </property>

16.         <property name="interceptorNames">

17.             <list>

18.                 <value>hibernateInterceptor</value>

19.             </list>

20.         </property>

21.     </bean>

 

在单元测试中测试延迟加载

需要用 J-Unit 来测试我们的延迟加载程序。我们可以轻易地通过重写 TestCase 类中的 setUp tearDown 方法来实现这个要求。

1.   import junit.framework.TestCase;

2.   import org.hibernate.Session;

3.   import org.hibernate.SessionFactory;

4.   import org.springframework.orm.hibernate3.SessionFactoryUtils;

5.   import org.springframework.orm.hibernate3.SessionHolder;

6.   import org.springframework.transaction.support.TransactionSynchronizationManager;

7.   public abstract class MyLazyTestCase extends TestCase {

8.       private SessionFactory sessionFactory;

9.       private Session session;

10.     public void setUp() throws Exception {

11.         super.setUp();

12.         SessionFactory sessionFactory =

13.                         (SessionFactory) getBean("sessionFactory");

14.         session = SessionFactoryUtils.getSession(sessionFactory, true);

15.         Session s = sessionFactory.openSession();

16.         TransactionSynchronizationManager.bindResource(sessionFactory,
                                                         new SessionHolder(s));

17.     }

18.     protected Object getBean(String beanName) {

19.         //Code to get objects from Spring application context

20.         return null;

21.     }

22.     public void tearDown() throws Exception {

23.         super.tearDown();

24.         SessionHolder holder =
(SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);

25.         Session s = holder.getSession();

26.         s.flush();

27.         TransactionSynchronizationManager.unbindResource(sessionFactory);

28.         SessionFactoryUtils.closeSession(s);

29.     }

30. }

 

posted @   阿兹猫  阅读(1549)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示