Spring Data JPA: при удалении родительской сущности дочерние объекты не удаляются - PullRequest
0 голосов
/ 21 октября 2019

Мои сущности. ValidationStep имеет отношение один к одному с documentDetail, а documentDetail имеет отношение oneToMany documentValidations

ValidationStep

@Entity
public class ValidationStep {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne
@JoinColumn(name= "automation_information_aId", referencedColumnName= "aId")
private AutomationInformation automationInformation;

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@OneToOne(cascade = { CascadeType.ALL }, orphanRemoval = true,fetch=FetchType.LAZY)
private DocumentDetail documentDetail;
 }

DocumentDetail

@Entity
public class DocumentDetail {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "documentDetail_id")
private List<DocumentValidation> documentValidationList

DocumentValidation

@Entity
public class DocumentValidation implements Comparable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;


}

Мой запрос на удаление

        @Modifying
    @Query(value = "DELETE FROM ValidationStep validationStep WHERE validationStep.automationInformation.id = :aId AND isDraft is true")
    void  deleteAllDraftsByAutomationInformationaID(@Param("aId") Long aId);

Родительский ValidationStep удален, однако docDetail и documentValidations все еще находятся в базе данных.

1 Ответ

1 голос
/ 21 октября 2019

Из спецификаций JPA (параграф 4.10: Операции массового обновления и удаления):

Операция удаления применяется только к объектам указанного класса и его подклассов. Он не распространяется на связанные сущности.

Каскад удаления работает только в том случае, если вы используете EntityManager.remove() для удаления вашей сущности. Нет, если вы выполняете запрос на удаление.

...