我在努力阻止我的关系再摆新table。我试过多种方法来解决这个问题,但似乎每次都有一个错误。例如,当我尝试以下代码时:
//other variables
@OneToMany(fetch = FetchType.LAZY ,cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private List<User> users= new ArrayList<>();
我得到以下错误:
Caused by: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`eb322`.`#sql-3140_2e7`, CONSTRAINT `FK20sqpkpotyyf5wx4jfmp519lu` FOREIGN KEY (`user_id`) REFERENCES `year` (`year_id`))
我已经检查了数据库中的所有表和索引,但在任何地方都找不到此约束。我该如何去移除它。我基本上希望我的模式是这样的:
今年将有一份所有学生、老师的名单。当一个学生被录取时,他们将被加到那一年等等。
如果不添加join列,我只会得到另一个表
一年级学生
我怎么把这些结合在一起。
这是我的学生课以防万一这里出了问题:
public class Student{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private int User_id;
}
如何将数据添加到年份表
//get data about student
Student s = ssrepo.findByName(name);
Year y = yyrepo.findByYear(year);
List<Student> students = y.getStudents();
students.add(s);
yyrepo.save(y)
2条答案
按热度按时间2mbi3lxu1#
你似乎在利用单向的一夫一妻关系
hibernate使用关联表来Map关系,因此当您删除@joincolumn注解时,将创建一个关联表。
由于年份与学生有一对多的关系,所以列表的类型应该是
List<Student>
而不是List<User>
```@OneToMany(fetch = FetchType.LAZY ,cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private List users= new ArrayList<>();
public class Year {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "YEAR_ID")
private Long id;
@Column(name = "TYPE_ID")
private Long typeId
@Column(name = "TYPE")
private Boolean type // 1 or 0 to know if typeId is of student or teacher
@Column(name = "YEAR")
private Date year
@OneToMany(mappedBy="typeId", fetch = FetchType.LAZY ,cascade = CascadeType.ALL)
private List students;
@OneToMany(mappedBy="typeId", fetch = FetchType.LAZY ,cascade = CascadeType.ALL)
private List teachers;
}
public class Teacher{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "TEACHER_ID")
private Long id;
@ManyToOne
@JoinColumn(name="TYPE_ID", nullable=false)
private Year typeId;
}
public class Student{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "STUDENT_ID")
private Long id;
@ManyToOne
@JoinColumn(name="TYPE_ID", nullable=false)
private Year typeId;
}
33qvvth12#
有两种方法可以做到这一点。第一种是双向的。在这两个实体中进行Map。在这个链接中(https://dzone.com/articles/introduction-to-spring-data-jpa-part-4-bidirection)哈瓦就是一个例子。
mappedby是说谁是这段关系的主导者。在这种情况下,myclass的关系最强。
我相信这是最好的办法,因为她的现实在两个实体中都是显而易见的。有一种方法是单向的。链接中的示例(如何在jpa中定义单向的one-omany关系)