Spring JPA Many to One - отношения один ко многим с RestController - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь получить все данные отношения Many To One из базы данных Postgresql с помощью Rest Controller с данными внешнего ключа. Как для курса и инструктора:

{
    {
        "id": 1,
        "course_name": "IT 101",
        "instructor":{
            "instructor_name":"Jack King"
        }
    },
    {
        "id": 2,
        "course_name": "CS 101",
        "instructor":{
            "instructor_name":"Homer Love"
        }
    },
    {
        "id": 3,
        "course_name": "DB 101",
        "instructor":{
            "instructor_name":"Jack King"
        }
    }
}

Мой код выглядит следующим образом:

База данных

create table instructor
(
    id          integer generated always as identity,
    instructor_name text,

    primary key (instructor_name),
    unique (id)
);

create table course
(
    id               integer generated always as identity,
    course_name text    not null,
    instructor_fk      integer references instructor (id),

    primary key (course_name, instructor_fk),
    unique (id)
);
insert into instructor (instructor_name) values ('Jack King');
insert into instructor (instructor_name) values ('Homer Love');

insert into author (course_name, instructor_fk) values ('IT 101', 1, 1);
insert into author (course_name, instructor_fk) values ('CS 101', 2, 2);
insert into author (course_name, instructor_fk) values ('DB 101', 3, 1);

Сущности

  • Я использую Project Lombok аннотации, поэтому вместо ограничений, геттеры и сеттеры для меньшего шаблонного кода.

Курс

import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Table(name = "course")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String course_name;

    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}  )
    @JsonIgnore
    @JoinColumn(name = "instructor_fk", nullable = false)
    private Instructor instructor;
}

Инструктор

@Entity
@Table(name = "instructor")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Instructor {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(unique = true)
    private String instructor_name;

    @OneToMany(
            mappedBy = "instructor",
            cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}
    )
    private List<Course> courses;
}

Репозиторий

@Repository
public interface CourseRepository extends CrudRepository<Author, Integer> {
}

Сервис

@Service
public class CourseService {
    @Autowired
    private CourseRepository courseRepository;

    public List<Author> getAllCourses() {
        return (List<Author>) courseRepository.findAll();
    }
}

Контроллер

@RestController
public class CourseController {
    @Autowired
    private CourseService courseService;

    @GetMapping("/courses")
    private List<Author> getAllCourses() {
        return courseService.getAllCourses();
    }
}

Что я получаю:

{
    {
        "id": 1,
        "course_name": "IT 101"
    },
    {
        "id": 2,
        "course_name": "CS 101"
    },
    {
        "id": 3,
        "course_name": "DB 101"
    }
}

1 Ответ

0 голосов
/ 07 мая 2020

@ JsonIgnore аннотация должна быть в отношении One To Many, что означает, что она должна быть в сущности Instructor, а не в сущности Course:

Course

import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Table(name = "course")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String course_name;

    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}  )
    @JoinColumn(name = "instructor_fk", nullable = false)
    private Instructor instructor;
}

Instructor

@Entity
@Table(name = "instructor")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Instructor {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(unique = true)
    private String instructor_name;

    @OneToMany(
            mappedBy = "instructor",
            cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}
    )
    @JsonIgnore
    private List<Course> courses;
}
...