Java 未在spring boot中自动保存Id
我正在spring boot中创建一个简单的程序,使用JPA来显示学生和电话号码之间的关系 代码 学生实体Java 未在spring boot中自动保存Id,java,spring,spring-boot,jpa,h2,Java,Spring,Spring Boot,Jpa,H2,我正在spring boot中创建一个简单的程序,使用JPA来显示学生和电话号码之间的关系 代码 学生实体 package student.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.On
package student.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;
String name;
int roll;
@OneToOne
PhoneNumber num;
public Student() {
super();
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public int getRoll() {
return roll;
}
public PhoneNumber getNum() {
return num;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setRoll(int roll) {
this.roll = roll;
}
public void setNum(PhoneNumber num) {
this.num = num;
}
}
package student.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class PhoneNumber {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
Long id;
String num;
String type;
@OneToOne
Student stu;
public PhoneNumber() {
super();
}
public PhoneNumber(String num, String type) {
super();
this.num = num;
this.type = type;
}
public Long getId() {
return id;
}
public String getNum() {
return num;
}
public void setId(Long id) {
this.id = id;
}
public void setNum(String num) {
this.num = num;
}
public Student getStu() {
return stu;
}
public void setStu(Student stu) {
this.stu = stu;
}
}
电话号码实体
package student.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id;
String name;
int roll;
@OneToOne
PhoneNumber num;
public Student() {
super();
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public int getRoll() {
return roll;
}
public PhoneNumber getNum() {
return num;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setRoll(int roll) {
this.roll = roll;
}
public void setNum(PhoneNumber num) {
this.num = num;
}
}
package student.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class PhoneNumber {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
Long id;
String num;
String type;
@OneToOne
Student stu;
public PhoneNumber() {
super();
}
public PhoneNumber(String num, String type) {
super();
this.num = num;
this.type = type;
}
public Long getId() {
return id;
}
public String getNum() {
return num;
}
public void setId(Long id) {
this.id = id;
}
public void setNum(String num) {
this.num = num;
}
public Student getStu() {
return stu;
}
public void setStu(Student stu) {
this.stu = stu;
}
}
学生和电话号码回购
package student.repo;
import org.springframework.data.repository.CrudRepository;
import student.entity.Student;
public interface StudentRepo extends CrudRepository<Student, Long> {
}
package student.repo;
import org.springframework.data.repository.CrudRepository;
import student.entity.PhoneNumber;
public interface PhoneNumberRepo extends CrudRepository<PhoneNumber, Long>{
}
在这个程序中(在seedDb文件中),我必须使用PhoneNumberEPO手动保存电话号码,然后再将其设置为学生,但是在线教程中不需要此步骤
此外,学生的id不会保存到电话号码中,如屏幕截图所示
请告诉我如何将电话号码设置为学生,而不将其保存到数据库,即当我保存学生时,电话号码自动保存到数据库,以及如何将学生的id自动设置到电话号码。代码中的问题是,您在学生中设置了电话号码,但从未在电话号码中设置学生 对于双向关系,您需要在创建关系的两个实体之一的
@OneToOne
注释中使用cascade
参数。经验法则是,级联应该从父级到子级进行。在您的情况下,学生是家长班级,因此您应该执行以下操作:
@OneToOne(cascade = CascadeType.ALL)
PhoneNumber num;
创造一个这样的学生:
Student student = new Student();
student.setName("John Doe");
student.setRoll(4);
PhoneNumber phoneNumber = new PhoneNumber("9090909090", "Home");
student.setNum(phoneNumber);
phoneNumber.setStu(student);
studentRepository.save(student);
结果:
为什么你需要在两个表中都放外键?因为我的先生说双向映射是一种更好的方法谢谢@TwiN的工作,但是你能建议一种方法,这样当我保存学生电话号码时会自动保存。它已经这样做了。您是否确保在电话号码中设置了学生,并在学生中设置了电话号码?如果你这样做了,那么保存学生将同时保存。如果我不写phonenumberpo.save(PhoneNumber)它会抛出一个错误,这意味着studentRepo无法保存phoneNumberHi@Ankit,正如你所知,在这里说“谢谢”的首选方式是对任何有用的答案进行投票,如果有助于解决你的问题,就接受一个(这也会给你一些声望点数)。如果你还有其他问题,请创建一个新的单独问题。