0

我为我试图实现的代码编写了一个示例,我收到一个错误,约束“Student_Teacher_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
}
4

1 回答 1

1

@embeddable :定义一个类,其实例存储为拥有实体的固有部分并共享实体的身份(http://docs.oracle.com/javaee/6/api/javax/persistence/Embeddable.html
当您在 2 个不同的实体中声明它时,jpa 将使用明确命名的关联 fk 创建关联的关联表(学生-教师)2 次,因此也使用相同的名称创建 2 次。这是你的错误。

我不认为使用 @embeddable 适合您打算做的事情。学生有自己的存在,而不是老师本身的一部分(不是 uml 组合/黑色菱形),因此它不是可嵌入的实体。学生列表应该由教师实体使用简单的多对多关联来保存。

于 2013-04-02T13:06:03.607 回答