JPA2在同一个类中构造OneToOne和OneToMany

时间:2013-01-17 00:40:50

标签: jpa structure one-to-many one-to-one circular-reference

您能否告诉我您如何构建以下表格/类以避免循环引用?我在“学士”学位课程中定义了以下内容:

@Entity
public class Bachelor {
...
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "fk_bachelor")
    private Study study;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "fk_prior")
    private List<Study> priorStudies;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "fk_exchange")
    private List<Study> exchangeStudies;
...
}

@Entity
class Study {

    private String title;
    private String placeOfStudy;
    etc
...
}

这是代表学士学位,其中有一个学习记录,详细了解学士学位。如果申请人指明他们已完成学士学位,则可以指定一项或多项先前和交换学习。学士学位加上一个学位成绩的一个例子如下:

bachelor

id        |  fk_bachelor

10003     |  10000
study

id        |  title             |  fk_prior

10000     |  Bachelor of Arts  |

10001     |  Prior Degree      |  10003

这似乎工作正常,除非我需要从表中删除项目。我还收到了关于编译器的循环引用的警告。所以我不能先从学士学位中删除,因为学习通过fk_prior引用它,我不能先从学习中删除,因为学士学位引用它。我猜这种结构不是好习惯。

1 个答案:

答案 0 :(得分:0)

学士学位有FK学习和学习有2个FKs到学士学位。不同的JPA提供商将以不同的方式处理这种情况,但您可以通过排除一方来帮助他们。例如,我建议将学士学位课程设为空;打破这个循环将允许在单身汉之前删除研究。一些数据库还允许延迟约束处理直到事务结束,此时所有删除语句都将自己排序。