当前位置: 首页 > 知识库问答 >
问题:

Spring JPA停止创建具有关系的新表

司徒俊雄
2023-03-14

我正试图阻止我的关系重新开始。我尝试了多种方法来解决这个问题,但似乎每次都有一个错误。例如,当我尝试以下代码时:

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

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

  • 今年将有一份所有学生、老师的名单。当学生注册时,他们将被添加到该学年中

如果我不添加连接列,我只是得到另一个表说

  • Year.students

我如何将这些结合在一起。

这是我的学生课,以防万一这里出了什么问题:

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个答案

吉嘉珍
2023-03-14

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

地图显示是说谁是关系中的主导者。在这种情况下,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中的例子(如何在JPA中定义单向OneTo很多关系)

翁鸿远
2023-03-14

你似乎在使用单向的一对一关系

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

由于年与学生有一对多的关系,列表的类型应该是列表

@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;

}

 类似资料:
  • 本文向大家介绍Django 创建具有关系的模型,包括了Django 创建具有关系的模型的使用技巧和注意事项,需要的朋友参考一下 示例 多对一关系 最通用的选项。可以在您想要代表任何关系的任何地方使用 多对多关系 在内部,这是通过另一个表表示的。并ManyToManyField应放在将在表单上进行编辑的模型上。例如:Appointment将具有ManyToManyField被叫Customer,Pi

  • 我需要创建一个新的A类节点,它与User节点有关系: 现在,假设我们有新节点A的以下数据: 我试图创建节点A,使新节点A与具有“id”:4和“nodeId”:“0002-0002”(唯一节点标识符)的用户的(现有)节点之间具有关系,但用户节点将字段“name”和“firstName”更新为。 我正在使用GraphRespository代理创建它: 有没有办法不进行此更新,只与用户节点建立关系?

  • 问题内容: 假设我有两个表:Store和Product。我希望我的商店有产品清单。我怎样才能做到这一点? 我开始这样的事情,但是我不知道该如何完成,你们能帮我吗? 问题答案: 多对一(产品只能有一家商店) 多对多(产品可以在许多商店中使用)

  • 假设我在前面有一个表单,它有常用的字段和下拉列表。在这些下拉列表中,用户可以选择一个选项,并且每个选项都链接到Spring data JPA中的一个实体; 下拉列表包含一些标签和对应实体的链接作为值。然后,这个值在POST-request中传递给我们希望创建的实体的PagingAndSorting存储库。 假设它是一个具有username的用户,并且他必须与其中一个办公室(也是一个实体)关联: 我

  • 我正在使用Spring MVC/Security/JPA/Hibernate开发一个web应用程序。 我有一个用户类,它与UserRole有一个omany关系。 UserRole类与用户之间有很多关系。 用户存储库界面非常简单。 当我使用下面的代码片段使用存储库加载用户信息时,它会很好地检索用户和用户角色数据。 这是日志文件。 然而,问题出在这里。 如果我使用UserRepository的save

  • 我尝试用Spring Boot Jpa自动创建表,但它不起作用,它不执行任何sql查询。我怀疑这是由于一个人或多个人的关系。我查了一下网站,但没能找到一个有类似问题的问题。Spring不执行任何查询和创建任何表。 用户可以创建很多帖子,每个帖子都有很多评论等等。 post.java 注释.java topic.java 我错在哪里?谢谢你!