JPA ManyToOne / OneToMany双向获取重复数据

时间:2019-03-26 01:08:06

标签: java spring-boot jpa

我正在使用Spring 2.1构建REST API,并且正在获取重复的数据以咨询ManyToOne关系。

本地化

@Entity
@Table(name = "localidad")
public class Localidad implements Serializable {

    private static final long serialVersionUID = -7258462202419598287L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idLocalidad;

    private String nombreLocalidad;

    private BigDecimal precioEnvio;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "provinciaIdProvincia")
    private Provincia provincia;

    public Localidad() {}

    public Localidad(String nombreLocalidad, BigDecimal precioEnvio) {
        this.nombreLocalidad = nombreLocalidad;
        this.precioEnvio = precioEnvio;
    }
...

省:

@Entity
@Table(name = "provincia")
public class Provincia implements Serializable {

    private static final long serialVersionUID = 3324427184301992595L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idProvincia;

    private String nombreProvincia;

    @OneToMany(mappedBy= "provincia", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Localidad> localidades = new HashSet<Localidad>();

    public Provincia() {}

    public Provincia(String nombreProvincia) {
        this.nombreProvincia = nombreProvincia;
    }
...

我通过实现CrudRepository和Service @Autowired访问信息

重复的数据HTTP GET请求:

Duplicate Data

谢谢

1 个答案:

答案 0 :(得分:0)

该问题是由Jackson在provincialocalidades字段上进行循环序列化引起的。这可以通过使用@JsonIgnoreProperties注释来解决。因此,请在Localidad类或实体中添加注释,如下所示:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "provinciaIdProvincia")
@JsonIgnoreProperties("localidades")
private Provincia provincia;

Provincia类中修改Set<Localidad>(顺便说一句,您可以只使用List<Localidad>),如下所示:

@OneToMany(mappedBy= "provincia", cascade = CascadeType.ALL, fetch = 
FetchType.LAZY)
@JsonIgnoreProperties("provincia")
private Set<Localidad> localidades = new HashSet<Localidad>();

通过此更改,您的Rest API现在应该不显示重复项。您必须忽略定义两个类或实体之间关联的字段。如果您使用@JsonProperty来定义字段名称,请使用@JsonProperty定义中的@JsonIgnoreProperties中使用的名称。