我正在學習 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中參考sid的students列,但它包含 NULL 值。我做錯了什么?
順便說一下,我可以使用session.get它來獲取學生物件,并且它包含筆記本電腦(我懷疑它是 Hibernate 快取)。
uj5u.com熱心網友回復:
您負責維護物體之間的關系。這里最可能的解釋是,您從未在學生與其筆記本電腦之間建立適當的關系。考慮這個版本:
// 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);
為避免重復代碼,您可以向管理此關系簿記的兩個物體類添加方法。
uj5u.com熱心網友回復:
從我所看到的你可能會錯過@JoinColumn下的注釋@ManyToOne。
您的筆記本電腦類應如下所示:
@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<>();
}
不要忘記注意關系中的 fetch 型別(eager/lazy)和級聯型別;同樣在保存學生之前,您應該設定筆記本電腦串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/351324.html
上一篇:休眠。人沒有被映射
