Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA多对多级联删除_Java_Jpa_Many To Many_Toplink - Fatal编程技术网

Java JPA多对多级联删除

Java JPA多对多级联删除,java,jpa,many-to-many,toplink,Java,Jpa,Many To Many,Toplink,我刚开始使用netbeans IDE使用JEE6,现在我正在学习使用toplink的JPA。 我正在使用Netbeans IDE和mySQL 我创建了两个非常简单的表,具有多对多关系: table student int id PK varchar name table teacher int id PK varchar name //the mapping table studentTeacher int studentID FK int teacherID FK studentTeac

我刚开始使用netbeans IDE使用JEE6,现在我正在学习使用toplink的JPA。 我正在使用Netbeans IDE和mySQL

我创建了两个非常简单的表,具有多对多关系:

table student
int id PK
varchar name

table teacher
int id PK
varchar name

//the mapping
table studentTeacher
int studentID FK
int teacherID FK
studentTeacher表将学生id映射到教师id,并在删除和更新时进行级联

我使用了“从数据库生成实体”netbeans功能,它工作得很好: 我可以将学生对象添加到我的学生表中,也可以将教师对象添加到我的教师表中

问题是,我如何创建一个“学生教师”实体并保持它?还是IDE已经完成了

以下是从Netbeans自动生成的注释:

 //Student Entity annotation generated by Netbeans 7.0.1

 @Id
 @Basic(optional = false)
 @NotNull
 @Column(name = "id")
 private Integer id;
 @Size(max = 40)
 @Column(name = "name")
 private String name;
 @JoinTable(name = "studentTeacher", joinColumns =
 {
    @JoinColumn(name = "studentID", referencedColumnName = "id")
 }, inverseJoinColumns =
 {
    @JoinColumn(name = "teacherID", referencedColumnName = "id")
 })
 @ManyToMany
 private Collection<Teacher> teacherCollection;
//由Netbeans 7.0.1生成的学生实体注释
@身份证
@基本(可选=假)
@NotNull
@列(name=“id”)
私有整数id;
@尺寸(最大值=40)
@列(name=“name”)
私有字符串名称;
@JoinTable(name=“studentTeacher”,JointColumns=
{
@JoinColumn(name=“studentID”,referencedColumnName=“id”)
},反向连接列=
{
@JoinColumn(name=“teacherID”,referencedColumnName=“id”)
})
@许多
私人收藏教师收藏;

谢谢

正确地说,它已经由JPA实现完成了,在您的例子中是:TopLink。您不需要
StudentTeacher
实体,因为它本身不是一个实体,它只是实体关系方案所需的一个辅助表,用于建模多对多关系

如果您的
学生
教师
之间的关系除了两个实体的外键之外还有其他属性,那么您将需要一个额外的实体,但您已经存在的实体(
学生
教师
)将不再具有多对多关系,而是一对多/多对一的中介
学生教师
实体


我的建议是,如果您的模型像您的示例中那样简单,请保持原样。

正确地说,在您的例子中,JPA实现已经完成了:TopLink。您不需要
StudentTeacher
实体,因为它本身不是一个实体,它只是实体关系方案所需的一个辅助表,用于建模多对多关系

如果您的
学生
教师
之间的关系除了两个实体的外键之外还有其他属性,那么您将需要一个额外的实体,但您已经存在的实体(
学生
教师
)将不再具有多对多关系,而是一对多/多对一的中介
学生教师
实体


我的建议是,如果您的模型像您的示例中那样简单,请保持原样。

太好了,但是如何填充studentTeacher表?在这种情况下,真正重要的是该表提供的映射。我很困惑,现在买一本书。你需要仔细处理映射多对多关系的列表,因此,如果你向你的
Student
实体添加
Teacher
,那么确保你也将
Student
实例添加到前面提到的
Teacher
。当您调用
EntityManager.persist(student)
EntityManager.persist(teacher)
(与任何其他方法相同)时,JPA将执行中间表的“填充”。谢谢,我将尝试并从头开始JPA。我为该学生创建了一个学生和一个教师数组列表,坚持学生。中间表自动填充,无需将学生添加到每个教师中(我不确定是否理解您的评论)。如果您在单个操作中这样做,这很好,但如果您的关系是双向的,并且您正在独立处理实体,您可能需要刷新它的
Teacher
端或执行新的查询。我的意思是JPA将填充中间表,但不会填充关系另一端的列表,除非您通过刷新或新查询请求。很好,但是我如何填充studentTeacher表?在这种情况下,真正重要的是该表提供的映射。我很困惑,现在买一本书。你需要仔细处理映射多对多关系的列表,因此,如果你向你的
Student
实体添加
Teacher
,那么确保你也将
Student
实例添加到前面提到的
Teacher
。当您调用
EntityManager.persist(student)
EntityManager.persist(teacher)
(与任何其他方法相同)时,JPA将执行中间表的“填充”。谢谢,我将尝试并从头开始JPA。我为该学生创建了一个学生和一个教师数组列表,坚持学生。中间表自动填充,无需将学生添加到每个教师中(我不确定是否理解您的评论)。如果您在单个操作中这样做,这很好,但如果您的关系是双向的,并且您正在独立处理实体,您可能需要刷新它的
Teacher
端或执行新的查询。我的意思是JPA将填充中间表,但不会填充关系另一端的列表,除非您通过刷新或新查询请求。