Spring Rest Обновление ссылки родительской сущности в child - PullRequest
0 голосов

Я работаю над Java Spring, и у меня возникла проблема. Я пытаюсь обновить ссылку на валюту (ComCurrency) в дочернем объекте (BudBudgetLine). Когда я сохраняю обновление, запись BudBudgetLine удаляется. Нет ошибки, но при отладке запросов sql я заметил, что после обновления он запускает запрос на удаление из ниоткуда. Когда я удаляю строку, запускающую setCurrency, они обновляются, хотя все идет хорошо. У кого-нибудь есть намеки на это? Заранее спасибо. Ниже представлен мой код.

ComCurrency. java

@Entity
@JsonIdentityInfo(
          generator = ObjectIdGenerators.PropertyGenerator.class, 
          property = "id",
          scope = ComCurrency.class)
public class ComCurrency extends AuditableBaseEntity {

    /** @pdOid f3c7fb8c-63d8-4104-9eae-8c16f7a7f148 */
    @Column(updatable = false, unique = true)
    protected String gsCurCode;

    @NotBlank()
    @Size(min=3, max=3, message ="Please enter 3 characters")
    protected String gsCurShorten;

    /** @pdOid b26faa97-9c7f-43ce-a466-868beceb510f */
    @NotBlank()
    protected String gsCurName;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "currency", orphanRemoval = true)
    @JsonBackReference(value = "budget-currency")
    protected List<BudBudgetLine> budgetLines;

BudBudgetLine. java

@Entity
@JsonIdentityInfo(
          generator = ObjectIdGenerators.PropertyGenerator.class, 
          property = "id",
          scope = BudBudgetLine.class)
public class BudBudgetLine extends AuditableBaseEntity {

    /** @pdOid aade8246-d019-4bb9-95b0-22774e3ea2f7 */
    @Column(updatable = false, unique = true)
    protected String gsBudCode;

    /** @pdOid 379c0bc4-819b-4a17-9ee0-ee488424328e */
    @NotBlank()
    protected String gsBudName;

    @NotNull()
    @JsonFormat(pattern = "yyyy-mm-dd")
    protected Date gdtAttributionDate;

    /** @pdOid 8c8c8852-3fe5-4ff0-8b0d-db607e0f8532 */
    protected int giBudSatus;

    /** @pdOid cb4997c6-0f2d-4cc7-a063-c67c1bf5bff2 */
    @NotNull()
    protected float gfBudAmount = 0;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="currency_id", nullable = true, updatable = true )
    @JsonIgnore
    @JsonManagedReference(value = "budget-currency")
    protected ComCurrency currency;

Функция обновления

public BudBudgetLine updateBudgetLine(String psCode, BudBudgetLine pbudBudget, String psUsername, String psToken) {
        AdmUser lusrLogedUser = gureUserContext.findByUsername(psUsername);
        BudgetRequest lbrRequest = new BudgetRequest(pbudBudget.getCompany().getId(), pbudBudget.getPeriod().getId());
        BudBudgetLine lbudBudgetToUpdate = findBudgetByCode(psCode, lbrRequest, psToken);
//      ComCurrency lcurNewCurrency = pbudBudget.getCurrency();
        lbudBudgetToUpdate.setGsBudName(pbudBudget.getGsBudName());
        lbudBudgetToUpdate.setGdtAttributionDate(pbudBudget.getGdtAttributionDate());
//      lbudBudgetToUpdate.setCurrency(lcurNewCurrency);
        lbudBudgetToUpdate.setGfBudAmount(pbudBudget.getGfBudAmount());
        lbudBudgetToUpdate.setBudgetParent(pbudBudget.getBudgetParent());
        lbudBudgetToUpdate.setService(pbudBudget.getService());
        lbudBudgetToUpdate.setUpdatedById(lusrLogedUser.getId());
        return gburBudgetContext.save(lbudBudgetToUpdate);
    }

Псевдо-решение

Хорошо, пока лучшее, что я мог сделать, это обновить эту строку

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "currency", orphanRemoval = true)
        @JsonBackReference(value = "budget-currency")
        protected List<BudBudgetLine> budgetLines;

до

@OneToMany(fetch = FetchType.LAZY, mappedBy = "currency")
        @JsonBackReference(value = "budget-currency")
        protected List<BudBudgetLine> budgetLines;

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

Спасибо!

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