Почему Hibernate запускает обновление вместо удаления

#spring #hibernate #jpa

Вопрос:

я пытаюсь удалить строку из своей дочерней сущности . Loan-это мой родительский класс, а DVLoanParticipants-дочерний класс. Мой объект займа выглядит так, чтобы запустить удаление .

  Loans(loanId=196777, dvLoanParticipantsMap={})
 

Я ожидаю , что я удалю строку из DVLoanParticipants, но спящий режим пытается запустить инструкцию update и терпит неудачу.

 @Entity
public class Loans {
        
@Id
@Column(name = "LOAN_ID")
private Long loanId;
    
@OneToMany(targetEntity = DVLoanParticipants.class, cascade = 
CascadeType.ALL,orphanRemoval=true )
@JoinColumn(name = "LOAN_ID")
@MapKey(name = "dvLoanParticipantsId.dvpParticipantName")
@LazyCollection(LazyCollectionOption.FALSE)
private Map<String, DVLoanParticipants> dvLoanParticipantsMap;
}

@Entity
public class DVLoanParticipants  implements Serializable{

private static final long serialVersionUID = 1L;

@EmbeddedId
private DVLoanParticipantsId dvLoanParticipantsId;
}


@Embeddable
public class DVLoanParticipantsId implements Serializable {
private static final long serialVersionUID = 1L;

@Column(name = "LOAN_ID")
private Long loanId;

@Column(name = "DVP_PARTICIPANT_NAME")
private String dvpParticipantName;

}
 

Оператор Update пытается выполнить это

 update DV_LOAN_PARTICIPANTS set  LOAN_ID=null  where LOAN_ID=?
 

Но почему он запускает инструкцию Update ? что я могу сделать, чтобы запустить инструкцию delete?

Комментарии:

1. Поделитесь примером кода, который вы используете для удаления DVLoanParticipants ?

Ответ №1:

CascadeType.ALL (конкретно CascadeType.REMOVE здесь) не означает, что дети будут удалены, если они будут удалены из коллекции. Это означает, что каждый переход состояния родителя каскадируется на его ребенка. Дочерние элементы удаляются автоматически только при удалении родителя.

Таким образом, удаляя объект DVLoanParticipants в коллекции, вы не просите Hibernate удалить объект. Вы просите его обновить запись , указав «нет Loans «, что приводит к обновлению SQL с NULL использованием внешнего ключа.

Вам нужно было @OneToMany(orphanRemoval=true) для гибернации удалить ребенка, когда он разлучен со своими родителями (он должен быть отделен от всех родителей, чтобы он работал).

Комментарии:

1. Я пытался с этим справиться , но безуспешно, все равно получаю ту же проблему . Все еще работает инструкция по обновлению

2. @OneToMany(целевое значение = DVLoanParticipants.class, каскад = тип каскада. ВСЕ,orphanRemoval=true ) @JoinColumn(имя = «LOAN_ID»,обновляемый = false)

3. Изменил код, как указано выше, и теперь он работает