首页 文章

org.hibernate.LazyInitializationException:无法初始化proxy -no Session

提问于
浏览
2

当我为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但是这个链接不符合我的要求,因为它需要创建事务的目标对象 .

3 回答

  • 2
    @Test
    @Transactional
    public void myTestMethod ()
    {
           assertTrue("Response Validating",validate(baseEntity,perform()));
    }
    
  • 0

    使用 @Transactional 注释 myTestMethod (假设您正在使用基于注释的配置) .

  • 4

    我得到了解决这个问题的方法 . 我在我的测试代码中实现了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) 这是错误的 .

    顺便说一句谢谢

相关问题