【问题标题】:JPA2 structuring OneToOne and OneToMany in the same classJPA2 在同一类中构建 OneToOne 和 OneToMany
【发布时间】:2013-01-17 00:40:49
【问题描述】:

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

@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
...
}

这是代表一个学士学位,该学士学位有一个学习记录以获取学士学位的详细信息。如果申请人指定他们已经完成了学士学位,那么他们可以指定一个或多个先前和交换研究。学士学位加上一个先前的学位结果的示例如下:

学士 编号 | fk_单身汉 10003 | 10000 学习 编号 |标题 | fk_prior 10000 |文学学士 | 10001 |学位 | 10003

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

【问题讨论】:

  • 您显示的代码没有任何循环引用。
  • 您已经使用CascadeType.ALL 属性定义了从BachelorStudy@OneToMany 关系,因此当您删除Bachelor 时,所有连接的Study 都将被删除,没有循环引用参与其中。
  • 我正在使用 Postgres 数据库,当我尝试“从单身汉中删除”时出现错误:更新或删除表“单身汉”违反了表“general_details”上的外键约束“fk_general_details_fk_bachelor”详细信息:键 (id)=(10003) 仍然从表“general_details”中引用。从研究中删除导致错误:更新或删除表“研究”违反了表“单身汉”上的外键约束“fk_bachelor_fk_study”详细信息:密钥(id)=(10000)仍然从表“单身汉”中引用。

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


【解决方案1】:

Bachelor 有一个 FK 可以学习,Study 有 2 个 FK 可以学习学士学位。不同的 JPA 提供者会以不同的方式处理此问题,但您可以通过将一侧归零来帮助他们。例如,我建议将本科学习设置为空;打破循环将允许在学士之前取消研究。一些数据库还允许将约束处理延迟到事务结束,此时所有删除语句都将自行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多