未能延迟初始化角色集合:com.pojo.Student.phonenos,没有会话或会话已关闭
Posted
技术标签:
【中文标题】未能延迟初始化角色集合:com.pojo.Student.phonenos,没有会话或会话已关闭【英文标题】:failed to lazily initialize a collection of role: com.pojo.Student.phonenos, no session or session was closed 【发布时间】:2011-12-11 13:23:36 【问题描述】:我正在学习使用注释的休眠映射。我已经完成了一个部分。 IE。当我保存父表时,我可以自动插入子类。 see_that.
但是我在取主表的时候没有拿到子表。也报错了
failed to lazily initialize a collection of role: com.pojo.one2many.unidirectional.Student.phonenos, no session or session was closed
我的代码被添加到这里来审查你。请通过它。并给我很好的建议。 学生.java。 (父类)
@Entity
@Table(name="STUDENT")
public class Student
private int studentid;
private String studentName;
private Set <Phone> phonenos;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="studenId")
public int getStudentid()
return studentid;
public void setStudentid(int studentid)
this.studentid = studentid;
@Column(name="studenName")
public String getStudentName()
return studentName;
public void setStudentName(String studentName)
this.studentName = studentName;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name="studenId")
public Set<Phone> getPhonenos()
return phonenos;
public void setPhonenos(Set<Phone> phonenos)
this.phonenos = phonenos;
Phone.java(子类)
@Entity
@Table(name = "PHONE")
public class Phone
private int phoneid;
private String phoneNo;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "phoneId")
public int getPhoneid()
return phoneid;
public void setPhoneid(int phoneid)
this.phoneid = phoneid;
@Column(name = "phoneno")
public String getPhoneNo()
return phoneNo;
public void setPhoneNo(String phoneNo)
this.phoneNo = phoneNo;
我的道课
public List<Student> getAllStudent()
List<Student> studentList = null;
try
DetachedCriteria criteria = DetachedCriteria.forClass(Student.class);
studentList = (List<Student>)getHibernateTemplate().findByCriteria(criteria);
if(studentList != null && ! studentList.isEmpty())
for(Student st :studentList)
System.out.println(" st name : "+st.getStudentName());
if(st.getPhonenos() != null && ! st.getPhonenos().isEmpty())
for(Phone ph : st.getPhonenos())
System.out.println(" ph no : "+ ph.getPhoneNo());
else
System.out.println(" phone number is null");
else
System.out.println(" student null");
catch (DataAccessException e)
e.printStackTrace();
return studentList;
输出是
failed to lazily initialize a collection of role: com.pojo.one2many.unidirectional.Student.phonenos, no session or session was closed
这里我使用的是单向(外键)一对多映射(不是联合表,是双向的)。
总结我的问题
1) 获取父表时如何获取子表,反之亦然
2) 什么是急切和懒惰的获取。
3) 在一对多映射的情况下,单向、双向和连接表哪个更强大。
【问题讨论】:
【参考方案1】:1)
如果您真的想在每次检索这些类的任何实体时都执行此操作,请在 @OneToMany
关联中指定 FetchMode.EAGER
。 @ManyToOne
默认情况下是渴望的。请注意,如果您仅在特定情况下需要获取这些实体,这可能会大大降低效率。如果是这种情况,您必须像现在一样执行此操作,但请确保检索到 Student
对象的会话仍处于打开状态。看到您使用的是 Spring,您是否尝试过使用 @Transactional
注释您的 DAO/Service,以便会话在方法执行期间保持活动状态?或者你有没有试过使用Hibernate.execute()
,像这样:
getHibernateTemplate().execute(new HibernateCallback()
@SuppressWarnings("unchecked")
public Object doInHibernate(Session s) throws HibernateException, SQLException
Criteria c = s.createCriteria(Student.class);
List<Student> studentList = c.list();
for(Student st :studentList)
st.getPhoneNos();
);
2) 看看这个问题:Difference between FetchType LAZY and EAGER in Java persistence?。
3) 这取决于你需要什么。如果您只需要以一种方式导航关联,请仅以这种方式将其定义为单向的。如果两个都需要,就两个都做。 Join Table 更多地与数据库设计有关。如果你想在Phone
表中拥有一个引用电话所属的Student
的FK,或者你想拥有一个包含每个Student
的Phones
的连接表。
【讨论】:
这段代码不起作用... getHibernateTemplate().execute(new HibernateCallback() 编译错误。 Tnx。你重播..期待解决方案。 您是否尝试过使用@Transactional
注释 DAO 或方法?你的 applicationContext.xml 中有 transactionManager 吗?以上是关于未能延迟初始化角色集合:com.pojo.Student.phonenos,没有会话或会话已关闭的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate org.hibernate.LazyInitializationException:未能延迟初始化角色集合:
未能延迟初始化角色集合:无法初始化代理 - Hibernate 中的 @ManyToMany 映射注释中没有会话错误? [复制]
未能延迟初始化角色集合:com.pojo.Student.phonenos,没有会话或会话已关闭