Springboot не сохраняется вложенный объект - PullRequest
1 голос
/ 27 апреля 2020

Недавно я начал изучать java и весеннюю загрузку, поэтому я решил создать основную c прототип сервисной системы. Но у меня возникают некоторые проблемы с постоянным обновлением, там есть ссылки oneToMany или manyToMany.

Я создал таблицу " service_order ", " services " и " service_order_services"(сводная таблица, определяющая связь между service_order и сервисами). Таким образом, мои объекты базы данных выглядят так:


service_orders .id> service_order_services .service_order_id

service .id > service_order_services .service_id


Я уже извлекаю из запроса get этот 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:

@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 автоматически?

1 Ответ

0 голосов
/ 03 мая 2020

ваш код выглядит немного запутанным, поэтому я собираюсь предположить, что вы хотите сделать;

  1. Обращаясь только к тому факту, что jpa не сохраняет вложенный объект. Чтобы решить эту проблему, вы должны использовать в своей аннотации каскад @OneToMany(mappedBy="serviceOrder",cascade= CascadeType.ALL)

  2. Я не вижу использования вашей сводной таблицы, если у вас есть только отношения @OneToOne. Итак, я предполагаю, что вы хотите сделать «многие ко многим» между классами Service и ServiceOrder; В этом случае создайте Relationships в ServiceOrderService Entity @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 Каскадирование

...