提问者:小点点

数据库映射


我创建了一个有两个表(books,members)的MySql数据库。 一个成员可以有很多本书,某本书只能有一个成员。 我想创建一个spring boot项目,它将是一个REST API,在数据库上预形成CRUD操作。 对于数据库操作,我使用的是Spring Data JPA。

接下来,我创建了两个名为books和Members的类。

    @Entity
    @Table(name = "members")
    public class Members {
        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;

        @Column(name = "last_name")
        private String lastName;

        @Column(name = "first_name")
        private String firstName;

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

        @Column(name = "phone_num")
        private String phoneNum;

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

        @OneToMany(mappedBy = "members", cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
        private List<Books> books;

//getters and setters

@Entity
@Table(name = "books")
public class Books {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

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

    @Column(name = "author_last_name")
    private String authorLastName;

    @Column(name = "author_first_name")
    private String authorFirstName;

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

    @Column(name = "publishing_year")
    private String publishingYear;

    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinColumn(name = "id_member")
    private Members members;
//getters and setters

我创建了一个名为LibraryRepository的接口,它扩展了JParePository。

    public interface LibraryRepository extends JpaRepository<Members, Integer> {
    }

我的LibraryService接口

public interface LibraryService {
    List<Members> findAll();
}

和LibraryServiceImpl类

@Service
public class LibraryServiceImpl implements LibraryService {

    private LibraryRepository libraryRepository;

    @Autowired
    public LibraryServiceImpl(LibraryRepository libraryRepository) {
        this.libraryRepository = libraryRepository;
    }

    @Override
    public List<Members> findAll() {
        return libraryRepository.findAll();
    }
}

和rest控制器

@RestController
@RequestMapping("/api")
public class LibraryRestController {

    private LibraryService libraryService;

    @Autowired
    public LibraryRestController(LibraryService libraryService) {
        this.libraryService = libraryService;
    }

    @GetMapping("/loans")
    public List<Members> findAll(){
        return libraryService.findAll();
    }
}

其中一个成员借了一本书。 当我运行应用程序并在http://localhost:8080/api/loans上使用GET方法时,返回的是一个无限列表。 一个会员有一本书而这本书有一个会员,这会员有一本书等等。。。。

我相信有些东西被错误地映射到了我的实体类上,但我无法找到确切的内容。


共1个答案

匿名用户

问题是您在Member和Book之间有一个双向映射。 这是一个循环依赖项,如果JSON封送器(jackson)正在将对象转换为JSON,它将遵循依赖项并产生一个无限循环。

您必须使用JSON注释来打破这个循环。

例如:

@JsonBackReference
@OneToMany(mappedBy = "members", cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
private List<Books> books;

@JsonManagedReference
@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name = "id_member")
private Members members;

这只是一个示例,由您决定哪个依赖项是托管引用。

请访问:https://www.baeldung.com/jackson-bidirectional-relationships-and-infinity-recursion