![](/img/trans.png)
[英]Hibernate issue: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
[英]org.hibernate.LazyInitializationException: could not initialize proxy -no Session
当我为spring应用程序运行测试用例(Junit)时,我收到了这个bug。
我搜索了这个问题,我得到的信息是,每当发生延迟初始化并且我的应用程序在会话关闭时尝试获取第二级数据(对象变得分离)然后发生此错误,我们就无法像其性能那样将EAGER初始化问题。
我的测试类包含:
@RunWith(SpringJUnit4ClassRunner.class)
public class MyTestClass extends AbstractControllerTest {
@Rule
public TestName testMethodName = new TestName();
@Before
public void setUp() throws Exception
{
super.setUp();
}
@After
public void tearDown() throws Exception
{
super.tearDown();
}
@Test
public void myTestMethod ()
{
assertTrue("Response Validating",validate(baseEntity,perform()));
}
}
有没有办法可以把方法assertTrue(“Response Validating”,validate(baseEntity,perform())); 在事务中可以绑定当前会话或新会话,以便我的分离对象成为持久对象,然后我的应用程序也可以获得二级数据。 我搜索了这个问题,我在链接上找到了一个解决方案: http : //www.jroller.com/RickHigh/entry/hibernate_spring_simulating_an_opensessioninviewfilter但是这个链接不符合我的要求,因为它需要创建事务的目标对象。
使用@Transactional
注释myTestMethod
(假设您正在使用基于注释的配置)。
@Test
@Transactional
public void myTestMethod ()
{
assertTrue("Response Validating",validate(baseEntity,perform()));
}
我得到了解决这个问题的方法。 我在我的测试代码中实现了OpenSessionInViewFilter来克服这个问题但却犯了愚蠢的错误。
请看下面的代码:
@Autowired
BeanFactory bf;
@Before
public void setUp() throws Exception
{
sessionFactory = (SessionFactory) bf.getBean("sessionFactory");
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.setFlushMode(FlushMode.NEVER);
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
}
@After
public void tearDown() throws Exception
{
super.tearDown();
SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
Session session = sessionHolder.getSession();
SessionFactoryUtils.closeSession(session);
}
早些时候我没有使用session.setFlushMode(FlushMode.NEVER)
这是错误的。
顺便说一句谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.