Hibernate 多对一映射设置外键为空
Hibernate many-to-one mapping sets foreign key null
学生有多台笔记本电脑。学生 oneToMany 笔记本电脑映射
Student.java
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Student {
@Id
private int id;
private StudentName studentName;
private String email;
@OneToMany(mappedBy = "student")
private List<Laptop> laptops = new ArrayList<Laptop>();
public Student() {
}
public Student(int id, StudentName studentName, String email) {
this.id = id;
this.studentName = studentName;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public StudentName getStudentName() {
return studentName;
}
public void setStudentName(StudentName studentName) {
this.studentName = studentName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public List<Laptop> getLaptop() {
return laptops;
}
public void setLaptop(List<Laptop> laptops) {
this.laptops = laptops;
}
@Override
public String toString() {
return "Student [id=" + id + ", studentName=" + studentName + ", email=" + email + "]";
}
}
Laptop.java
package com.practice.hibernateDemo.enity;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Laptop {
@Id
private int lid;
private String lName;
@ManyToOne
@JoinColumn(name="student_id", referencedColumnName="id")
private Student student;
public Laptop() {
}
public int getLid() {
return lid;
}
public void setLid(int lid) {
this.lid = lid;
}
public String getlName() {
return lName;
}
public void setlName(String lName) {
this.lName = lName;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "Laptop [id=" + lid + ", lName=" + lName + "]";
}
}
主要class
package com.practice.hibernateDemo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.practice.hibernateDemo.enity.Laptop;
import com.practice.hibernateDemo.enity.Student;
import com.practice.hibernateDemo.enity.StudentName;
public class CreateStudent {
public static void main(String[] args) {
Laptop laptop = new Laptop();
laptop.setLid(100);
laptop.setlName("HP");
Student student = new Student();
student.setId(101);
student.setEmail("test@gmail.com");
student.setStudentName(new StudentName("test1","test2", "test3"));
student.getLaptop().add(laptop);
Configuration con = new Configuration().configure().addAnnotatedClass(Student.class).addAnnotatedClass(Laptop.class);
SessionFactory sf = con.buildSessionFactory();
Session session = sf.getCurrentSession();
Transaction tx = session.beginTransaction();
session.save(laptop);
session.save(student);
tx.commit();
}
}
保存对象后,笔记本电脑 table 中的外键设置为 null
lid lName student_id
100 HP 无效
任何人都知道我在哪里做错了映射,因为我得到的外键为 null
提前致谢
1:many 关系的“多”方始终是拥有方。如果关系是双向的,那么另一方将携带一个 mappedBy
属性,就像双向 1:1 关系的非拥有方一样。将关系传递给持久层有意义的是拥有方的关系字段,而你设置失败。
例如,
laptop.setStudent(student);
学生有多台笔记本电脑。学生 oneToMany 笔记本电脑映射
Student.java
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Student {
@Id
private int id;
private StudentName studentName;
private String email;
@OneToMany(mappedBy = "student")
private List<Laptop> laptops = new ArrayList<Laptop>();
public Student() {
}
public Student(int id, StudentName studentName, String email) {
this.id = id;
this.studentName = studentName;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public StudentName getStudentName() {
return studentName;
}
public void setStudentName(StudentName studentName) {
this.studentName = studentName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public List<Laptop> getLaptop() {
return laptops;
}
public void setLaptop(List<Laptop> laptops) {
this.laptops = laptops;
}
@Override
public String toString() {
return "Student [id=" + id + ", studentName=" + studentName + ", email=" + email + "]";
}
}
Laptop.java
package com.practice.hibernateDemo.enity;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Laptop {
@Id
private int lid;
private String lName;
@ManyToOne
@JoinColumn(name="student_id", referencedColumnName="id")
private Student student;
public Laptop() {
}
public int getLid() {
return lid;
}
public void setLid(int lid) {
this.lid = lid;
}
public String getlName() {
return lName;
}
public void setlName(String lName) {
this.lName = lName;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "Laptop [id=" + lid + ", lName=" + lName + "]";
}
}
主要class
package com.practice.hibernateDemo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.practice.hibernateDemo.enity.Laptop;
import com.practice.hibernateDemo.enity.Student;
import com.practice.hibernateDemo.enity.StudentName;
public class CreateStudent {
public static void main(String[] args) {
Laptop laptop = new Laptop();
laptop.setLid(100);
laptop.setlName("HP");
Student student = new Student();
student.setId(101);
student.setEmail("test@gmail.com");
student.setStudentName(new StudentName("test1","test2", "test3"));
student.getLaptop().add(laptop);
Configuration con = new Configuration().configure().addAnnotatedClass(Student.class).addAnnotatedClass(Laptop.class);
SessionFactory sf = con.buildSessionFactory();
Session session = sf.getCurrentSession();
Transaction tx = session.beginTransaction();
session.save(laptop);
session.save(student);
tx.commit();
}
}
保存对象后,笔记本电脑 table 中的外键设置为 null
lid lName student_id 100 HP 无效
任何人都知道我在哪里做错了映射,因为我得到的外键为 null
提前致谢
1:many 关系的“多”方始终是拥有方。如果关系是双向的,那么另一方将携带一个 mappedBy
属性,就像双向 1:1 关系的非拥有方一样。将关系传递给持久层有意义的是拥有方的关系字段,而你设置失败。
例如,
laptop.setStudent(student);