不论CascadeTypes如何,都不能在不删除父实体的情况下删除子实体?

时间:2019-05-15 11:48:59

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

我正在尝试将实体(用户)连接到他们创建的实体(将是测量)。

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

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

但是当我不使用它时,会出现另一个错误“由以下原因引起:java.sql.SQLIntegrityConstraintViolationException:”

我猜这与我正在使用的密码加密有关,但是我什至没有试图删除User实体,我只是删除了Survey,该Survey包含参考或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 /休眠状态不要触摸用户。

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

基本上,我尝试了很多选项,但我认为我不太了解这个问题,我怀疑这与用户端的注释有关,但我仍然觉得应该可以删除该子项实体没有问题,因为我没有接触父实体?

1 个答案:

答案 0 :(得分:0)

这是因为EAGER的{​​{1}}类中的User获取类型。
您删除了调查,但是由于它已经存在于用户设置的surveys中,因此它实际上不会被删除。
您需要这样做:

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