継承を使用してレコードを削除することができますか? 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
に変更する必要がありますか?データベースを調べたり、親を参照する他のエンティティを分析したりすることによって? –
データベースを見て –
私は手がかりがありません。あなたの設定と私が通常使用するものとの間にはわずかな違いがあります:1)ほとんどの場合、@Tableまたは@ OnDeleteアノテーションはありません。2)私はID生成のためのシーケンスを使用しています(Entityテーブルごとに1つで、IDはGeneralクラスに相当しますが、この場合はParentで定義されます) –