2017-03-28 16 views
0

1つのエンティティ(親である)に2つの列と、他のエンティティで4つの列を持つ複合主キー私は親の複合主キーの2つの列を参照して複合主キーの一部である子の2列を持つ外部キーを作成したい。子供の列は主キーの一部です私はそれを作ることができません "insertable = false、updatable = false" 次に、プライマリキーがnull例外になることはありません。主キー(EclipseLINK)の一部である複合外部キーとの関係

@Entity 
@IdClass (MyKey.class) 
@Table (name = "Child_Table") 
public class Child { 
    @Id 
    @XmlElement (name = "C_feild1", required = true) 
    protected String C_feild1; 
    @Id 
    @XmlElement (name = "C_feild2", required = true) 
    protected String C_feild2; 
    @Id 
    @XmlElement (name = "C_feild3", required = true) 
    protected String C_feild3; 
    @Id 
    @XmlElement (name = "C_feild4", required = true) 
    protected String C_feild4; 

    //getters and setters 
} 


@Entity 
@IdClass (MyKey2.class) 
@Table (name = "Parent_Table") 
public class Parent { 
    @Id 
    @CascadeOnDelete 
    @XmlElement (name = "P_feild1", required = true) 
    protected String P_feild1; 
    @Id 
    @XmlElement (name = "P_feild2", required = true) 
    protected String P_feild2; 

    //getters and setters 
} 

は、私はちょうど下記のように、これらのエンティティ間での関係を作成したい

のALTER TABLE Child_Table のADD CONSTRAINT fk_child_table_parent_table FOREIGN KEY(C_field1C_field2)DELETE ON REFERENCES Parent_TableP_field1P_field2) カスケード;

テーブルを個別に更新できるようにし、親が削除されたときに子ローを削除します。

+0

EclipseLinkのCascadeOnDeleteをJPAに他の行/エンティティを削除する必要があることを伝えていないため、基本的なマッピングが必要です。あなたはそれを使用できるように、親と子の関係を設定する必要があります。 https://www.eclipse.org/eclipselink/documentation/2.5/jpa/extensions/a_cascadeondelete.htm – Chris

答えて

0

親エンティティを削除するときに何が行われる必要があるかをJPAで知る必要がある場合は、エンティティ間の関係を設定する必要があります。

これは次のように動作します:

@Embeddable 
public class ChildKey { 
    protected String C_feild3; 
    protected String C_feild4; 
    protected MyKey2 parentKey; 
} 

public class Child { 
    @EmbeddedId 
    ChildKey id; 

    @MapsId("parentKey") 
    @JoinColumns({ 
     @JoinColumn(name="C_feild1", referencedColumnName="P_field1"), 
     @JoinColumn(name="C_feild2", referencedColumnName="P_field2") 
    }) 
    protected Parent parent; 

    //getters and setters 
} 

@Entity 
@IdClass (MyKey2.class) 
@Table (name = "Parent_Table") 
public class Parent { 
    @Id 
    protected String P_feild1; 
    @Id 
    protected String P_feild2; 

    @OneToMany(mappedby="parent") 
    @CascadeOnDelete 
    List<Child> children; 

    //getters and setters 
} 

これは、あなたがXML用に使用しているフラットな性質を無視しますので、あなたが対処したいものではないかもしれません。

フラットオブジェクトを保持したい場合、JPAは親子関係について何も知らないが、本当にどちらかを必要としない。共有キャッシュから削除された子インスタンスをクリーンアップするか、ここで説明するように子クラスの共有キャッシュを有効にしないでください: https://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

関連する問題