SpringJPA停止创建具有关系的新表

wfypjpf4  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(355)

我在努力阻止我的关系再摆新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)
2mbi3lxu

2mbi3lxu1#

你似乎在利用单向的一夫一妻关系
hibernate使用关联表来Map关系,因此当您删除@joincolumn注解时,将创建一个关联表。
由于年份与学生有一对多的关系,所以列表的类型应该是 List<Student> 而不是 List<User> ```
@OneToMany(fetch = FetchType.LAZY ,cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private List users= new ArrayList<>();

由于性能问题,通常不建议使用onetomany单向关联。您可以考虑使用双向关联。应该是这样的

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;

}

33qvvth1

33qvvth12#

有两种方法可以做到这一点。第一种是双向的。在这两个实体中进行Map。在这个链接中(https://dzone.com/articles/introduction-to-spring-data-jpa-part-4-bidirection)哈瓦就是一个例子。

public class MyClass {

        @OneToMany(mappedBy = "myClass", fetch = FetchType.LAZY, 
         cascade = CascadeType.ALL, orphanRemoval = true)
        @JoinColumn(name = "user_id")
        private List<User> users;
}

mappedby是说谁是这段关系的主导者。在这种情况下,myclass的关系最强。

public class Student{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    private int id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private MyClass myClass;
}

我相信这是最好的办法,因为她的现实在两个实体中都是显而易见的。有一种方法是单向的。链接中的示例(如何在jpa中定义单向的one-omany关系)

相关问题