Spring Data Rest - PUT 不适用于关联的引用类型?

Cha*_*lie 6 rest spring spring-data-rest spring-hateoas spring-boot

我为 Spring Data Rest 项目实现了以下域类。

@Entity
@Data
public class Address {

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

    private String houseName;

    private String apartmentNumber;

    @ManyToOne
    private City city;

    @ManyToOne
    private Country country; 

}
Run Code Online (Sandbox Code Playgroud)

现在,我通过发送带有以下 JSON 的 POST 来创建地址资源。

{   
    "houseName":"Some House",
    "apartmentNumber":"13 B",
    "city": "http://localhost:8080/city/1"
    "country":"http://localhost:8080/countries/1"
}
Run Code Online (Sandbox Code Playgroud)

http://localhost:8080/addresses/1当我使用以下 JSON向端点发送 PUT 请求时,houseName 的值会更新。然而,即使我为该城市发送了不同的 URI,该城市仍然保持不变。

{   
    "houseName":"Another House",
    "apartmentNumber":"13 B",
    "city": "http://localhost:8080/city/2"
    "country":"http://localhost:8080/countries/1"
}
Run Code Online (Sandbox Code Playgroud)

如果我发送 PATCH 而不是 PUT,城市值也会更新。那么我该如何解决这个问题呢?

更新1

乡村班

@Data
@Entity
public class Country {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long countryID;

    private String countryName;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "country", orphanRemoval = true)
    private List<City> cities;

}
Run Code Online (Sandbox Code Playgroud)

城市级

@Data
@Entity
public class City {

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

    private String cityName;

    @ManyToOne
    @JoinColumn(name = "country_id")
    private Country country;
}
Run Code Online (Sandbox Code Playgroud)

zea*_*ord 1

如果您使用 Hibernate 作为 JPA 提供程序,那么您必须了解实体在两侧的映射方式,并指出它在子实体中的映射方式,子实体将负责在事务期间如何管理关系。

编辑和更新:

// 城市类

@Entity
public class City {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "city_id")
    private Long cityID;

    @Column(name = "city_name")
    private String cityName;

    @ManyToOne
    private Country country;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "city", orphanRemoval = true)
    private List<Address> addresses;
}
Run Code Online (Sandbox Code Playgroud)

// 国家/地区类别

@Entity
public class Country {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "country_id")
    private Long countryID;

    @Column(name = "country_name")
    private String countryName;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "country", orphanRemoval = true)
    private List<City> cities = new ArrayList<>();;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "country", orphanRemoval = true)
    private List<Address> addresses;
}
Run Code Online (Sandbox Code Playgroud)

使用补丁:如果您要更新部分资源、资源子集和关系

USE PUT:如果您要用全新的表示替换资源