【问题标题】:Soft Delete : Child Entity not being deleted after Deleting parent Entity in @OneToMany relation in Spring Boot JPA Hibernate软删除:在 Spring Boot JPA Hibernate 中删除 @OneToMany 关系中的父实体后未删除子实体
【发布时间】:2019-07-09 05:12:27
【问题描述】:

我正在尝试在父实体和子实体之间实现软删除,这样删除父实体也会删除其所有子实体。 我的父实体是 User@OneToManyProfile 的关系。 Profile 是使用对 User 的引用创建的。删除 User 工作正常,但在尝试检索引用 UserProfile 时,我得到一个异常。

{
    "title": "Internal Server Error",
    "status": 500,
    "detail": "Unable to find com.user.domain.User with id 951; nested exception is javax.persistence.EntityNotFoundException: Unable to find com.user.domain.User with id 951",
    "path": "/api/profiles",
    "message": "error.http.500"
}

用户.java

@NoArgsConstructor(force = true, access = AccessLevel.PRIVATE)
@EqualsAndHashCode(exclude = {"users"})
@ToString(exclude = {"users"})
@Getter
@JsonDeserialize(builder = Profile.Builder.class)
@Entity
@Table(name = "users")
@SQLDelete(sql="Update users SET deleted = 'true' where id=?")
@Where(clause="deleted != 'true'")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    @Column(name = "password")
    private final String password;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(name = "email")
    private String email;

    @Enumerated(EnumType.STRING)
    @Column(name = "gender")
    private Gender gender;
    
    @OneToMany(mappedBy = "users", cascade = { CascadeType.PERSIST, CascadeType.MERGE }, orphanRemoval = true)
    private Set<Profile> profiles = new HashSet<>();
    
    @Column(name="deleted")
    String deleteFlag;

}

Profile.java

@NoArgsConstructor(force = true, access = AccessLevel.PRIVATE)
@EqualsAndHashCode(exclude = {"users"})
@ToString(exclude = {"users"})
@Getter
@JsonDeserialize(builder = Profile.Builder.class)
@Entity
@Table(name = "profile")
@SQLDelete(sql="Update users SET deleted = 'true' where id=?")
@Where(clause="deleted != 'true'")
public class Profile implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private final Long id;

    @Column(name = "profile_name")
    private final String profileName;

    @Column(name = "date_of_birth")
    private final LocalDate dateOfBirth;

    @Column(name = "health_history")
    private final String healthHistory;
    
    @ManyToOne
    @JoinColumn(name = "users_id")
    @JsonIgnoreProperties("reports")
    private final User users;

    @Column(name="deleted")
    String deleteFlag;
}

【问题讨论】:

  • 删除父实体时如何软删除也会删除其所有子实体。我无法理解您要实现的目标。请编辑帖子并指定您需要的场景.

标签: java spring hibernate spring-boot jpa


【解决方案1】:

个人资料的删除查询有问题

@SQLDelete(sql="Update users SET deleted = 'true' where id=?")

在这里您正在更新用户表。我认为删除用户后您的个人资料没有被删除是一个问题。

【讨论】:

  • 我不敢相信我犯了这个错误。谢谢@Vlad,它现在运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
相关资源
最近更新 更多