一个老问题:could not initialize a collection: XXX

victorn 2008-03-23 11:53:07
org.apache.jasper.JasperException: could not initialize a collection: [com.coolgo.domain.model.Topic.posts#1]
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
com.coolgo.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:91)

一张board表,一张topic表,一张post表
board表 与 topic表 为双向一对多关系
topic表 与 post表 为双向一对多关系

Board.hbm.xml

<hibernate-mapping>
<class name="com.coolgo.domain.model.Board" table="board" catalog="coolgo">
<id name="boardId" type="java.lang.Integer">
<column name="board_id" />
<generator class="identity" />
</id>
<property name="boardIsMother" type="java.lang.String">
<column name="board_isMother" length="6" />
</property>
<property name="boardBid" type="java.lang.Integer">
<column name="board_bid" />
</property>
<property name="boardName" type="java.lang.String">
<column name="board_name" length="300" />
</property>
........
<set
name="topics"
cascade="all"
inverse="true"
lazy="false" >
<key column="topic_boardid"/>
<one-to-many class="com.coolgo.domain.model.Topic"/>
</set>
</class>
</hibernate-mapping>


Topic.hbm.xml

<hibernate-mapping>
<class name="com.coolgo.domain.model.Topic" table="topic" catalog="coolgo">
<id name="topicId" type="java.lang.Integer">
<column name="topic_id" />
<generator class="identity" />
</id>
<property name="topicUser" type="java.lang.String">
<column name="topic_user" length="300" />
</property>
<property name="topicName" type="java.lang.String">
<column name="topic_name" length="300" />
</property>
.....
<many-to-one name="board"
column="topic_boardid"
class="com.coolgo.domain.model.Board"
lazy="false"
not-null="true"></many-to-one>
<set
name="posts"
cascade="all"
inverse="true"
lazy="false">
<key column="post_topicid"/>
<one-to-many class="com.coolgo.domain.model.Post"/>
</set>
</class>
</hibernate-mapping>


Post.hbm.xml

<hibernate-mapping>
<class name="com.coolgo.domain.model.Post" table="post" catalog="coolgo">
<id name="postId" type="java.lang.Integer">
<column name="post_id" />
<generator class="identity" />
</id>
<property name="postBoardid" type="java.lang.Integer">
<column name="post_boardid" />
</property>
<property name="postUser" type="java.lang.String">
<column name="post_user" length="300" />
</property>
.........

<many-to-one name="topic"
column="post_topicid"
class="com.coolgo.domain.model.Topic"
lazy="false"
not-null="true"></many-to-one>
</class>
</hibernate-mapping>


Board.java

public class Board implements java.io.Serializable {
private Integer boardId;
private Integer boardBid = 0;
private String boardName;
private String boardInfo;
private Set topics = new HashSet();
....

public Set getTopics() {
return topics;
}

public void setTopics(Set topics) {
this.topics = topics;
}
....
}


Topic.java
public class Topic implements java.io.Serializable {
private Integer topicId;
// private Integer topicBoardid;
private String topicUser;
private String topicName;
....
private Board board;
private Set posts = new HashSet();

public Board getBoard() {
return board;
}
public void setBoard(Board board) {
this.board = board;
}
public Set getPosts() {
return posts;
}
public void setPosts(Set posts) {
this.posts = posts;
}
....
}


Post.java
public class Post implements java.io.Serializable {
private Integer postId;
private Integer postBoardid;
private String postUser;
private Topic topic;
......
public Topic getTopic() {
return topic;
}

public void setTopic(Topic topic) {
this.topic = topic;
}
}


注意在 Topic.hbm.xml 中红色代码,没有添加时,测试一切正常.然而添加后,java测试正常,而web测试却出现了:

could not initialize a collection: [com.coolgo.domain.model.Topic.posts#1] 这样的错误.

又当红色代码中 lazy="false" 改为 lazy="true" 时,web测试正常,而java测试出现:
Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.coolgo.domain.model.Topic.posts, no session or session was closed
.....

为什么呢?(测试均为查找测试)
...全文
534 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
thblx 2009-06-21
  • 打赏
  • 举报
回复
大哥,你这个问题解决没有啊?我的怎么也找不到原因啊
victorn 2008-03-24
  • 打赏
  • 举报
回复
package com.coolgo.domain.dao;

import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.criterion.Example;

import com.coolgo.domain.model.Post;

/**
* A data access object (DAO) providing persistence and search support for Post
* entities. Transaction control of the save(), update() and delete() operations
* can directly support Spring container-managed transactions or they can be
* augmented to handle user-managed Spring transactions. Each of these methods
* provides additional information for how to configure it for the desired type
* of transaction control.
*
* @see com.coolgo.domain.model.Post
* @author MyEclipse Persistence Tools
*/

public class PostDAO extends BaseHibernateDAO {
private static final Log log = LogFactory.getLog(PostDAO.class);
// property constants
public static final String POST_BOARDID = "postBoardid";
public static final String POST_USER = "postUser";
public static final String POST_TOPICID = "postTopicid";
public static final String POST_REPLYID = "postReplyid";
public static final String POST_CONTENT = "postContent";
public static final String POST_IP = "postIp";

public void save(Post transientInstance) {
log.debug("saving Post instance");
try {
getSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}

public void delete(Post persistentInstance) {
log.debug("deleting Post instance");
try {
getSession().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}

public Post findById(java.lang.Integer id) {
log.debug("getting Post instance with id: " + id);
try {
Post instance = (Post) getSession().get(
"com.coolgo.domain.model.Post", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}

public List findByExample(Post instance) {
log.debug("finding Post instance by example");
try {
List results = getSession().createCriteria(
"com.coolgo.domain.model.Post").add(Example.create(instance))
.list();
log.debug("find by example successful, result size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}

public List findByProperty(String propertyName, Object value) {
log.debug("finding Post instance with property: " + propertyName
+ ", value: " + value);
try {
String queryString = "from Post as model where model."
+ propertyName + "= ?";
Query queryObject = getSession().createQuery(queryString);
queryObject.setParameter(0, value);
return queryObject.list();
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}
}

public List findByPostBoardid(Object postBoardid) {
return findByProperty(POST_BOARDID, postBoardid);
}

public List findByPostUser(Object postUser) {
return findByProperty(POST_USER, postUser);
}

public List findByPostTopicid(Object postTopicid) {
return findByProperty(POST_TOPICID, postTopicid);
}

public List findByPostReplyid(Object postReplyid) {
return findByProperty(POST_REPLYID, postReplyid);
}

public List findByPostContent(Object postContent) {
return findByProperty(POST_CONTENT, postContent);
}

public List findByPostIp(Object postIp) {
return findByProperty(POST_IP, postIp);
}

public List findAll() {
log.debug("finding all Post instances");
try {
String queryString = "from Post";
Query queryObject = getSession().createQuery(queryString);
return queryObject.list();
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}

public Post merge(Post detachedInstance) {
log.debug("merging Post instance");
try {
Post result = (Post) getSession().merge(detachedInstance);
log.debug("merge successful");
return result;
} catch (RuntimeException re) {
log.error("merge failed", re);
throw re;
}
}

public void attachDirty(Post instance) {
log.debug("attaching dirty Post instance");
try {
getSession().saveOrUpdate(instance);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}

public void attachClean(Post instance) {
log.debug("attaching clean Post instance");
try {
getSession().lock(instance, LockMode.NONE);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
}

是这个吗?
临远 2008-03-23
  • 打赏
  • 举报
回复
LazyInitializationException:

懒惰加载错误,用OpenSessioninView呗
mysoko 2008-03-23
  • 打赏
  • 举报
回复
把你hibernate代码贴出来。

victorn 2008-03-23
  • 打赏
  • 举报
回复
噢,试试1楼的.
2楼的我也要试试,不过觉得应该不会啊,我在Board.java中也设置了 private Set topics = new HashSet();但不会出错,
照理应 private Set posts = new HashSet(); 该不会错啊. 试试看.
开跑车的猪 2008-03-23
  • 打赏
  • 举报
回复
我觉得好象是你的那个private Set posts = new HashSet();这句话有问题吧,你把这个set集合给改一下看看

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧