代码之家  ›  专栏  ›  技术社区  ›  Paul Whelan

JPA级联类型。ALL不会删除孤儿

  •  143
  • Paul Whelan  · 技术社区  · 17 年前

    我在使用JPA和以下映射删除孤立节点时遇到了问题

    @OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
    private List<Bikes> bikes;
    

    我遇到了数据库中孤立角色的问题。

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

    编辑 :JPA 2.0似乎将包括对此的支持。

    11 回复  |  直到 10 年前
        1
  •  150
  •   community wiki 5 revs, 3 users 83% Varun Mehta    10 年前

    如果你在Hibernate中使用它,你必须显式定义注释 CascadeType.DELETE_ORPHAN ,可以与JPA结合使用 CascadeType.ALL .

    如果你不打算使用Hibernate,你必须先显式删除子元素,然后删除主记录,以避免任何孤立记录。

    执行序列

    1. 获取要删除的主行
    2. 获取子元素
    3. 删除所有子元素
    4. 删除主行
    5. 非公开会议

    使用JPA 2.0,您现在可以使用以下选项 孤儿删除=true

    @OneToMany(mappedBy="foo", orphanRemoval=true)
    
        2
  •  110
  •   acdcjunior Mukul Kumar    10 年前

    如果您正在使用JPA 2.0,现在可以使用 orphanRemoval=true 属性 @xxxToMany 注释以删除孤儿。

    事实上, CascadeType.DELETE_ORPHAN 已在3.5.2最终版本中弃用。

        3
  •  43
  •   Sergii Shevchyk    12 年前
    ╔═════════════╦═════════════════════╦═════════════════════╗
    ║   Action    ║  orphanRemoval=true ║   CascadeType.ALL   ║
    ╠═════════════╬═════════════════════╬═════════════════════╣
    ║   delete    ║     deletes parent  ║    deletes parent   ║
    ║   parent    ║     and orphans     ║    and orphans      ║
    ╠═════════════╬═════════════════════╬═════════════════════╣
    ║   change    ║                     ║                     ║
    ║  children   ║   deletes orphans   ║      nothing        ║
    ║    list     ║                     ║                     ║
    ╚═════════════╩═════════════════════╩═════════════════════╝
    
        4
  •  12
  •   uı6ʎɹnɯ ꞁəıuɐp    17 年前

    如果您将JPA与EclipseLink一起使用,则必须设置 @私人所有 注释。

    文档: Eclipse Wiki - Using EclipseLink JPA Extensions - Chapter 1.4 How to Use the @PrivateOwned Annotation

        5
  •  7
  •   reshma    15 年前

    您可以使用@PrivateOwned删除孤儿 例如

    @OneToMany(mappedBy = "masterData", cascade = {
            CascadeType.ALL })
    @PrivateOwned
    private List<Data> dataList;
    
        6
  •  4
  •   toolkit    17 年前

    我只是找到了这个解决方案,但就我而言,它不起作用:

    @OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 
    

    孤儿删除=true 没有效果。

        7
  •  4
  •   CSchulz cL83    14 年前

    根据 Java Persistence with Hibernate , 级联孤立删除 不可用作JPA注释。

    JPA XML也不支持它。

        8
  •  2
  •   Bevor    10 年前

    我也有同样的问题,我想知道为什么下面的条件没有删除孤儿。当我执行一个命名删除查询时,在Hibernate(5.0.3.Final)中没有删除菜肴列表:

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

    然后我想起我 不得使用命名删除查询 ,但EntityManager。当我使用 EntityManager.find(...) 方法获取实体,然后 EntityManager.remove(...) 为了删除它,盘子也被删除了。

        9
  •  2
  •   Joffrey    7 年前

    只是 @OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) .

    去除 targetEntity=MyClass.class ,它工作得很好。

        10
  •  1
  •   Simone Gianni    15 年前

    据记载,在JPA2之前的OpenJPA中,它是@ElementDependant。

        11
  •  0
  •   vipin chauhan    10 年前

    我使用了一对一映射,但孩子并没有被删除,JPA违反了外键

    使用孤儿移除=true后,问题得到解决