spring 在@OneToMany关系中的Sping Boot 中软删除子实体时出现问题,将null id设置为默认值

avkwfej4  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(148)

我尝试在父实体和子实体之间实现软删除,当它实现双向时,它可以像双向一样工作,但当它实现单向时,它设置了一个空id引用。

User.java

  1. @Getter
  2. @Setter
  3. @Entity
  4. @Builder
  5. @AllArgsConstructor
  6. @NoArgsConstructor
  7. @Table(name = "user")
  8. @SQLDelete(sql = "UPDATE user SET is_deleted = true WHERE id = ? and version = ? " )
  9. @Where(clause = "is_deleted = false")
  10. public class User extends AbstractBaseModel {
  11. private String firstName;
  12. private String lastName;
  13. private String email;
  14. .
  15. .
  16. .
  17. @OneToMany(mappedBy = "task", cascade = CascadeType.ALL)
  18. private List<Tasks> tasks;
  19. }

字符串

Task.java

在用户和任务之间存在双向引用

  1. @Getter
  2. @Setter
  3. @Entity
  4. @Builder
  5. @AllArgsConstructor
  6. @NoArgsConstructor
  7. @Table(name = "task")
  8. @SQLDelete(sql = "UPDATE task SET is_deleted = true WHERE id = ? and version = ? " )
  9. @Where(clause = "is_deleted = false")
  10. public class Task extends AbstractBaseModel {
  11. private String taskName;
  12. private String lastState;
  13. .
  14. .
  15. .
  16. @ManyToOne(fetch = FetchType.LAZY)
  17. private User user;
  18. @OneToMany(cascade = CascadeType.ALL)
  19. @JoinColumn(name = "task_id", referencedColumnName = "id")
  20. private List<TaskHistory> taskHistory;
  21. }

TaskHistory.java

这里没有引用在任务和任务历史记录之间有单向引用

  1. @Getter
  2. @Setter
  3. @Entity
  4. @Builder
  5. @AllArgsConstructor
  6. @NoArgsConstructor
  7. @Table(name = "task_history")
  8. @SQLDelete(sql = "UPDATE task_history SET is_deleted = true WHERE id = ? and version = ? " )
  9. @Where(clause = "is_deleted = false")
  10. public class TaskHistory extends AbstractBaseModel {
  11. private String state;
  12. .
  13. .
  14. .
  15. }


当使用JPA删除用户时,如下所示

  1. userRepository.deleteById(id);


它运行了四个查询

  1. Hibernate: update task_history set task_id=null where task_id=? and ((is_deleted = false) )
  2. Hibernate: UPDATE task_history SET is_deleted = true WHERE id = ? and version = ?
  3. Hibernate: UPDATE task SET is_deleted = true WHERE id = ? and version = ?
  4. Hibernate: UPDATE user SET is_deleted = true WHERE id = ? and version = ?


不希望第一个查询。当设置task_id=null时,无法返回第一种情况

sgtfey8w

sgtfey8w1#

我用下面的代码解决了我的问题@JoinColumn(name =“task_id”,referencedColumnName =“id”,nullable = false)当删除用户休眠不能设置null时

相关问题