我正在尝试将实体(用户)连接到他们创建的实体(将是测量)。
我有两个存储库,一个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保存用户并不重要?
基本上,我尝试了很多选项,但我认为我不太了解这个问题,我怀疑这与用户端的注释有关,但我仍然觉得应该可以删除该子项实体没有问题,因为我没有接触父实体?
答案 0 :(得分:0)
这是因为EAGER
的{{1}}类中的User
获取类型。
您删除了调查,但是由于它已经存在于用户设置的surveys
中,因此它实际上不会被删除。
您需要这样做:
surveys
// User class
@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true, mappedBy="user")
private Set<Survey> surveys = new HashSet<>();