最近我开始学习java和spring boot,所以我决定做一个基本的原型服务系统。但是我在持久化relashionship上遇到了一些问题,其中包含oneToMany或manyToMany的引用。
我已经创建了表"服务_订单", "服务"和"服务_订单_服务" (Pivot表,使service_order和services之间的重新定位)。所以我的数据库实体是这样的。
service_orders.id > 服务_订单_服务.service_order_id
服务.id > 服务_订单_服务.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": "[email protected]",
"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控制器中的操作:
@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自动完成?
你的代码看起来有点混乱,所以IM会假设你想做什么。
只解决jpa不保存嵌套对象的事实。为了解决这个问题,你必须在你的注解中使用级联。@OneToMany(mappedBy="serviceOrder",cascade= CascadeType.ALL)
如果你只有@OneToOne关系,我不明白你的数据透视表有什么用。所以我假设你想在服务和服务订单类之间做多对多;在这种情况下,在服务订单服务实体中建立关系@ManyToOne,这将是你手动创建的ManyToMany表;但如果你这样做,你将不得不传递服务订单服务对象到你的服务订单。
做你想做的事的捷径是做如下操作。
@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级联