Java 未在spring boot中自动保存Id

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

我正在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.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,正如你所知,在这里说“谢谢”的首选方式是对任何有用的答案进行投票,如果有助于解决你的问题,就接受一个(这也会给你一些声望点数)。如果你还有其他问题,请创建一个新的单独问题。