Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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 CascadeType.ALL不删除孤立项_Java_Hibernate_Orm_Jpa_Jpa 2.0 - Fatal编程技术网

Java JPA CascadeType.ALL不删除孤立项

Java JPA CascadeType.ALL不删除孤立项,java,hibernate,orm,jpa,jpa-2.0,Java,Hibernate,Orm,Jpa,Jpa 2.0,使用具有以下映射的JPA删除孤立节点时遇到问题 @OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner") private List<Bikes> bikes; @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy=“owner”) 私人名单自行车; 我在数据库中遇到了孤立角色的问题 我可以使用a

使用具有以下映射的JPA删除孤立节点时遇到问题

@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy=“owner”)
私人名单自行车;
我在数据库中遇到了孤立角色的问题

我可以使用annotation
org.hibernate.annotations.Cascade
hibernate特定标记,但显然我不想将我的解决方案绑定到hibernate实现中

编辑:看来JPA 2.0将包括对此的支持。

根据,级联孤立删除不可用作JPA注释


JPA XML中也不支持它。

如果将它与Hibernate一起使用,则必须显式定义注释
CascadeType.DELETE\u ORPHAN
,它可以与JPA
CascadeType.ALL一起使用

如果不打算使用Hibernate,则必须先明确删除子元素,然后删除主记录,以避免出现任何孤立记录

执行顺序

  • 获取要删除的主行
  • 获取子元素
  • 删除所有子元素
  • 删除主行
  • 闭门会议
  • 使用JPA2.0,您现在可以使用选项orphanRemoving=true

    @OneToMany(mappedBy="foo", orphanRemoval=true)
    

    如果您将JPA与EclipseLink一起使用,则必须设置@PrivateOwned注释


    文档:

    如果您使用的是JPA2.0,现在可以使用
    @xxxToMany
    注释的
    orphanRemoving=true
    属性来删除孤立项


    实际上,
    CascadeType.DELETE_ORPHAN
    在3.5.2-Final中已被弃用。

    我刚刚找到了这个解决方案,但在我的情况下,它不起作用:

    @OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 
    
    孤立删除=true无效。

    只需
    @OneToMany(cascade=CascadeType.ALL,mappedBy=“xxx”,fetch=FetchType.LAZY,孤立删除=true)


    删除targetEntity=MyClass.class,效果很好。

    对于记录,在JPA2之前的OpenJPA中,它是@ElementDependent。

    您可以使用@PrivateOwned删除孤立项 e、 g

    @OneToMany(mappedBy=“masterData”,级联={
    CascadeType.ALL})
    @私有的
    私有列表数据列表;
    
    我也有同样的问题,我想知道为什么下面的这种情况没有删除孤儿。在Hibernate(5.0.3.Final)中,当我执行命名的删除查询时,没有删除菜品列表:

    @OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Dish> dishes = new ArrayList<>();
    
    @OneToMany(mappedBy=“menuPlan”,cascade=CascadeType.ALL,orphan=true)
    private List disks=new ArrayList();
    

    然后我想起我不能使用命名的删除查询,而是使用EntityManager。当我使用
    EntityManager.find(…)
    方法获取实体,然后使用
    EntityManager.remove(…)
    删除实体时,盘子也被删除了

    我使用的是一对一映射,但孩子并没有被删除,JPA给出了外键冲突


    在使用OrphanRemove=true之后,问题得到了解决

    谢谢我最终选择了这条路线,我认为这对于JPA规范来说有点过头了。JPA 2.0标准现在将deleteOrphan作为@OneToMany的一个属性,如果您使用的是最新的hibernate,您可以执行@OneToMany(…,deleteOrphan=true)当我只更新子元素时,执行顺序是什么?孤儿记录会被删除吗?实际上,我认为orphanRemoving=true意味着其他东西,即,当我从父对象的集合中删除某个对象时,将其删除。请通过Archie的链接查看g。OrphanRemoving=true也不起作用。它必须以旧的方式完成。感谢@reshma,应该注意的是@PrivateOwned是eclipselink JPA的扩展。我需要在更改生效之前进行清理和构建。哇,我已经花了一个小时来研究为什么要添加CascadeType。我的manytone上的所有内容都不是级联删除。清洁和建设,它的工作。谢谢@maralbjo@OneToOne(cascade=CascadeType.ALL,orphanRemoving=true)@JoinColumn(name=“CHILD\u OID”)private CHILD;如果我有
    cascade=CascadeType.ALL,orphanRemoving=false
    并删除父级,会发生什么?它会删除孩子吗,即使我明确告诉过不要删除?
    ╔═════════════╦═════════════════════╦═════════════════════╗
    ║   Action    ║  orphanRemoval=true ║   CascadeType.ALL   ║
    ╠═════════════╬═════════════════════╬═════════════════════╣
    ║   delete    ║     deletes parent  ║    deletes parent   ║
    ║   parent    ║     and orphans     ║    and orphans      ║
    ╠═════════════╬═════════════════════╬═════════════════════╣
    ║   change    ║                     ║                     ║
    ║  children   ║   deletes orphans   ║      nothing        ║
    ║    list     ║                     ║                     ║
    ╚═════════════╩═════════════════════╩═════════════════════╝
    
    @OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Dish> dishes = new ArrayList<>();