在JUnit / JPA / Hibernate / Struts和Spring集成测试中保持会话打开-没有会话或会话关闭-LazyInitialization异常

凯文·拉夫(Kevin Rave)

我的应用程序使用Struts2(mvc),Spring(依赖注入),带有Hibernate的JPA,JUnit以及struts2-junit插件和struts2 spring插件。

这是我的测试课:

@RunWith(SpringJUnit4ClassRunner.class)
public class CustomerSearchIntegrationTest extends StrutsSpringTestCase {

    @Test
    @Transactional
    public void testGetActionProxy() throws Exception {

        ActionProxy proxy;
        String result;

        ActionMapping mapping = getActionMapping("userInfo");
        assertNotNull(mapping);

        ..... // Some JUnit init code..

        ActionProxy proxy = getActionProxy("userInfo");
        UserInfo user = (UserInfo) proxy.getAction();
        result = proxy.execute();

        assertEquals("details", result);
        System.out.prinltn("Username:" + user.getFirstName());

    }
}

GetUserInfo

public class UserInfo extends ActionSupport {
     User user; // Entity
     UDetails details; // Entity

     public String getUserDetails() { //Action method
       user = userMgmt.getUser(usrId);
       if (user != null ) {
            for(UDetails det : user.getUDetails()) { // user.getUDetails() there is where exception gets thrown.
                if(det.getStreet().equals(street)){
                    details = det;
                    break;
                }
            }
       }
       ...
       ...
    }
}

用户和UDetails是实体。UDetalis随身ManyToMany携带User并且懒洋洋地拿来。所有实体都带有注释。

用户管理

public class UserMgmt {
    public User getUser(String userId) {
        return userDao.getUser(userId);
    }
}

用户DAO

public class UserDAO extends AbstractJPAImpl{

    public User getUser(String userId) {
        User user = (User) getSession().get(User.class, userId);
        return user;
    }
}

摘要

@Transactional
public abstract class AbstractJPAImpl {

    private EntityManager em;

    @PersistenceContext
    protected void setEntityManager(EntityManager em) {
        this.em = em;
    }

    @Transactional
    protected Session getSession() {
        return (Session) em.getDelegate();
    }

    ....
}

jpaContext.xml

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  // other config stuff
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

所有配置/上下文文件都可以正常加载。Struts.xml,jpacontext.xml,beans.xml等均已加载。

但我有一个例外:

failed to lazily initialize a collection of role: com.my.data.User.udetails, no session or session was closed

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: 

在以下行:

 for(UDetails det : user.getUDetails())

显然,它试图UDetails延迟加载,然后抛出异常。但是,在部署到AppServer(WebSphere)中时,此应用程序可以正常工作。

我可能做错了什么?如何保持会话开放?

更新:更多信息

我正在使用OpenEntityManagerInViewFilter我的web.xml如下

<filter>
    <filter-name>OpenEntityManagerInViewFilter</filter-name>
    <filter-class>
        org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>OpenEntityManagerInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

更新:

如果我将参数传递给@PersistenceContext注释,如下所示:

@PersistenceContext(type=PersistenceContextType.EXTENDED)

因此,我想事务即将关闭,但是由于EXTENDED上下文类型,实体可在事务外部操作。但是,我无法像上面那样修改代码并将其永久保留。所以我需要删除它。

所以我想,我有这些选择,但是不确定这些选择是否可行以及如何实现:

  1. 从spring应用程序上下文中获取持久性上下文并传递参数。不知道这是否相关和可能。

  2. 从应用程序上下文中获取会话/实体管理器,并添加另一层事务。这样,会话将在两个事务中运行。一个从我的测试代码开始,另一个在现有代码中,它自动关闭,而我的代码保持打开状态,直到我的测试代码完成执行。

对于第二个,我尝试使用对方法进行注释@Transactional但这没有用。不知道为什么。

有什么帮助吗?

更新

看起来,struts-junit插件不会加载/读取具有的web.xml OpenEntityManagerInViewFilter因此它没有被加载。

是否还有其他解决方法或设置了此过滤器?

凯文·拉夫(Kevin Rave)

如果可以帮助任何人,我将无法使用@Transaction。但是我这样说:

 @PersistenceContext(type=PersistenceContextType.EXTENDED)

现在就可以了!

.....

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档