Jpa 使用带有外键和多个关系的@Embedable

Jpa 使用带有外键和多个关系的@Embedable,jpa,foreign-keys,persistence,jpa-2.0,entities,Jpa,Foreign Keys,Persistence,Jpa 2.0,Entities,我为我试图实现的代码编写了一个示例,我发现约束“Student\u Teacher\u FK”的错误已经存在 @embiddable类有一个使用当前代码创建两次的外键 @Entity public class Teacher { @Id @GeneratedValue private Long id; @Column(name = "Name") private String name; } @Entity public class Student

我为我试图实现的代码编写了一个示例,我发现约束“Student\u Teacher\u FK”的错误已经存在

@embiddable类有一个使用当前代码创建两次的外键

@Entity
public class Teacher {

    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "Name")
    private String name;

}

@Entity
public class Student{

    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "Name")
    private String name;

}

@Embeddable
public class StudentList implements Serializable {

    @ManyToMany
    @JoinTable(name = "Student_Teacher",
            joinColumns =
            @JoinColumn(name = "Student_ID", referencedColumnName = "ID"),
            inverseJoinColumns =
            @JoinColumn(name = "Teacher_ID", referencedColumnName = "ID")
    )
    @ForeignKey(name = "Student_Teacher_FK", inverseName = "Teacher_Student_FK")
    public List<Student> studentList = new ArrayList<Student>();

}

@Entity
public class HistoryTeacher extends Teacher {
   @Embedded
   @NotNull
   private StudentList StudentList = new StudentList ();   
}

@Entity
public class LangTeacher extends Teacher {
   @Embedded
   @NotNull
   private StudentList StudentList = new StudentList ();    
}

@Entity
public class RetiredTeacher extends Teacher {
    // has no students
}
@实体
公共班主任{
@身份证
@生成值
私人长id;
@列(name=“name”)
私有字符串名称;
}
@实体
公立班学生{
@身份证
@生成值
私人长id;
@列(name=“name”)
私有字符串名称;
}
@可嵌入
公共类StudentList实现了可序列化{
@许多
@JoinTable(name=“学生\教师”,
连接柱=
@JoinColumn(name=“Student\u ID”,referencedColumnName=“ID”),
反向连接柱=
@JoinColumn(name=“Teacher\u ID”,referencedColumnName=“ID”)
)
@外键(name=“Student\u Teacher\u FK”,inverseName=“Teacher\u Student\u FK”)
public List studentList=new ArrayList();
}
@实体
公开课历史教师扩展教师{
@嵌入
@NotNull
private StudentList StudentList=新StudentList();
}
@实体
公共课教师延伸教师{
@嵌入
@NotNull
private StudentList StudentList=新StudentList();
}
@实体
公共班级退休教师扩展教师{
//他没有学生
}

@embeddeble:定义一个类,其实例存储为所属实体的固有部分,并共享该实体的标识()
当您在2个不同的实体中声明它时,jpa将使用显式命名的关联fk创建关联关联表(学生教师)2次,并使用相同的名称创建2次。这是你的错误


我认为使用@embeddeble并不适合您打算做的事情。学生有自己的存在,不是教师本身的一部分(不是uml组合/黑钻石),因此它不是一个可嵌入的实体。学生名单应由教师实体使用简单的多人关联持有。

Hi-Gab,那么您建议每个扩展教师的班级与学生建立多对多关系?你能解释一下你的建议吗?谢谢。嗯,我想老师可能总是有一份相关学生的名单。退休的学生只会有一个空的名单,因为没有学生会与之有任何关联。我真的不知道该怎么解释。你选择了什么样的继承策略?这只是一个演示代码,退休老师的意思是不能有学生名单。。。我现在无法更改继承关系图,如果我将关系添加到教师类,它会很好地工作,但我必须阻止某些子类拥有列表…在这种情况下,每个具体类都必须在需要时定义关系。同样,所有这些都取决于您的业务和您选择的继承策略(),但对于您给出的示例,正确的解决方案是将这种关系放在家长教师中。