Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA继承-父项未与子项一起删除_Java_Hibernate_Jpa - Fatal编程技术网

Java JPA继承-父项未与子项一起删除

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

你能帮我删除继承的记录吗。我正在为对象使用实体管理器,当我调用em.remove(childInstance)时,将只删除子对象,而父对象保持未删除状态。你能看出我做错了什么吗

总表:

@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

删除父项可能会失败,因为该父项还有其他子项。通常,为了删除某个孩子的父母,在这种情况下,您还需要删除该孩子的所有兄弟姐妹

我对你的设计感到有点困惑,如果你真的想让一些父母和他们的孩子一起离开,你应该这样做

  • 使父级/子级之间的所有相关关系具有双向性
  • 使父项删除也级联到子项
例如,在child中,类似于:

@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<>();