延迟抓取出的错,hb3对many-to-one的默认处理是lazy ="proxy",把所有many-to-one,one-to-one都加上lazy="false"...今天遇到了这样一个问题
Struts Problem Report
Struts has detected an unhandled exception:
Messages:
- failed to lazily initialize a collection of role: feng.domain.Department.users, no session or session was closed
File: org/hibernate/collection/AbstractPersistentCollection.java Line number: 383 Stacktraces
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: feng.domain.Department.users, no session or session was closedorg.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:122) org.hibernate.collection.PersistentSet.size(PersistentSet.java:162) "org.hibernate.LazyInitializationException: could not initializeproxy"
在网上找了好久终于找到了一个较全的解决方法。具体如下:
"org.hibernate.LazyInitializationException: could not initializeproxy"延迟抓取出的错,hb3对many-to-one的默认处理是lazy ="proxy",把所有many-to-one,one-to-one都加上lazy="false"...
这个方法理论上没错,但是会让人产生误解,使人以为只是修改<set>中的lazy值,照做后依然会报错,看看下面的文章也许就明白了(注意最后一行红色标记)!
lazy initialization
集合(不包括数组)是可以延迟初始化的,意思是仅仅当应用程序需要访问时,才载入他们的值。
- <span style="font-family: monospace;">s = sessions.openSession();
- User u = (User) s.find("from User u where u.name=?", userName,
- Hibernate.STRING).get(0);
- Map permissions = u.getPermissions();
- s.connection().commit();
- s.close();
- Integer accessLevel = (Integer) permissions.get("accounts"); //Error!</span>
因为在commit之前,permissions没有被用到,permission没有被初始化,而session被close了,导致permissions永远都无法load data.
解决办法:吧最后一行一道session被提交之前.
设置:
- <span style="font-family: monospace;"><set name="names" table="NAMES" lazy="true" order-by="name asc">
- <span style="white-space: pre;"> </span><key column="group_id"/>
- <span style="white-space: pre;"> </span><element column="NAME" type="string"/>
- </set></span>
==================================
在做Spring1.2 + Hibernate 3 + struts demo时候遇到一个问题,编辑用户数据时候
用com.jeedev.service.dao.hibernate.UserHibernateDao 中 public TSysuser getUser(int userid) { } 方法,总是不能正常显示编辑数据。具体表现为:
参考 com.jeedev.service.dao.hibernate.UserHibernateDao 第32-45行
java代码
- <span style="font-family: monospace;">public TSysuser getUser(int userid) {
- if (this.getHibernateTemplate() == null) {
- System.out.println("error at there");
- return null;
- }
- TSysuser edituser= (TSysuser) getHibernateTemplate().load(TSysuser.class, new Integer(userid));
- System.out.println(edituser.getUsername());
- System.out.println(edituser.getDeptno());
- return edituser;
- }</span>
如果删除上面的java代码:
- <span style="font-family: monospace;">System.out.println(edituser.getUsername());
- System.out.println(edituser.getDeptno());</span>
在点击编号,修改时候就会出现错误:
[org.hibernate.LazyInitializationException] - could not initialize proxy - the owning Session was closed
- org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
经过在javaeye论坛大家一致认为 是hibernate lazy的原因
在WEB级别应用时候,会出现意想不到的lazy错误,解决方法就是 设置 lazy="false" 例:
<hibernate-mapping>
- <class name="com.jeedev.hb.TSysuser" table="t_sysuser" lazy="false">
还有一种解决方法
2、对于查询中如果用的是xxx.load(class,id)则改为xxx,get(class,id)。在web.xml文件中加入
- <filter>
- <filter-name>hibernateFilter</filter-name>
- <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
- <init-param>
- <param-name>singleSession</param-name>
- <param-value>false</param-value>
- </init-param>
- <!-- 这个-- <init-param>一定要加不然很可能会报 错:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
- >
- </filter>
- <filter-mapping>
- <filter-name>hibernateFilter</filter-name>
- <url-pattern>*.mmg</url-pattern>
- </filter-mapping>
关于在配置pojo类中的懒加载的异常分析
最新推荐文章于 2021-12-31 11:01:13 发布