首页 > 解决方案 > 我在使用 JPA 从 mssql 从关系表中获取数据时遇到问题

问题描述

我在使用 JPA 从关系表中获取数据时遇到问题。我相信我的问题是我对注释的使用。我对此有点陌生,希望得到一些指导。

我之前遇到过一些问题,现在我正在度假,我真的很想学习图片实体

@Entity
        @Table(name = "Picture")
        public class Picture {

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

        @Column(name = "path")
        @NotNull

        private String path;
        @ManyToOne
        @JoinColumn(name = "portfolio_id", nullable = false)
        private Portfolio portfolio;

and getters, setters.

投资组合实体

        @Entity
        @Table(name = "Portfolio")
        public class Portfolio {

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

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

        @Column(name = "Description")
        @NotNull
        private String description;

        @Column(name = "Service")
        @NotNull
        private String service;

        @OneToMany(mappedBy = "portfolio")
        private Set<Picture> pictures;

在投资组合表中我有这个对象

id        address                 description         service
2         Köpenhamnsvägen 33B     some desc           Full-Staging

在图片表中我有这个对象

id        path                 portfolio_id
1         https://bild.se                 2

当我执行一个触发 repository.findAll 的简单获取请求时,我得到以下输出:

获取请求的嵌套对象

这就像这个嵌套对象的 5000 行。怎么来的?

此致!

标签: javasql-serverspringjpa

解决方案


这是因为你有一个双向映射,所以它涉及到一个递归。要解决此问题,只需尝试将@XmlTransient (JAX-B) 或@JsonbTransient/@JsonIgnore (Jackson) 添加到其中一个字段。这将使它在您的后端/RESTful 服务器的 JSON 表示中“不可见”。

@ManyToOne
@JoinColumn(name = "portfolio_id", nullable = false)
@XmlTransient/@JsonbTransient/@JsonIgnore (try all 3 annotations, since I dont know what implemantation of JAX-RS you are using
private Portfolio portfolio;

或者你可以为 Set 做:

@OneToMany(mappedBy = "portfolio")
@XmlTransient/@JsonbTransient/@JsonIgnore //again: try them out, I don't know your implementation
private Set<Picture> pictures;

然而,同时为两者做这件事并不是一个好主意,因为结果你不会在请求中看到任何东西。


推荐阅读