Spring JPA与RestController多对一-一对多关系

时间:2020-05-07 11:09:31

标签: java hibernate spring-boot jpa spring-data-jpa

我正在尝试使用带有外键数据的Rest Controller从Postgresql数据库中检索所有多对一关系数据。喜欢课程和讲师:

ssql = "SELECT * FROM tblProject"
da = New OleDb.OleDbDataAdapter(ssql, con)
da.Fill(ds, "UpdateCoverPage")

Dim cb2 As New Data.OleDb.OleDbCommandBuilder(da)

   fill datatable here with data to be updated into ms access

da.Update(ds, "UpdateCoverPage")

我的代码如下:

数据库

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

实体

  • 我使用的是Project Lombok批注,因此为了减少样板代码,不使用约束,获取器和设置器。

课程

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

讲师

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();
    }
}

1 个答案:

答案 0 :(得分:0)

@JsonIgnore批注应该在一对多关系上,这意味着它应该在讲师实体上而不在课程实体上:

课程

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;
}

讲师

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