我在使用spring jpa持久化具有ManyToOne关系的Object时遇到问题。
这些是我的课程。
父类
@Entity
@Table(name = "PROVINCE")
public class Province {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "PROVINCE_ID")
private long id;
private String name;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "province", targetEntity = Town.class)
@JsonManagedReference("Province-Town")
private List<Town> towns;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Town> getTowns() {
return towns;
}
public void setTowns(List<Town> towns) {
this.towns = towns;
}
}
儿童班
@Entity
@Table(name = "TOWN")
public class Town {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "TOWN_ID")
private long id;
private String name;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "PROVINCE_ID")
@JsonBackReference("Province-Town")
private Province province;
private long kiloMeter;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Province getProvince() {
return province;
}
public void setProvince(Province province) {
this.province = province;
}
public long getKiloMeter() {
return kiloMeter;
}
public void setKiloMeter(long kiloMeter) {
this.kiloMeter = kiloMeter;
}
}
仅供参考,我已经为各自的类提供了存储库和服务。
用于创建城镇实体的我的RestController是..
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<Void> create(@RequestBody Town town, UriComponentsBuilder ucBuilder) {
if (townService.isTownExists(town)) {
LOGGER.info("Unable to save {}. Town already exists", town.getName());
return new ResponseEntity<Void>(HttpStatus.CONFLICT);
}
townService.save(town);
HttpHeaders headers = new HttpHeaders();
headers.setLocation(ucBuilder.path(BASE_PATH + "/{id}").buildAndExpand(town.getId()).toUri());
return new ResponseEntity<Void>(headers, HttpStatus.CREATED);
}
问题是我想将对象与父实体(省)一起发布。
假设我已经持有 id为1 的省份。我在POSTMAN中发送的JSON正文就是这个。
{
"name" : "Some Town",
"province" : {
"id" : 1
},
"kiloMeter" : 340
}
但是我收到了错误。
"exception": "org.springframework.dao.InvalidDataAccessApiUsageException",
"message": "detached entity passed to persist: org.pipecrafts.busnet.model.location.misc.Province; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: org.pipecrafts.busnet.model.location.misc.Province",
当我发送这样的请求时,它是成功的。
{
"name" : "Some Town",
"kiloMeter" : 340
}