【发布时间】: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 保存用户并不重要?
基本上我已经尝试了很多选项,但我认为我并没有完全理解这个问题,我怀疑这是关于用户端的注释,但我仍然觉得我应该能够删除孩子实体完全没有问题,因为我没有接触父实体?
【问题讨论】:
-
用户和问题之间有什么关系?
-
尽可能避免使用
EAGERfetch type -
目前还没有,Survey 是 Question 的父级。然而,问题没有调查变量,除了调查是问题的父项,如上所示。 (效果很好)
-
尝试使用@ManyToOne(fetch = FetchType.LAZY)
-
你的意思是调查?这导致“引起:java.sql.SQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(
surveydb.user_surveys,CONSTRAINTFK1ckn4igxg4vnml869o238m1qeFOREIGN KEY(surveys_survey_id)参考survey(survey_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