【问题标题】:Database mapping数据库映射
【发布时间】:2020-06-14 09:19:17
【问题描述】:

我创建了一个带有两个表(书籍、成员)的 MySql 数据库。一个成员可以有很多本书,而某本书只能有一个成员。我想创建一个 Spring Boot 项目,该项目将是一个 REST API,可在数据库上执行 CRUD 操作。对于数据库操作,我使用 Spring Data JPA。

接下来我创建了两个类,称为书籍和成员。

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

我的图书馆服务接口

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

和休息控制器

@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 方法时,返回的是一个无限列表。一个会员有一本书,这本书有一个会员,这个会员有一本书等等......

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

【问题讨论】:

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


    【解决方案1】:

    问题是您在会员和图书之间存在双向映射。这是一个循环依赖,如果 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-infinite-recursion

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      • 2011-11-05
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      相关资源
      最近更新 更多