Я пытаюсь получить все данные отношения 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"
}
}