2017-11-27 23 views
0

継承を使用してレコードを削除することができますか? Entity Managerをオブジェクトに使用しています.em.remove(childInstance)を呼び出すと、子のみが削除され、親は削除されずに残ります。私が間違っていることを教えてくれませんか?JPA継承 - 親は子で削除されていません

一般テーブル:

@MappedSuperclass 
public abstract class General { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID", columnDefinition = "serial") 
    private Long id; 

    // some other columns, getters and setters 
} 

親テーブル:

@Entity 
@Table(name = "PARENT_TABLE") 
@Inheritance(strategy = InheritanceType.JOINED) 
public abstract class Parent extends General { 

    // some columns and getters and setters 
} 

子供クラス:

@Entity 
@Table(name = "CHILD_TABLE") 
@OnDelete(action = OnDeleteAction.CASCADE) 
public class Child extends Parent { 

@ManyToOne(fetch = FetchType.LAZY) 
@OnDelete(action = OnDeleteAction.CASCADE) 
@JoinColumn(name = "main_child", 
     nullable = true, 
     columnDefinition = "integer default 0") 
private Child mainChild; 

@OnDelete(action = OnDeleteAction.CASCADE) 
@OneToMany(fetch = FetchType.LAZY, mappedBy = "child") 
private Set<MyObjectA> objects = new HashSet<>(); 

    @OnDelete(action = OnDeleteAction.CASCADE) 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "id") 
    private Set<Child> subChildren = new HashSet<>(); 

    // some columns and getters and setters 
} 

MyObjectAクラス:

@Entity 
@Table(name = "object_a") 
public class MyObjectA extends General { 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "child_id", nullable = false) 
    private Child child; 
} 

EDIT:1 他のエンティティが子オブジェクトを参照し、子オブジェクトがそれ自体を参照することを書き留めておきます。

EDIT:2 私は多くのこれに対する1つに追加してみました:私はその制約が何であるかをデータベースに見て、それが参照する​​

と、それはそのエラー

org.postgresql.util.PSQLException: ERROR: update or delete on table "parent" violates foreign key constraint "xxxxxxxxxxxxxxxxxxxxxxx" on table "child"

私を返しますそのスクリプトに:

ALTER TABLE public.child 
    ADD CONSTRAINT xxxxxxxxxxxxxxxxxxxxxxx FOREIGN KEY (id) 
     REFERENCES public.parent (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION; -- here should be ON DELETE CASCADE 
+0

に変更する必要がありますか?データベースを調べたり、親を参照する他のエンティティを分析したりすることによって? –

+0

データベースを見て –

+0

私は手がかりがありません。あなたの設定と私が通常使用するものとの間にはわずかな違いがあります:1)ほとんどの場合、@Tableまたは@ OnDeleteアノテーションはありません。2)私はID生成のためのシーケンスを使用しています(Entityテーブルごとに1つで、IDはGeneralクラスに相当しますが、この場合はParentで定義されます) –

答えて

0

その親の他の子があるため、親の削除は失敗する可能性があります。一般的に、ある子供の親を削除するには、その子供のすべての兄弟を削除する必要があります。

私はあなたのデザインとについて、少し混乱しています - あなたが本当に自分のchildren-あなたは

  • べきで、いくつかの両親にすべての兄弟を削除することを意図した場合には、親/子の間に、関連するすべての関係が双方向作る
  • @ManyToOne(cascade=CascadeType.REMOVE) 
    private Parent parent; 
    
    :のような子なもので、例えば

も子どもたちにカスケードする親の削除を行います

と子供

@OneToMany(fetch = FetchType.LAZY, mappedBy = "id") 
private Set<Child> subChildren = new HashSet<>(); 

あなたのケース

@OneToMany(cascade=CascadeType.REMOVE, mappedBy="parent") 
private Collection<Child> children; 

には親が削除されたかどうかをチェックましたか

// maps Child to itself bi-dir, note mappedBy changed form "id" 
@OneToMany(fetch = FetchType.LAZY, mappedBy = "mainChild", 
       cascade=CascadeType.REMOVE) 
private Set<Child> subChildren = new HashSet<>(); 
+0

で質問を更新します親には関係がありません。子のみが親から継承されます。次に、私は子供だけを使っています。したがって、物理的なデータベースでは、私は親を参照している子供のFKのみを持っています。そしてそのテーブルは同じ数のレコードを持っています。だから子供が削除されるとき、親でなければならない。 –

+0

あなたは '@ ManyToOne'単方向**の関係**' Child.mainChild'を持っています。したがって、このmainChild(親を拡張する)は他の子を持つ可能性があります。この "_update"または "parent"テーブルの削除は、テーブル "child" _の外部キー制約に違反しています。 – pirho

+0

はい、あなたは権利がありますが、子供が自分自身と関係している場合、私はどのように双方向性を行うことができますか?どうしたらいいの? –

関連する問題