Как обновить одно поле в моем Entity с помощью репозитория JPA - PullRequest
0 голосов
/ 30 января 2019

У меня есть Entity с 3 полями: id, фамилия и phoneNumber.Я хочу создать метод, который работает для обновления всех полей или только одного или двух.

Я использую Hibernate и JPA Repository.Когда я пытаюсь обновить все поля, все работает хорошо, но когда, например, я хочу обновить только фамилию без изменения phoneNumber, у меня в выводе null insted старого phoneNumber.

Вот мой метод из контроллера:

@PutMapping("/students/update/{id}")
public String updateStudentById(@ModelAttribute Student student, @ModelAttribute StudentDetails studentDetails,
                                String lastname, String phoneNumber,
                                @PathVariable Long id) {

    Optional<Student> resultOptional = studentRepository.findById(id); 

    //Student result =resultOptional.get();
    resultOptional.ifPresent((Student result) -> {
           result.getStudentDetails().setPhoneNumber(studentDetails.getPhoneNumber());     result.getStudentDetails().setLastname(studentDetails.getLastname());
        studentRepository.save(result);
    });
    return "Student updated";
}

Класс для обновления:

@DynamicUpdate
@Entity
public class StudentDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name="lastname")
    private String lastname;
    @Column(name="phone_number")
    private String phoneNumber;

    public StudentDetails() {
    }

    public StudentDetails(Long id, String lastname, String phoneNumber) {
        this.id = id;
        this.lastname = lastname;
        this.phoneNumber = phoneNumber;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

Класс, имеющий отношение к StudentDetails:

@Entity
@Table(name = "student")
@DynamicUpdate
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;
    @Column(name = "email")
    private String email;

    //@OneToMany(mappedBy = "student")
    @ManyToMany
    @JoinTable(name="course_student",joinColumns = @JoinColumn(name="student_id"),
    inverseJoinColumns = @JoinColumn(name="course_id"))

    private List<Courses> courses;

    @OneToOne(cascade = CascadeType.ALL)
   // @JoinColumn(name="studen/_details_id") // with this we have dobule student_details column
    private  StudentDetails studentDetails;


    public List<Courses> getCourses() {
        return courses;
    }

    public void setCourses(List<Courses> courses) {
        this.courses = courses;
    }

    public StudentDetails getStudentDetails() {
        return studentDetails;
    }

    public void setStudentDetails(StudentDetails studentDetails) {
        this.studentDetails = studentDetails;
    }

    // Methods for StudentViewController
    public String getLastname(){
        return studentDetails.getLastname();
    }
    public String getPhoneNumber(){
        return studentDetails.getPhoneNumber();
    }

    public Student() {
    }

    public Student(String name, String email, StudentDetails studentDetails) {
       // this.id = id;
        this.name = name;
        this.email = email;
        this.studentDetails = studentDetails;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }

}

Я искал решение и добавил @DynamicUpdate, но все еще ононе работает.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Вы забыли установить отображение @OneToOne в StudentDetails - StudentDetails также необходимо поле типа Student, которое будет аннотировано @OneToOne.

Также вы должны убедиться, что все поля сущностей будут заполнены - узнайте больше о типах выборки.

0 голосов
/ 21 февраля 2019

Ваш код работает правильно.Если в запросе указан только параметр lastName, параметр phoneNumber будет сопоставлен с null, поэтому вы переопределяете свойство phoneNumer в вашей сущности с помощью этого значения null.

Изменитькод следующим образом:

resultOptional.ifPresent((Student result) -> {
   if(studentDetails.getPhoneNumber()!=null) {
     result.getStudentDetails().setPhoneNumber(studentDetails.getPhoneNumber());     
   }
   if(studentDetails.getLastname()!=null) {
     result.getStudentDetails().setLastname(studentDetails.getLastname());
   }
   studentRepository.save(result);
});

К сожалению, возникает другая проблема: как вы удалите эти поля?(Как вы можете явно установить для них null?)

Возможное решение, если вы проверите для "" (пустая строка) и установите для свойства значение null, если параметр является пустой строкой.

В любом случае это будет довольно грязный код ...

Вам следует рассмотреть возможность использования пакета Spring Data Rest.Он автоматически создает все стандартные конечные точки REST для ваших сущностей и обрабатывает все эти проблемы PUT / PATCH / POST / DELETE «из коробки».

0 голосов
/ 30 января 2019

почему бы вам просто не задать параметры вашего запроса в ваших установщиках?

resultOptional.ifPresent((Student result) -> {
result.getStudentDetails().setPhoneNumber(phoneNumber);
result.getStudentDetails().setLastname(lastname);
studentRepository.save(result);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...