小弟最近参与了一个邮件系统的开发,在MyEclipse 6.6 Jboss 4.2.2环境下,在后台用的是EJB3.0,有三个实体bean:Admin,Group,Linkman.admin和group是一对多,admin和linkman是一对多,group和linkman也是一对多,现在我根据admin加载group可以,但admin加载linkman不行,就会报以下错误:failed to lazily initialize a collection of role: com.spg.bean.Admin.cat, no session or session was closed!还望各位多多帮忙。
下面是admin的代码:
package com.spg.bean;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;import org.hibernate.annotations.IndexColumn;@Entity
public class Admin implements Serializable { private static final long serialVersionUID = 7226663383506361021L;
private String name;/**系统用户姓名*/
private String password;/**系统用户密码*/
private Integer admin_id;/**系统用户ID*/
private String qq;/**系统用户QQ*/
private String address;/**系统用户详细地址*/ private String city;/**系统用户所在城市*/
private String country;/**系统用户所在国家*/
private String nickName;/**系统用户所在国家*/ private List<Group> groups = new ArrayList<Group>();
private List<Contactname> cat = new ArrayList<Contactname>(); @Column(nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(nullable = false)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
} public String getQq() {
return qq;
} public void setQq(String qq) {
this.qq = qq;
}
@Column(nullable = false)
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Id
@GeneratedValue
public Integer getAdmin_id() {
return admin_id;
} public void setAdmin_id(Integer admin_id) {
this.admin_id = admin_id;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
@OneToMany(mappedBy = "admin", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@OrderBy(value = "group_id asc")
public List<Group> getGroups() {
return groups;
} public void setGroups(List<Group> groups) {
this.groups = groups;
}
@Override
public int hashCode() {
int hash = 0;
hash += (this.admin_id != null ? this.admin_id.hashCode() : 0);
return hash;
} /**
 * 确定其他对象是否等于此 Admin ,当且仅当 参数不为 null 且该参数是具有与此对象相同 id 字段值的 Admin 对象时, 结果才为
 * <code>true</code>。
 * 
 * @param 对象,要比较的引用对象
 *            如果此对象与参数相同,则
 * @return <code>true</code>; 否则为 <code>false</code>。
 */
@Override
public boolean equals(Object object) {
if (!(object instanceof Admin)) {
return false;
}
Admin other = (Admin) object;
if (this.admin_id != other.admin_id
&& (this.admin_id == null || !this.admin_id
.equals(other.admin_id)))
return false;
else if (this.name != null && this.password != null)
return true;
else
return false;
} /**
 * 返回对象的字符串表示法。该实现根据 id 字段 构造此表示法。
 * 
 * @return 对象的字符串表示法。
 */
@Override
public String toString() {
return this.getClass().getName() + "[id=" + admin_id + "]";
}
 
@OneToMany(mappedBy = "admin", cascade = CascadeType.ALL,fetch=FetchType.EAGER)
@OrderBy(value = "id asc")
public List<Contactname> getCat() {
return cat;
} public void setCat(List<Contactname> cat) {
this.cat = cat;
}}

解决方案 »

  1.   

    通常是因为你lazy设置为true了!
      

  2.   

    no session or session was closed一般是在事务的外面使用了一些lazy的东西,此时事务已经停止,不能再进行数据库的操作了。
    解决方法有2个
    1 取消那个lazy,让其eager
    2 将事务范围放大,据说有个open Session in view , 让事务贯穿整个执行过程。如果数据量不大,建议用第一种。
      

  3.   

    Lazy为true
    session关闭后调用延迟加载属性.在session关闭之前如果调用该属性,会加载.
    或者是使用Hibernate.Initalize(); 
      

  4.   

    在JBOSS 中怎么设置lazily=false啊!