Spring JPA 停止创建新的 table 关系

Spring JPA stop creating a new table with relationship

我正试图阻止我的关系产生新的 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`))

我已经检查了数据库中所有的 table 和索引,但我在任何地方都找不到这个约束。我该如何删除它。我基本上希望我的模式是这样的:

如果我不添加连接列,我只会得到另一个 table 说法

如何将它们组合在一起。

这是我的学生class,以防这里有问题:

public class Student{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private int User_id;
}

我如何将数据添加到年份 table

//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)

您似乎在使用单向一对多关系

Hibernate 使用关联 table 来映射关系,因此当您删除 @JoinColumn 注释时,会创建一个关联 table。

由于Year和student是一对多的关系,List的类型应该是List<Student>而不是List<User>

@OneToMany(fetch = FetchType.LAZY ,cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private List<Student> 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<Student> students;

@OneToMany(mappedBy="typeId", fetch = FetchType.LAZY ,cascade = CascadeType.ALL)
private List<Teacher> 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;

}

有两种方法可以做到这一点。第一个是双向的。在两个实体中进行映射的位置。在这个 link.(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;
}

我认为这是最好的方式,因为她的现实在两个实体中都很明显。有一种方法可以以单向方式进行。例如 link (How to define unidirectional OneToMany relationship in JPA)