Hibernate将@OneToMany映射列保存为空值



我正在学习Hibernate关系,有两个类:

@Entity
@Table(name = "students")
public class Student {
@Id
private int sid;
@OneToMany(mappedBy = "student")
private List<Laptop> laptops = new ArrayList<>();
//getters and setters
}

@Entity
@Table(name = "laptops")
public class Laptop {
@Id
private int lid;
private String lName;
@ManyToOne
private Student student;
//getters and setters
}

我创建了Student对象,添加了两个Laptop对象并这样保存:

Laptop lap1 = new Laptop();
lap1.setLid(101);
lap1.setlName("Dell");
Laptop lap2 = new Laptop();
lap2.setLid(102);
lap2.setlName("HP");
Student stud1 = new Student();
stud1.setName("Mark");
stud1.setSid(1);
stud1.getLaptops().add(lap1);
stud1.getLaptops().add(lap2);
Transaction transaction = session.beginTransaction();
session.save(lap1);
session.save(lap2);
session.save(stud1);
transaction.commit();

然而,当我在之后执行SELECT * FROM laptops时,我看到student_sid列引用了students表中的sid,但它包含NULL值。我做错了什么?

顺便说一句,我可以使用session.get获取学生对象,其中包含笔记本电脑(我怀疑它是Hibernate缓存(。

您负责维护实体之间的关系。这里最有可能的解释是,你永远不会在学生和笔记本电脑之间建立正确的关系。考虑这个版本:

// first setup laptops for the student
Student stud1 = new Student();
Laptop lap1 = new Laptop();
Laptop lap2 = new Laptop();
List<Laptop> laptops = new ArrayList<>();
laptops.add(lap1);
laptops.add(lap2);
stud1.setLaptops(laptops);
// now set the reverse relationships
lap1.setStudent(stud1);
lap2.setStudent(stud1);

为了避免重复的代码,您可以向管理这种关系记账的两个实体类添加方法。

据我所见,您可能缺少@ManyToOne下的@JoinColumn注释。

你的笔记本电脑类应该看起来像:

@Entity
@Table(name = "laptops")
public class Laptop {
@Id
private int lid;
private String lName;
@ManyToOne
@JoinColumn("student_id")
private Student student;
}

和学生:

@Entity
@Table(name = "students")
public class Student {
@Id
@Column(name = "student_id")
private int sid;
@OneToMany(mappedBy = "student")
private List<Laptop> laptops = new ArrayList<>();
}

不要忘记注意关系中的获取类型(急切/懒惰(和级联类型;此外,在保存学生之前,您应该设置笔记本电脑的列表。

最新更新