Объединенная таблица Spring JPA не возвращает все поля - PullRequest
0 голосов
/ 20 ноября 2018

Я создал две таблицы - ученическая и предметная.Затем я создал третью таблицу student_subject, которая представляет собой объединенную таблицу для связи учащихся с предметами.Он имеет 5 полей: идентификатор строки, идентификатор студента, идентификатор субъекта и поля create_at и updated_at (которые получены из класса AuditModel):

  package com.rest.web.postgresapi.data.models;

import com.fasterxml.jackson.annotation.JsonIgnore;
import javax.persistence.*;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

@Entity
@Table(uniqueConstraints = {
        @UniqueConstraint(columnNames = {"student_id", "subject_id"})
})
public class StudentSubject extends AuditModel {

    @Id
    @GeneratedValue(generator = "enrollment_generator")
    @SequenceGenerator(
            name = "enrollment_generator",
            sequenceName = "enrollment_sequence",
            initialValue = 4420
    )
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "student_id", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonIgnore
    private Student student_id;  // If I put private Long student_id, it fails

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "subject_id", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonIgnore
    private Subject subject_id; // If I put private Long subject_id, it fails

    // Constructors
    protected StudentSubject() {}

    public StudentSubject(Student student_id, Subject subject_id) {
        this.student_id = student_id;
        this.subject_id = subject_id;
    }

    // Getters
    public Long getId() {
        return id;
    }

    public Student getStudent_id() {
        return student_id;
    }

    public Subject getSubject_id() {
        return subject_id;
    }

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

    public void setStudent_id(Student student) {
        this.student_id = student;
    }

    public void setSubject_id(Subject subject) {
        this.subject_id = subject;
    }

}

Приложение прекрасно создает таблицы в базе данных, и я могу получитьи пост в студенческих и предметных столах.Нет проблем с этим.Боль приходит с контроллером для объединенного стола.

Это контроллер для таблицы объединенного стола student_subject

package com.rest.web.postgresapi.controllers;

import com.rest.web.postgresapi.data.models.StudentSubject;
import com.rest.web.postgresapi.repository.StudentSubjectRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

import java.util.List;

@RestController
public class StudentSubjectController {

    @Autowired
    private StudentSubjectRepository studentSubjectRepository;

    @GetMapping("/enrollments")
    public List<StudentSubject> getAllStudentsSubjects(){
        return studentSubjectRepository.findAll();
    }

    @PostMapping("/enrollments/student/subject")
    public StudentSubject createStudentSubject(@Valid @RequestBody StudentSubject studentSubject) {
        return studentSubjectRepository.save(studentSubject);
    }

}

Есть две проблемы:

1 .-когда я получаю данные из таблицы student_subject, он получает только идентификатор строки, а также поля create_at и updated_at.Нет ни student_id, ни subject_id.

ответ от get

2 .- Когда я делаю сообщение (от почтальона), чтобы вставить строку, я получил следующую ошибку:

Detail: Failing row contains (4671, 2018-11-20 11:04:34.176, 2018-11-20 11:04:34.176, null, null).

Я предоставляю и student_id, и subject_id, как вы можете видеть на этом скриншоте от почтальона, но ошибка ясно говорит о том, что оба поля равны нулю:

почтальон

Кажется, мое определение таблицы как-то неверно.Чего мне не хватает в моем коде?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Решается заменой

@ JsonIgnore

на

@ JsonIgnoreProperties ({"hibernateLazyInitializer", "handler"}) *

как указано в этом ответе

0 голосов
/ 20 ноября 2018

Spring MVC использует Jackson для сериализации / десериализации объектов Java в / из JSON.

Если вы аннотируете атрибут с помощью @ JSONIgnore , Джексон его игнорирует.

По этой причине вы не видите поле student_id или поле subject_id в ответе JSON метода GET.Потому что Джексон игнорирует их, когда конвертирует из объекта в json.

И это причина, по которой ваш POST терпит неудачу.Потому что Джексон игнорирует полученные атрибуты.Джексон создает пустую сущность, а JPA сохраняет сущность без student_id и subject_id .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...