【发布时间】:2017-08-30 15:22:18
【问题描述】:
我正在尝试使用 json 将一些数据添加到数据库中:
{
"id": null,
"basicInfo": {
"firstName": "Mistral",
"lastName": "Castrol",
"pesel": "45789623456",
"startDate": "2017-02-12"
},
"contactInfo": {
"id": null,
"email": "wp@pw.pl",
"phoneNumber": "456789123",
"address": {
"houseNamber": 53,
"apartmentNumber": 25,
"street": {
"id": 1,
"name": "Koszmarna",
"city": {
"id": 2,
"name": "Radzyń Podlaski",
"voivodeship": {
"id": 2,
"name": "mazowieckie"
},
"zipCode": "21-307"
}
}
}
},
"bornInfo": {
"id": null,
"bornDate": "2018-02-14",
"city": {
"id": 1,
"name": "Siedlce",
"voivodeship": {
"id": 1,
"name": "śląskie"
},
"zipCode": "21-307"
}
}
}
。我正在失去耐心。经过数小时的谷歌搜索和尝试,我陷入了这个错误:
“消息”:“传递给持久化的分离实体:pl.dn.model.placeInfo.City;嵌套异常是 org.hibernate.PersistentObjectException:传递给持久化的分离实体:pl.dn.model.placeInfo.City”
问题是城市实体(分离)已经存在于数据库中,但另一个数据,如名字,第二个是临时实体的一部分。我不知道我应该 修改 json 或模型。
型号:
版主
@Entity
public class Moderator {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Embedded
private BasicInfo basicInfo;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "contact_info_id")
private ModeratorContactInfo contactInfo;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "born_info_id")
private ModeratorBornInfo bornInfo;
}
版主联系信息
@Entity
@Table(name = "moderator_contact_info")
public class ModeratorContactInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String email;
@Column(name = "phone_number")
private String phoneNumber;
@Embedded
private Address address;
}
地址
@Embeddable
public class Address {
@Column(name = "house_number")
private long houseNamber;
@Column(name = "apratment_number")
private long apartmentNumber;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "street_id")
private Street street;
}
街道
@Entity
public class Street {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "city_id")
private City city;
}
城市
@Entity
@Table(name = "city")
public class City {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "voivodeship_id")
private Voivodeship voivodeship;
@Column(name = "zip_code", length = 6)
private String zipCode;
}
省
@Entity
public class Voivodeship {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
}
最后是Controller方法:
@RequestMapping(value = "add", method = RequestMethod.POST)
public String addModerator(@RequestBody Moderator moderator) {
return moderatorDao.save(moderator).toString();
}
临时解决方案:
如果我从数据库加载城市并将其设置为用户,它可以工作,但我必须与主持人中的所有实体有关。
@RequestMapping(value = "add", method = RequestMethod.POST)
public String addModerator(@RequestBody Moderator moderator) {
long bornCityId = moderator.getBornInfo().getCity().getId();
long contactCityId = moderator.getContactInfo().getAddress().getStreet().getCity().getId();
if (! (bornCityId == 0)) {
City city = cityDao.findById(bornCityId);
moderator.getBornInfo().setCity(city);
}
if (! (contactCityId == 0)) {
City city = cityDao.findById(contactCityId);
moderator.getContactInfo().getAddress().getStreet().setCity(city);
}
return moderatorDao.save(moderator).toString();
}
【问题讨论】:
标签: spring entity-framework hibernate rest jpa