2

A と B の 1 対 1 の関係を持つ 2 つのエンティティがあります。B エンティティはオプションであり、単独で更新および削除できますが、常に A のインスタンスにリンクする必要があります。

したがって、双方向の関係を持つ2つのJPAエンティティAとBがあります。これはAからBへのものです。

@OneToOne(mappedBy = "a", fetch = FetchType.LAZY, cascade = CascadeType.ALL)

A と B を作成し、A を削除すると、両方とも削除されます。良い。

しかし、A から B へのカスケードのため、iem.remove(b)の場合、削除は永続化されません。私がa.setB(null)最初にやったとしても。

カスケードを維持しながらオプションのエンティティを削除する唯一の方法は、新しい JPA2 機能である orphanRemoval=true を使用することのようです。を呼び出しa.setB(null)てから、A を永続化します。

これは、B に対して直接操作を実行できないことを意味します。構成関係が強すぎることを意味し、B に対するすべてのアクションは A を介して実行する必要があります。

しかし、B は埋め込みオブジェクトではなく、それ自体が本格的なエンティティです。A とは別に削除するにはどうすればよいですか?

最善の方法は、カスケードを削除し、A? B テーブルの FK 制約によって適用されます。

これはとても簡単なケースです。2 つの関連するエンティティの場合、一方の関係はオプションであり、他方の関係は必須です。

ああ、これは休止状態の 4.2.3-Final です

4

1 に答える 1

1

現在のオブジェクト設計では、あるオブジェクトが別のオブジェクトよりも重要であることが暗黙のうちに定義されています。つまり、一方は他方への外部キーを持ちます。

それらを等しくするには、それらの間に JoinTable を定義するだけです。両側でカスケードを設定すると、すべてが期待どおりに機能します。

例:

ドキュメント クラス

@Entity
public class Document extends ABaseEntity {

private Medicine medicine;

@OneToOne(cascade = CascadeType.REMOVE)
@JoinTable(
        name = "Document_Medicine",
        joinColumns =
        @JoinColumn(name = "DOC_ID", referencedColumnName = "ID"),
        inverseJoinColumns =
        @JoinColumn(name = "MED_ID", referencedColumnName = "ID"))
public Medicine getMedicine() {
    return medicine;
}

public void setMedicine(Medicine medicine) {
    this.medicine = medicine;
}
}

医学クラス

@Entity
public class Medicine extends ABaseEntity{
private Document document;

@OneToOne(mappedBy = "medicine", cascade = CascadeType.REMOVE)
public Document getDocument() {
    return document;
}

public void setDocument(Document document) {
    this.document = document;
}
}
于 2016-08-11T12:37:53.370 に答える