嵌套对象不持久化

问题描述 投票:1回答:1

最近我开始学习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自动完成?

java spring-boot jpa spring-data-jpa spring-rest
1个回答
0
投票

你的代码看起来有点混乱,所以IM会假设你想做什么。

  1. 只解决jpa不保存嵌套对象的事实。为了解决这个问题,你必须在你的注解中使用级联。@OneToMany(mappedBy="serviceOrder",cascade= CascadeType.ALL)

  2. 如果你只有@OneToOne关系,我不明白你的数据透视表有什么用。所以我假设你想在服务和服务订单类之间做多对多;在这种情况下,在服务订单服务实体中建立关系@ManyToOne,这将是你手动创建的ManyToMany表;但如果你这样做,你将不得不传递服务订单服务对象到你的服务订单。

  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级联

© www.soinside.com 2019 - 2024. All rights reserved.