3

リレーションで PERSIST カスケード タイプが使用されている場合、所有者側または相手側でエンティティを保存することに違いはありますか?

@Entity
public class Slot {
    @OneToOne(mappedBy = "slot", cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    private Cartridge cartridge;
}

@Entity
public class Cartridge {
    @OneToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    private Slot slot;
}

質問:

slot.setCartridge(cartridge);
slot.save();

対。

cartridge.setSlot(slot)
cartridge.save();

slot.save() またはカートリッジ.save() は同じではないようです...

両方のエンティティが既に保存されています。それらの間の関係を設定したかっただけです。

4

3 に答える 3

1

カートリッジは関係を所有します。つまり、ほとんどのプロバイダーで外部キーを更新するには、cardic.slot値を設定する必要があります。JPA仕様では、双方向の関係の両側を維持して、データベース内の情報との同期を維持する必要があることも規定されています。したがって、setCartridgeが関係の反対側も設定していない場合は、次にカートリッジを読み取るときに、スロットが設定されていない可能性があります。JPAは、古いEJB仕様からリレーションシップの保守を廃止し、エンティティを可能な限り通常のJavaオブジェクトのように動作させるようにしました。

次のように呼び出す必要があります。

slot.setCartridge(cartridge);
cartridge.setSlot(slot)

次に、スロットまたはカートリッジのいずれかに保存します。マージは参照されているオブジェクトにいずれかの方向でカスケードされるため、重要ではありません。

于 2012-11-22T15:53:04.650 に答える
0

私の意見では、1つの違いがあります。親オブジェクトを使用してエンティティを保存すると、最初に親エンティティが挿入され、次に子を保存する前に生成されたキーが子に割り当てられます。

子エンティティを最初に保存した場合とは異なります。

于 2012-11-22T14:36:26.680 に答える