软删除不会传播到 Spring Boot JPA 中的子实体

问题描述 投票:0回答:1

我想在我的 Spring Boot 项目中实现软删除,该项目具有 @OneToOne@OneToMany 关系。每当我软删除父实体时,软删除也应该传播到子实体。此外,我还想将删除原因存储在父实体中。我已尝试使用下面的代码,但软删除不会传播到子实体。我也无法使用 @SQLDelete,因为我的删除操作中有两个参数。

@Entity
@Table(name="personal_details")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class PersonalDetail extends Auditable<String> implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private String idNo;

    private String gender;

    private String name;

    // If the record has been soft-deleted
    private Boolean deleted;

    // Storing the reason why the record was deleted
    private String deletionReason;

    // For Address
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id_no", referencedColumnName = "idNo")
    private Address address;

    // For Devices Received
    @JsonManagedReference
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "personalDetail", cascade = CascadeType.ALL)
    private List<DevicesReceived> devicesReceivedList;

    // For Devices Required
    @JsonManagedReference
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "personalDetail", cascade = CascadeType.ALL)
    private List<DevicesRequired> devicesRequiredList;

    // For Benefits
    @JsonManagedReference
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "personalDetail", cascade = CascadeType.ALL)
    private List<Benefit> benefitList;
}
@Entity
@Table(name = "address")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Address extends Auditable<String> implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    private String idNo;

    private String address;

    // If the record has been soft-deleted
    private Boolean deleted;
}
@Entity
@Table(name="devices_received")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class DevicesReceived extends Auditable<String> implements Serializable {
    private static final long serialVersionUID = 1L;

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

    private String idNo;

    private String device;

    @JsonBackReference
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "personal_details_id_no", nullable = false)
    private PersonalDetail personalDetail;

    // If the record has been soft-deleted
    private Boolean deleted;
}
@Repository
public interface PersonalDetailRepository extends JpaRepository<PersonalDetail, String> {

    @Transactional
    @Modifying
    @Query(nativeQuery = true, value = "UPDATE personal_details SET deleted = TRUE, deletion_reason = (?2) WHERE id_no = (?1);")
    void delete(String idNo, String deletionReason);

}
spring-boot hibernate jpa join soft-delete
1个回答
0
投票

就 Hibernate 而言,您的删除不是删除,而只是

update
,因此不必将此操作传播到关联的实体。我建议您考虑使用 Hibernate 的开箱即用的软删除

另外,不要将 Lombok 的

@Data
用于实体,它会隐式生成使用字段关联的 equals/hashcode,并可能导致意外行为。

© www.soinside.com 2019 - 2024. All rights reserved.