【问题标题】:Can't delete child entity without deleting parent entity, regardless of CascadeTypes?无论CascadeTypes如何,都无法在不删除父实体的情况下删除子实体?
【发布时间】:2019-10-02 13:22:54
【问题描述】:

我正在尝试将实体(用户)连接到他们创建的实体,这些实体将是调查。

我有两个存储库,一个 UserRepository 和一个 SurveyRepository。我可以根据哪个用户拥有它们来加载调查,目前它们都由 User_ID 映射,这是调查实体上的一个字段。

但是,当我尝试删除调查时,只要我定义 CascadeType.ALL,就会删除我的用户。

但是当我不使用它时,我收到另一个错误“Caused by: java.sql.SQLIntegrityConstraintViolationException:”

我猜测这都与我使用的密码加密有关,但我什至没有尝试删除用户实体,我只是删除了包含引用或 ID 的调查调查..

我在两边都试过 CascadeType.All,我也试过根本没有任何 CascadeType。如果我在两边都有它,每当我告诉我的surveyRepository.delete(currentSurvey) 时都会删除用户); 每当我在两边都没有它时,我会得到上面的异常..

用户实体:

    @Entity
@Table(name = "user")
public class User {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "user_id")
  private Long id;

  @NotEmpty
  @Email
  @Column(unique = true)
  private String email;
  private String password;

  @NotBlank

  private String username;

  @NotBlank
  private String firstName;

  @NotBlank
  private String lastName;

  @NotBlank private String role;




 @OneToMany(fetch = FetchType.EAGER)
  private Set<Survey> surveys = new HashSet<>();

调查实体:

@Entity
@Table(name = "survey")

public class Survey {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "survey_id")
  private Long id;

  private String title, creator, description;
  private LocalDate date = LocalDate.now();

  @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinColumn(name = "survey_id")

  @OrderBy("position ASC")
  private Set<Question> questions = new HashSet<>();

  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "user_id")
  private User user;

我只是不确定如何告诉 JPA/Hibernate 在我们删除调查时不要触摸用户。

我是否使用 Survvey 保存用户并不重要?

基本上我已经尝试了很多选项,但我认为我并没有完全理解这个问题,我怀疑这是关于用户端的注释,但我仍然觉得我应该能够删除孩子实体完全没有问题,因为我没有接触父实体?

【问题讨论】:

  • 用户和问题之间有什么关系?
  • 尽可能避免使用EAGER fetch type
  • 目前还没有,Survey 是 Question 的父级。然而,问题没有调查变量,除了调查是问题的父项,如上所示。 (效果很好)
  • 尝试使用@ManyToOne(fetch = FetchType.LAZY)
  • 你的意思是调查?这导致“引起:java.sql.SQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(surveydb.user_surveys,CONSTRAINT FK1ckn4igxg4vnml869o238m1qe FOREIGN KEY(surveys_survey_id)参考surveysurvey_id))" "org.springframework.dao.DataIntegrityViolationException: 无法执行语句;SQL [n/a];约束 [null];嵌套异常是 org.hibernate.exception.ConstraintViolationException: 无法执行语句" 上面

标签: spring-boot jpa spring-data-jpa one-to-many many-to-one


【解决方案1】:

这是因为EAGERUser 类中为surveys 提取类型。
您删除了调查,但由于它存在于用户中设置的surveys 上,因此实际上不会被删除。
你需要这样做:

// User class
 @OneToMany(cascade=CascadeType.ALL, orphanRemoval=true, mappedBy="user")
 private Set<Survey> surveys = new HashSet<>();
//Survey class
 @ManyToOne
 @JoinColumn(name = "user_id")
 private User user;

【讨论】:

  • 非常感谢!我想这又回到了这本书上。我不知道 FetchType 可能会产生影响。但这当然也会导致问题,不是吗?在某些情况下,Eager 也会受到青睐,对吧?
  • @harrigaturu 如果需要急切,那么您应该首先从父项的集合中删除子项
  • @harrigaturu 如果有用并解决了问题,您介意解决我的答案吗?
  • 我以为这就是我对surveyRepository.delete(surveyItem); 所做的?是的,对不起,我在这里是菜鸟.. 呵呵
  • @harrigaturu 调查存储库只关心Survey。所以你需要一个服务类来从集合中删除等等。谢谢
猜你喜欢
  • 2021-04-04
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多