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)
如果您使用 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:如果您要用全新的表示替换资源
| 归档时间: |
|
| 查看次数: |
1950 次 |
| 最近记录: |