Java org.hibernate.LazyInitializationException:无法初始化代理-无会话

Java org.hibernate.LazyInitializationException:无法初始化代理-无会话,java,jsp,servlets,junit,Java,Jsp,Servlets,Junit,当我为spring应用程序运行测试用例(Junit)时,我遇到了这个错误 我搜索了这个问题,得到的信息是,每当发生延迟初始化时,当会话关闭(对象分离)时,我的应用程序尝试获取二级数据时,就会发生此错误,我们无法使初始化像其性能问题一样紧迫 我的测试类包含: @RunWith(SpringJUnit4ClassRunner.class) public class MyTestClass extends AbstractControllerTest { @Rule public TestName

当我为spring应用程序运行测试用例(Junit)时,我遇到了这个错误

我搜索了这个问题,得到的信息是,每当发生延迟初始化时,当会话关闭(对象分离)时,我的应用程序尝试获取二级数据时,就会发生此错误,我们无法使初始化像其性能问题一样紧迫

我的测试类包含:

@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(“响应验证”,validate(baseEntity,perform());在事务中,可以与当前会话或新会话绑定,以便分离的对象成为持久对象,然后应用程序也可以获取二级数据。我搜索了这个问题,并在链接上找到了解决方案:
但是这个链接不能满足我的要求,因为它需要在其上创建事务的目标对象。

@Transactional
注释
myTestMethod
(假设您使用的是基于注释的配置)。

我找到了这个问题的解决方案。为了克服这个问题,我在测试代码中实现了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)
这是个错误


顺便说一句,谢谢

如果您有一个解决方案,请将答案标记为已接受。我不能在myTestMethod或类级别上使用@Transactional,因为如果我使用此注释,那么在从服务器Junit获得响应后,它将变得无响应(发生错误)因为如果我在这里使用这个注释,它意味着控制器类所在的上层事务,所以在这种情况下,事务永远不会关闭,我必须重新启动数据库。如果您有任何进一步的回复,我们将不胜感激。我无法理解您的评论。您是说您正在运行冲突事务管理吗?如果像这样的东西可以挂起您的数据库,那么您的数据库在某个地方出现了严重的配置错误,需要与DBA对话。它可以完美地工作!我不能在myTestMethod或类级别上使用@Transactional,因为如果我使用此注释,那么在从服务器Junit获得响应后,它将变得无响应(发生错误)因为如果我在这里使用这个注释,它意味着控制器类所在的上层事务,所以在这种情况下,事务永远不会关闭,我必须重新启动数据库。如有进一步答复,将不胜感激。
@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);

        }