未能延迟初始化角色集合: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,或者你想拥有一个包含每个StudentPhones 的连接表。

【讨论】:

这段代码不起作用... getHibernateTemplate().execute(new HibernateCallback() 编译错误。 Tnx。你重播..期待解决方案。 您是否尝试过使用 @Transactional 注释 DAO 或方法?你的 applicationContext.xml 中有 transactionManager 吗?

以上是关于未能延迟初始化角色集合:com.pojo.Student.phonenos,没有会话或会话已关闭的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate org.hibernate.LazyInitializationException:未能延迟初始化角色集合:

未能延迟初始化角色集合:无法初始化代理 - Hibernate 中的 @ManyToMany 映射注释中没有会话错误? [复制]

未能延迟初始化角色集合:com.pojo.Student.phonenos,没有会话或会话已关闭

延迟初始化:未能延迟初始化集合

无法写入内容:无法延迟初始化角色集合,无法初始化代理 - 无会话

NHibernate - 延迟初始化角色集合失败