我正在开发一个Spring boot应用程序,我正在使用JPA和hibernate。
我遇到了一个问题,即两个实体用户和评估之间的映射关系。
主要思想是通过另一个用户(评估者)评估用户。
User.java
public class User implements Serializable {
private static final long serialVersionUID = 1209816669845063949L;
@Id
@GeneratedValue
private int idUser;
private String login;
private String password;
@ManyToMany(mappedBy = "listUsers")
private List<ProjectGroup> listProjectGroup;
@OneToOne(mappedBy = "EvaluatedUser")
private Evaluation evaluation1;
@OneToOne(mappedBy = "Evaluater")
private Evaluation evaluation;
}
Evaluation.java
public class Evaluation {
@Id
@GeneratedValue
private int idEvaluation;
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "evaluateduser_fk")
private User EvaluatedUser;
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "evaluater_fk")
private User Evaluater;
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "project_fk")
private Project project;
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "notes_fk")
private Notes notes;
}
EvaluationController.java
我正在使用此方法返回所有评估
@GetMapping(path = "all-evaluation", produces = {"application/json" })
public ResponseEntity<List<Evaluation>> getAllEvaluations() {
List<Evaluation> list = evaluationService.findAll();
return new ResponseEntity<List<Evaluation>>(list, HttpStatus.OK);
}
问题是,我不能两次评估同一个用户,我认为问题出在我的关系OneToOne
这是我在返回json时得到的异常:
出现意外错误(类型=内部服务器错误,状态=500)。找到具有给定标识符的多行:1,对于类:com. talan.entity.评估;嵌套异常是org.hibernate.HibernateException:找到具有给定标识符的多行:1,对于类:com.talan.entity.评估
任何帮助都将不胜感激
当保存了多行但hibernate只期望一行时,会发生此错误。在您的情况下,正如您所写的那样,OneToOne不是选择的正确关系,因为这样一来,每个评估器/评估用户只能有一个评估
您希望每个用户都能够多次成为评价用户和评价者。每个评估只有一个用户作为评价用户,一个用户作为评价者。因此,您必须将您的用户实体更改为
@OneToMany(mappedBy = "EvaluatedUser")
private Set<Evaluation> evaluationsEvaluated;
@OneToMany(mappedBy = "Evaluater")
private Set<Evaluation> evaluationsEvaluater;
和您的评估实体来
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "evaluateduser_fk")
private User EvaluatedUser;
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "evaluater_fk")
private User Evaluater;