Estoy intentando eliminar una fila de mi entidad secundaria. Loan es mi clase para padres y DVLoanParticipants es mi clase para niños. Mi objeto de préstamo tiene este aspecto para ejecutar la eliminación.

 Loans(loanId=196777, dvLoanParticipantsMap={})

Mi expectativa es eliminar la fila de DVLoanParticipants, pero hibernar tratando de ejecutar una declaración de actualización y fallando.

@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;

}

La declaración de actualización que está intentando ejecutar es

update DV_LOAN_PARTICIPANTS set  LOAN_ID=null  where LOAN_ID=?

Pero, ¿por qué está ejecutando la declaración de actualización? ¿Qué puedo hacer para ejecutar la declaración de eliminación?

0
VKP 11 may. 2021 a las 03:52

1 respuesta

La mejor respuesta

CascadeType.ALL (específicamente CascadeType.REMOVE aquí) no significa que los niños serán eliminados si se eliminan de la colección. Significa que cada transición de estado del padre se conecta en cascada a su hijo. Los niños solo se eliminan automáticamente cuando se elimina el padre.

Entonces, al eliminar DVLoanParticipants en la colección, no le está pidiendo a Hibernate que elimine la entidad. Le está pidiendo que actualice el registro para que no apunte a Loans, lo que da como resultado una actualización de SQL con NULL en la clave externa.

Necesita tener @OneToMany(orphanRemoval=true) para que Hibernate elimine a un niño cuando está separado de sus padres (debe estar separado de todos los padres para que funcione).

1
Baptiste Beauvais 11 may. 2021 a las 12:25