【问题标题】:Springboot not persist nested objectSpring Boot 不持久化嵌套对象
【发布时间】:2020-04-26 22:23:05
【问题描述】:

最近开始学习java和spring boot,所以决定做一个基本的原型服务系统。但是我在坚持 relashionship 时遇到了一些问题,其中包含 oneToMany 或 manyToMany 引用。

我创建了表“service_order”、“services”和“service_order_services”(在 service_order 和服务)。所以我的数据库实体看起来像这样:


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 控制器中的操作:

@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】:

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

    1. 仅解决 jpa 不保存嵌套对象的事实。要解决此问题,您必须在注释中使用级联 @OneToMany(mappedBy="serviceOrder",cascade= CascadeType.ALL)

    2. 如果您只有 @OneToOne 关系,我看不到您的数据透视表的用途。所以我假设你想在 Service 和 ServiceOrder 类之间做多对多;在这种情况下,在 ServiceOrderService 实体 @ManyToOne 中建立关系,这将是您手动创建的 ManyToMany 表;但如果你这样做了,那么你将不得不将 ServiceOrderService 对象传递给你的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-26
      • 2015-12-03
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      相关资源
      最近更新 更多