1

Employee、Boss、Address の 3 つのテーブルがあります。

この場合、Employee と Boss は同じ Address を共有します。Employee で EntityManager.remove を呼び出すと、Boss がまだ必要としているために削除できない Address を削除しようとするため、Integrity Constraint 例外が発生します。誰もアドレスを使用していない場合は、アドレスを削除したいと思います。Address からオーファンを削除し、整合性制約を回避できるようにするには、注釈をどのように表示する必要がありますか?

例外 =

Internal Exception: java.sql.SQLIntegrityConstraintViolationException: DELETE on
table 'Employee' caused a violation of foreign key constraint 'Boss....

コード =

public class Employee {
@OneToMany(targetEntity = Address.class, orphanRemoval = true,cascade = {
    CascadeType.ALL 
} fetch=FetchType.EAGER)
@JoinTable(name = "Employee_Address")
@XmlElement(required = true)
@OrderColumn
protected List<Address> addresses;

}
public class Boss {

 @OneToMany(targetEntity = Address.class, orphanRemoval = true, cascade = {
    CascadeType.ALL 
}fetch=FetchType.EAGER)
@JoinTable(name = "Boss_Address")
@XmlElement(required = true)
@OrderColumn
protected List<Address> addresses;
}

Address クラスは、上司や従業員について何も知りません。

4

2 に答える 2

0

あなたの注釈は正しいです。Employee を削除すると、その Addresses を削除しようとします。

ただし、両方が同じアドレスを使用している場合、削除は失敗します。

このシナリオでは、CasacadeType.DELETE または CasacadeType.ALL を使用せずにカスケード オプションのリストを使用し、プログラムで問題を解決します。

また、これで orphanRemoval を使用しないでください。JPA 2.0 仕様のセクション 2.9 を参照してください。

リレーションシップのターゲットであるエンティティがリレーションシップから削除された場合 (リレーションシップを null に設定するか、リレーションシップ コレクションからエンティティを削除することによって)、孤立しているエンティティに削除操作が適用されます。remove 操作は、flush 操作時に適用されます。orphanRemoval 機能は、親エンティティによって非公開で「所有」されているエンティティを対象としています。それ以外の場合、移植可能なアプリケーションは特定の削除順序に依存してはならず、孤立したエンティティを別の関係に再割り当てしたり、永続化しようとしたりしてはなりません。孤立しているエンティティが切り離された、新しい、または削除されたエンティティである場合、orphanRemoval のセマンティクスは適用されません。

削除操作が管理対象のソース エンティティに適用される場合、削除操作はセクション 3.2.3 の規則に従って関係ターゲットにカスケードされます (したがって、関係に cascade=REMOVE を指定する必要はありません)。

于 2013-07-18T02:16:55.690 に答える