Java JPA继承-父项未与子项一起删除
你能帮我删除继承的记录吗。我正在为对象使用实体管理器,当我调用em.remove(childInstance)时,将只删除子对象,而父对象保持未删除状态。你能看出我做错了什么吗 总表:Java JPA继承-父项未与子项一起删除,java,hibernate,jpa,Java,Hibernate,Jpa,你能帮我删除继承的记录吗。我正在为对象使用实体管理器,当我调用em.remove(childInstance)时,将只删除子对象,而父对象保持未删除状态。你能看出我做错了什么吗 总表: @MappedSuperclass public abstract class General { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", columnDefinition
@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
}
编辑:1
我忘了写其他实体指的是子对象,子对象指的是它自己
编辑:2
我尝试将以下内容添加到一对多:
cascade = CascadeType.ALL, orphanRemoval = true
然后它返回给我那个错误
org.postgresql.util.PSQLException:错误:更新或删除表
“父项”违反外键约束
表“child”上的“xxxxxxxxxxxxxxxxxxxx”
我在数据库中查看该约束是什么,它引用了该脚本:
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
删除父项可能会失败,因为该父项还有其他子项。通常,为了删除某个孩子的父母,在这种情况下,您还需要删除该孩子的所有兄弟姐妹 我对你的设计感到有点困惑,如果你真的想让一些父母和他们的孩子一起离开,你应该这样做
- 使父级/子级之间的所有相关关系具有双向性
- 使父项删除也级联到子项
@ManyToOne(cascade=CascadeType.REMOVE)
private Parent parent;
在父母中
@OneToMany(cascade=CascadeType.REMOVE, mappedBy="parent")
private Collection<Child> children;
@OneToMany(cascade=CascadeType.REMOVE,mappedBy=“parent”)
私人收藏儿童;
在您的案例中在儿童中
@OneToMany(fetch = FetchType.LAZY, mappedBy = "id")
private Set<Child> subChildren = new HashSet<>();
@OneToMany(fetch=FetchType.LAZY,mappedBy=“id”)
private Set subChildren=new HashSet();
应改为
// 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<>();
//将子项映射到其自身bi dir,注意mappedBy更改了形式“id”
@OneToMany(fetch=FetchType.LAZY,mappedBy=“mainChild”,
级联=级联类型。删除)
private Set subChildren=new HashSet();
您如何检查父项是否已删除?通过查看数据库或分析其他引用父级的实体?查看数据库,我没有任何线索。在您的设置和我通常使用的设置之间只有一些细微的区别:1)在大多数情况下,我没有@Table
或@OnDelete
注释。2) 我使用序列生成ID(每个实体表一个,因此ID不在我的通用类中,但在这种情况下会在父类中定义)@Jeroensteenbeek检查我的更新,我写与子表的关系。也许这个问题+答案有用吗?在父母中,我没有任何关系,唯一的孩子是从父母那里继承来的。接下来,我用独生子女。所以在物理数据库中,我只有FK在子对象中,它引用了父对象。表中有相同数量的记录。因此,当删除子项时,也必须是父项。您具有@ManyToOne
单向关系child.mainChild
。所以这个mainChild(扩展父对象)可能有其他子对象。表“parent”上的此更新或删除违反了外键约束。。。桌子上的“孩子”告诉我。是的,你们是对的,但若孩子和自己有关系,我怎么能做到双向的呢?你能编辑我的有问题的类来告诉我怎么做吗
// 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<>();