很多新手都会遇到的hibernate session关闭时的延迟加载错误,我想原因大家都知道,当session关闭后,你去访问对象中的延迟加载属性,都会报session已关闭的错误。解决办法一般有四种:
1、hbm映射文件中,让集合或对象属性的 lazy=false
2、在关闭session之前,使用Hibernate.initialize(Object proxy)强制加载
3、在关闭session之前,对延迟属性进行一次get访问
4、使用hql预加载,一般会用到fetch语句
以面四种方式,如果用在与spring整合后的hibernate中,方式2、方式3可能不太好合,除非你使用模板的execute回调,那么我们在项目中是如何解决的呢?
采用openSessionInView过滤器,该过滤器非常有效,会保证在同一次请求中,打开一个session,在当次请求中,打开不会关闭(具体底
层实现用到了ThreadLocal类,有兴趣的可以到网上搜一下),请求结束后spring会妥善处理好session的。有了
openSessionInView,我们几乎看不到延迟加载错误了,但是,在开发中我们又遇到了另一个严峻的问题,我们在业务层的测试代码中,去无法开
启openSessionInView,这就出现了,在action及页面中都正常的代码,拿到junit测试中却无法通过,这该如何是好?解决办法如
下:
在你的测试类中的setUp和tearDown中,加上下面的代码,注意,要把sessionFactory定义到外面。
private SessionFactory sessionFactory;
public void setUp() throws Exception {
sessionFactory = (SessionFactory) beanFactory.getBean("sessionFactory");
Session s = sessionFactory.openSession();
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(s));
}
public void tearDown() throws Exception {
SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
Session s = holder.getSession();
s.flush();
TransactionSynchronizationManager.unbindResource(sessionFactory);
}
上面的代码是纯junit下的测试,如果你用了AbstractTransactionalSpringContextTests作为测试基类,sessionFactory的初始化就没有这么复杂了,直接由spring注入进来即可。
分享到:
相关推荐
3. Junit 的优点:由于 Junit 相对独立于所编写的代码,可以测试代码的编写可以先于实现代码的编写,XP 中推崇的 test first design 的实现有了现成的手段:用 Junit 写测试代码,写实现代码,运行测试,测试失败,...
本实验“自动饮料机Junit测试”旨在帮助学生深入理解和应用单元测试,特别是在Java编程环境下。单元测试是一种针对程序代码最小可测试单元进行验证的方法,通常这个单元是函数或方法。Junit是Java领域广泛使用的单元...
JUnit 测试框架的使用 JUnit 是一个流行的单元测试框架,广泛应用于 Java 项目中,本文将详细介绍 JUnit 测试框架的使用,并提供了两个示例来帮助读者更好地理解和掌握 JUnit 的使用。 一、JUnit 测试框架的使用 ...
JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可重复运行的测试用例,以确保代码的正确性和稳定性。在这个“junit测试案例程序”中,我们可以找到一些基本的JUnit测试用例示例,这对于初学者来...
1. Spring TestContext Framework:Spring提供的一个测试支持库,它允许我们加载Spring应用上下文,并提供了一套用于测试的工具和API。 2. `@RunWith(SpringRunner.class)`:这是一个JUnit runner,它使得Spring ...
JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可执行的测试用例来验证代码的功能。单元测试是对程序中的最小可测试部分——通常是一个函数或方法——进行检查,确保其按照预期工作。JUnit作为...
JUnit是Java编程语言中最常用的单元测试框架之一,它为开发者提供了编写和运行可重复测试的便利工具。在软件开发过程中,单元测试是非常重要的一环,因为它确保了代码的各个独立部分(即单元)按预期工作,有助于...
Junit作为Java编程语言中最流行的单元测试框架,是每个Java开发者必备的技能之一。本学习文档将深入探讨Junit测试的基本概念、用法以及高级特性。 一、Junit简介 Junit是由Ernst von Brucke和Erich Gamma创建的一个...
本压缩包文件"javaweb中.java文件测试需要的框架(junit测试).rar"显然是为了帮助开发者理解如何在Java Web项目中使用JUnit进行测试。 **JUnit框架详解** JUnit是一个基于注解的测试框架,它的核心功能包括: 1....
JUnit 测试用例 calculate JUnit 测试用例 calculate 是一个简单的用例,旨在帮助掌握 JUnit 方法。该测试用例主要涉及到 JUnit 的基本使用、测试方法的编写、测试结果的分析等方面。 一、JUnit 简介 JUnit 是一...
JUnit作为Java领域最流行的单元测试框架,通常用于测试公共方法。然而,有时我们可能需要测试私有(private)方法,因为它们可能包含关键逻辑,尽管直接调用它们并不符合面向对象设计的原则。本篇文章将详细介绍如何...
JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可执行的测试用例来验证代码的功能。在本文中,我们将深入探讨JUnit的核心概念、关键特性以及如何使用JUnit3进行测试。 首先,理解单元测试的概念...
JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可重复运行的测试用例,以确保代码的功能正确性。这个"JUnit测试jar包.zip"文件很可能包含了JUnit库的jar文件,使得开发者能够在自己的项目中引入...
JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可重复运行的测试用例,以确保代码的功能正确性。在软件开发过程中,单元测试是至关重要的,因为它们可以帮助发现早期错误,提高代码质量,并简化...
总的来说,JUnit是Java开发者必备的工具之一,它简化了单元测试的编写和执行,使得软件的质量控制变得更加系统化和高效。通过深入理解和熟练运用JUnit,开发者可以更自信地重构代码,优化性能,并确保软件的健壮性。
Spring Junit单元测试加载配置文件失败问题解决方法 在软件开发过程中,单元测试是一个非常重要的步骤,它可以帮助开发者检测代码中的错误、提高代码的可靠性和稳定性。Spring Junit是一个常用的单元测试框架,它...
junit3 junit4 api,单元测试的利器