首页 > Hibernate, Java, Spring, Struts2 > Hibernate3.3.2+Spring2.5.6+Struts2.1.6整合异常解决——不断更新

Hibernate3.3.2+Spring2.5.6+Struts2.1.6整合异常解决——不断更新

1、org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ’sessionFactory’ is defined

异常说明:sessionFactory bean未定义

异常原因:applicationContext.xml配置文件中使用其他名字sessionFactory

<property name="sessionFactory">
    <ref bean="dmccSessionFactory"/>
</property>

上面的代码中bean=”dmccSessionFactory”,这是造成异常的原因。这里用了别名,而不是默认的bean=”sessionFactory”。这种情况下在web.xml文件中配置OpenSessionInViewFilter则需要对使用的别名进行声明。

<filter>
    <description>处理Hibernate的懒加载问题</description>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <description>默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里 指定这个名字。</description>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>dmccSessionFactory</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2、

ERROR – failed to lazily initialize a collection of role: leeo.pojo.TPermission.roles, no session or session was closed

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: leeo.pojo.TPermission.roles, no session or session was closed

异常说明:session已关闭,无法初始化懒加载数据集role

异常原因:Hibernate映射文件中配置了lazy="true",同时也启用了OpenSessionInViewFilter。当实现ajax检测role名称是否可用时报以上异常,我这里检测role名称是利用json格式返回数据的。json返回数据的特点是:如果action中的属性有get()方法并且该属性没有transient修饰,那么json就会将其返回。在我的TRoleAction中有private TRole role;并且role有get()方法,所以在检测名称是否可用后返回的json数据中会将这一属性返回,但是检测名称的可用性根本不需要用到这个属性,异常就是由于启用懒加载机制下json中返回role这个属性需要查询数据库,而这时session已经关闭,因此报异常。

解决方法:用transient对role属性进行修饰,即:private transient TRole role;这样json就不会将其返回,因为也不用再次查询关联数据不会出现session已关闭的异常。

  1. Vincent
    2010年6月17日14:42 | #1

    十分感谢,把我搞了几天的问题解决了 :zanyang: :zanyang: :zanyang:

  2. 2010年1月5日14:25 | #2

    @阿超
    由于代码中带了标签,所以页面上看不到代码了,如需看源代码请查看页面源码,然后搜索“ excludeProperties”关键字。。。 :jianxiao:

  3. 2010年1月5日14:21 | #3

    @阿超
    不需要返回的属性可以通过在属性变量的类型名称前加上transient关键字进行排除,例如:private transient int page;//当前请求页码(PS:该属性有get、set方法),但这种方式在jsonplugin.jar包中使用是起作用了,但是如果json插件包用的是struts2的2.1.8.1版本自带的struts2-json-plugin-2.1.8.1.jar却不起作用,原因不清楚。但是最好的方法还是在struts.xml文件的action配置中对不需要返回的属性值进行排除,例如:

    .*hibernateLazyInitializer,id,name,businessTypeName,locked,oper
    其中excludeProperties就表示要排除掉的变量名称,这样做的好处就是方便针对不同的action请求返回不同的数据量。。。 :daxiao:

  4. 2010年1月5日14:20 | #4

    博主写的不错,受益匪浅,学习了

  5. 2010年1月5日14:04 | #5

    我刚刚遇见了这个问题,感觉很怪异在Action 方法的return success 的时候报错 说是session close
    看见你说的 我把user对象的get set方法删了 问题解决 看来get set方法不能乱写哦 用的着的写 不用的就不写 :zanyang:

  1. 本文目前尚无任何 trackbacks 和 pingbacks.

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。