Я работаю над 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;
Обновление работает, но это исключает возможность использования каскада. Таким образом, когда я удаляю родительский объект, мне придется удалить все дочерние элементы заранее. Это не оптимально, поэтому я открыт для других решений
Спасибо!