【问题标题】:using @Embedabble with a foreign key and manyToMany relation使用带有外键和多对多关系的 @Embedabble
【发布时间】:2013-04-02 11:25:36
【问题描述】:

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

【问题讨论】:

    标签: jpa foreign-keys persistence jpa-2.0 entities


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,Gab,所以您建议每个扩展教师的课程与学生有多对多的关系?你能解释一下你的建议吗?谢谢。
    • 好吧,我想老师可能总是有一个相关学生的列表。退休人员只会有一个空列表,因为不再有学生与之相关联。我真的不知道如何解释更多。你选择了什么样的继承策略?
    • 这只是一个演示代码,退休老师的意思是不能有学生列表...我现在无法更改继承图,如果我将关系添加到教师类,它会很好用,但我必须阻止某些子类拥有列表...
    • 在这种情况下,每个具体类都必须在需要时定义关系。同样,所有这一切都取决于您的业务和您选择的继承策略 (openjpa.apache.org/builds/1.0.0/apache-openjpa-1.0.0/docs/…) 但是对于您给出的示例,正​​确的解决方案是将关系放在父老师中。
    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    相关资源
    最近更新 更多