Как добавить значения во многие стороны в пружинной загрузке отношения один ко многим - PullRequest
1 голос
/ 10 апреля 2019

У меня есть торговые и адресные таблицы. у одного продавца может быть несколько адресов, а у одного адреса есть один продавец (отношение один ко многим). При добавлении значения продавца с адресом я получаю эту ошибку. Как решить эту ошибку? Это ошибка.

{
    "timestamp": 1554878673504,
    "status": 500,
    "error": "Internal Server Error",
    "message": "could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement",
    "path": "/merchant-service/save-merchant"
}

Это мои входные значения:

 {
        "idNo": null,
        "idType": null,
        "emailId": "email@gmail.com",
        "name": null,
        "status": true,
        "createdBy": null,
        "modifiedBy": null,
        "createdDate": null,
        "modifiedDate": null,
        "contacts": [
            {"contactNo": "0766601122"}],
        "addresses": [
            {"line1": "manipay"},
            {"line1": "suthumalai"}
            ]
    }

это мой код в торговой модели:

 @OneToMany(fetch = FetchType.LAZY,cascade = {CascadeType.ALL}, mappedBy = "merchant")
    private Set<Address> addresses = new HashSet<Address>(
            0);

это мой код в модели адреса:

 @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "merchant_id", nullable = false)
//    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
//    @Getter(onMethod = @__( @JsonIgnore))
//    @Setter
    private Merchant merchant;

это мой сервис:

public Merchant saveMerchant(Merchant merchant) {
       merchant = merchantRepository.save(merchant);
       return merchant;
    }

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

В таблице Merchent:

  @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}, mappedBy = "merchant")
    private Set<Address> addresses = new HashSet<Address>(
            0);

В адресной таблице:

 @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "merchant_id")
        @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
        @Getter(onMethod = @__( @JsonIgnore))
        @Setter
        private Merchant merchant;

В службе:

public Merchant saveMerchant(Merchant merchant) {
       merchant = merchantRepository.save(merchant);
        Merchant finalMerchant = merchant;
        merchant.getAddresses().forEach(address -> {
           address.setMerchant(finalMerchant);
           addressRepository.save(address);
       });
       return merchant;
    }

Отлично работает.

0 голосов
/ 10 апреля 2019

В вашей модели продавца вы задали cascade = {CascadeType.ALL} для атрибута адреса.Это означает, что в этом случае, если вы хотите сохранить объект Merchant с некоторыми адресами, hibernate проверит, существуют ли эти адреса;если нет, то создаст их раньше.Но в вашей модели Address вы устанавливаете nullabel = false для атрибута merchant, что означает, что объект Address невозможно сохранить без существующего Merchant.Затем, когда hibernate пытается сохранить Merchant и находит адрес, который еще не был сохранен, он пытается сохранить этот адрес ранее, он также находит нулевой объект Merchant и затем выдает это исключение org.hibernate.exception.ConstraintViolationException.

Вы должны выбрать одно из следующих предложений:

  • Удалить ограничение nullable = false в атрибуте продавца в модели адреса.если вы сделаете это, Адрес будет сохранен без Продавца.Затем при сохранении Merchant hibernate обновит Address.

  • Измените cascade = {CascadeType.ALL} на все остальные каскады, кроме PERSIST в атрибуте адреса модели Merchant.Если вы сделаете это, вы должны сохранить Merchant перед собой, а затем сохранить Address с существующим Merchant.

0 голосов
/ 10 апреля 2019

Это говорит о том, что у вас есть ошибка нарушения ограничения, что означает, что вы могли установить любую переменную в сущности не равной NULL, и вы пытаетесь сохранить нулевое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...