gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:21:50 26 4
gpt4 key购买 nike

我正在学习使用注释的 hibernate 映射。我已经完成了一节。 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;
}

我的 dao 类

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)

如果您确实希望每次检索这些类的任何实体时都执行此操作,请指定 FetchMode.EAGER@OneToMany 关联中。 @ManyToOne 默认情况下是 eager。请注意,如果您只需要在特定情况下获取这些实体,这可能会效率很低。如果是这种情况,您必须像现在一样进行操作,但要确保检索 Student 对象的 session 仍然处于打开状态。看到您正在使用 Spring,您是否尝试过使用 @Transactional 注释您的 DAO/Service,以便 session 在方法执行期间保持事件状态?或者您是否尝试过使用 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 表中有一个 FK,并引用该电话所属的 Student,或者您希望在 Phones 中有一个联接表 每个学生

关于hibernate - 未能延迟初始化角色 : com. pojo.Student.phonenos 的集合,没有 session 或 session 已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7832433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com