[英]Springboot not persist nested object
最近開始學習java和spring啟動,所以決定做一個基本的原型服務系統。 但是我在堅持 relashionship 上遇到了一些問題,其中包含 oneToMany 或 manyToMany 引用。
我創建了表“ service_order ”、“ services ”和“ service_order_services ”(在 service_order 和 services 之間建立關聯的數據透視表)。 所以我的數據庫實體看起來是這樣的:
service_orders .id > service_order_services .service_order_id
服務.id > service_order_services .service_id
我已經從數據庫中獲取了這個relashion(手動插入時),但是當我嘗試保留這些信息時,沒有創建任何行......
我創建服務訂單的請求如下所示:
{
"status": { "id" : 1 },
"title": "Manutenção de compressor de ar",
"address": "Rua São João do Rio preto",
"dateSchedule": "2020-07-12T13:30:30+05:00",
"contactName": "Pedro Rocha",
"contactPhone": "11 6670-2132",
"contactEmail": "pedro@fakenterprize.com",
"details": "Manutenção preventiva no compressor de ar modelo RPX921 Série 4. Notas: Levar produtos para limpeza de peças.",
"services": [{ "service_id": 1 }]
}
我在 SO controller 中的操作:
@PostMapping(value = "", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> create(@Valid @RequestBody ServiceOrder serviceOrder) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
this.repository.save(serviceOrder);
String json = mapper.writeValueAsString(serviceOrder);
return ResponseEntity.ok(json);
}
SO實體:
@Entity
@Table(name = "service_orders")
public class ServiceOrder {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany( mappedBy = "serviceOrder" )
@JsonManagedReference
private Set<ServiceOrderService> services;
public Set<ServiceOrderService> getServices() {
return services;
}
public void setServices(Set<ServiceOrderService> services) {
this.services = services;
}
//... (Other properties)
}
服務訂單服務實體:
@Entity
@Table(name = "service_order_services")
public class ServiceOrderService {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
@JoinColumn(name = "service_order_id", referencedColumnName = "id")
@JsonBackReference
private ServiceOrder serviceOrder;
@OneToOne
@JoinColumn(name = "service_id", referencedColumnName = "id")
private Service service;
public ServiceOrder getServiceOrder() {
return serviceOrder;
}
public void setServiceOrder(ServiceOrder serviceOrder) {
this.serviceOrder = serviceOrder;
}
public Service getService() {
return service;
}
public void setService(Service service) {
this.service = service;
}
}
我的代碼有什么問題? 在持久化此 SO 或 JPA 之前,需要手動迭代並保存我的 controller 中的所有服務訂單服務行嗎?
你的代碼看起來有點混亂,所以我會假設你想要做什么;
僅解決 jpa 不保存嵌套 object 的事實。 要解決此問題,您必須在注釋中使用級聯@OneToMany(mappedBy="serviceOrder",cascade= CascadeType.ALL)
如果您只有 @OneToOne 關系,我看不到您的 pivot 表的使用。 所以我假設你想在 Service 和 ServiceOrder class 之間做多對多; 在這種情況下,在 ServiceOrderService 實體 @ManyToOne 中建立關系,這將是您手動創建的 ManyToMany 表; 但是如果你這樣做了,那么你將不得不將 ServiceOrderService object 傳遞給你的 ServiceOrder。
做你想做的事的捷徑是做以下事情:
@Entity
@Table(name = "service_orders")
public class ServiceOrder {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "service_order_services",
joinColumns = @JoinColumn(name = "service_order_id),
inverseJoinColumns = @JoinColumn(name = "service_id"))
private List<Service> services;
public List<Service> getServices() {
return services;
}
public void setServices(List<Service> services) {
this.services = services;
}
//... (Other properties)
}
@Entity
@Table(name = "services")
public class Service {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@@ManyToMany(mappedBy = "services")
private List<ServiceOrder> serviceOrders;
public List<ServiceOrder> getServiceOrders() {
return serviceOrders;
}
public void setServicesOrders(List<ServiceOrder> serviceOrders) {
this.serviceOrders = serviceOrders;
}
//... (Other properties)
}
相關文章: ManyToMany Cascading
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.