Идентификатор не сохраняется автоматически при весенней загрузке - PullRequest
0 голосов
/ 28 мая 2018

Я создаю простую программу при весенней загрузке, используя 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;
    }

}

PhoneNumber Entity

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>{

}

SeedFile для ввода фиктивных данных

package student;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import student.entity.PhoneNumber;
import student.entity.Student;
import student.repo.PhoneNumberRepo;
import student.repo.StudentRepo;

@Component
public class SeedDb implements CommandLineRunner {
    private StudentRepo studentRepo;
    private PhoneNumberRepo phoneNumberRepo;

    public SeedDb(StudentRepo studentRepo, PhoneNumberRepo phoneNumberRepo) {
        super();
        this.studentRepo = studentRepo;
        this.phoneNumberRepo = phoneNumberRepo;
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("######################");
        Student stu1 = new Student();
        stu1.setName("X");
        stu1.setRoll(4);
        PhoneNumber p = new PhoneNumber("9090909090","Home");
        phoneNumberRepo.save(p); //saving phone number to database
        stu1.setNum(p);
        studentRepo.save(stu1);

    }

}

В этой программе (в файле seedDb) я должен вручную сохранить Телефонный номер с использованием phoneNumberRepo перед установкой его на student , но есть онлайн-учебники, в которых этот шаг не нужен.

Кроме того, идентификатор студент не сохраняется на номер телефона , как показано на скриншоте H2 Database  view

Подскажите, пожалуйста, как установить PhoneNumber в студент без сохранения его в базе данных, т.е. когда я сохраняю студент , phoneNumber автоматически сохраняются в базе данных и как установитьидентификатор студента на номер телефона автоматически.

1 Ответ

0 голосов
/ 28 мая 2018

Проблема в вашем коде состоит в том, что вы устанавливаете PhoneNumber в вашем Student, но вы никогда не устанавливаете Student в свой PhoneNumber.

Что касается двунаправленных отношений, вам нужно использовать параметр cascade в@OneToOne аннотация одной из двух сущностей, из которых вы создаете отношения.Правило большого пальца заключается в том, что каскадирование должно выполняться от родителей к детям.В вашем случае учащимся является родительский класс, поэтому вы должны сделать следующее:

@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);

Результат:

SELECT * FROM STUDENT

SELECT * FROM PHONE_NUMBER

...