0

循環参照を避けるために、次のテーブル/クラスをどのように構成するか教えてください。私は「学士」の学位クラスで次のように定義しています。

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

これは、学士号の詳細について1つの研究レコードを持つ学士号を表すためのものです。申請者が学士号を取得したことを指定した場合は、1つ以上の事前調査と交換調査を指定できます。学士号と1つの以前の学位の結果の例は次のとおりです。

学士

id | fk_bachelor

10003 | 10000
勉強

id | タイトル| fk_prior

10000 | 文学士|

10001 | 事前学位| 10003

テーブルからアイテムを削除する必要がある場合を除いて、これは正常に機能しているようです。また、コンパイラから循環参照があることについての警告を受け取りました。したがって、Studyがfk_priorによって参照しているため、最初に学士号から削除することはできません。また、学士号が参照しているため、Studyから最初に削除することはできません。このように構成するのは良い習慣ではないと思います。

4

1 に答える 1

0

学士号には研究するFKがあり、研究には学士号に2つのFKがあります。異なるJPAプロバイダーはこれを異なる方法で処理しますが、一方を無効にすることでそれらを支援できます。たとえば、学士号をnullに設定することをお勧めします。サイクルを壊すと、学士号の前に研究を削除することができます。一部のデータベースでは、すべてのdeleteステートメントが整理されたトランザクションが終了するまで制約処理を遅らせることもできます。

于 2013-01-17T12:16:46.793 に答える