junit org.hibernate.LazyInitializationException:无法初始化代理-没有会话

mum43rcc  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(185)

当我运行spring应用程序的测试用例(Junit)时,我得到了这个异常。
我搜索了这个问题,我得到的信息是,每当一个懒惰的初始化发生,我的应用程序试图获得第二级数据,而会话被关闭(对象成为分离),然后这个错误发生,我们不能使初始化作为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但是这个链接不满足我的要求,因为它需要在其上创建事务的目标对象。

kyks70gy

kyks70gy1#

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

字符串

2wnc66cl

2wnc66cl2#

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

3wabscal

3wabscal3#

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

ycggw6v2

ycggw6v24#

我也得到了这个错误,因为在实体中使用了(fetch = FetchType.LAZY)
Lazy意味着对象不会被加载到Session上下文中,直到它在代码中被访问。
当我们尝试使用代理对象从数据库中获取延迟加载的对象时,会发生此错误。
然后我就用了(fetch = FetchType.EAGER),然后这个问题就解决了。

相关问题