簡體   English   中英

Springboot不堅持嵌套object

[英]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 中的所有服務訂單服務行嗎?

你的代碼看起來有點混亂,所以我會假設你想要做什么;

  1. 僅解決 jpa 不保存嵌套 object 的事實。 要解決此問題,您必須在注釋中使用級聯@OneToMany(mappedBy="serviceOrder",cascade= CascadeType.ALL)

  2. 如果您只有 @OneToOne 關系,我看不到您的 pivot 表的使用。 所以我假設你想在 Service 和 ServiceOrder class 之間做多對多; 在這種情況下,在 ServiceOrderService 實體 @ManyToOne 中建立關系,這將是您手動創建的 ManyToMany 表; 但是如果你這樣做了,那么你將不得不將 ServiceOrderService object 傳遞給你的 ServiceOrder。

  3. 做你想做的事的捷徑是做以下事情:

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM