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

jpa cascadeType.all不删除孤立项

  •  125
  • Paul Whelan  · 技术社区  · 16 年前

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

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

    我正面临着数据库中孤立角色的问题。

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

    编辑 :jpa 2.0似乎将包含对此的支持。

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

    如果将其与Hibernate一起使用,则必须显式定义注释 CascadeType.DELETE_ORPHAN ,可与JPA一起使用 CascadeType.ALL .

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

    执行顺序

    1. 提取要删除的主行
    2. 获取子元素
    3. 删除所有子元素
    4. 删除主行
    5. 关闭会话

    使用JPA2.0,现在可以使用选项 孤立删除=真

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

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

    事实上, CascadeType.DELETE_ORPHAN 已在3.5.2-final中弃用。

        3
  •  43
  •   Sergii Shevchyk    11 年前
    ╔═════════════╦═════════════════════╦═════════════════════╗
    ║   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    15 年前

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

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

        5
  •  7
  •   reshma    13 年前

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

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

    根据 Java Persistence with Hibernate , 级联孤儿删除 不能作为JPA注释使用。

    JPA XML中也不支持它。

        7
  •  4
  •   CSchulz cL83    13 年前

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

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

    孤立删除=真 没有效果。

        8
  •  2
  •   Bevor    9 年前

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

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

    然后我记得我 不能使用命名的删除查询 但是实体经理。正如我使用的 EntityManager.find(...) 方法获取实体,然后 EntityManager.remove(...) 为了删除它,盘子也被删除了。

        9
  •  2
  •   Joffrey    6 年前

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

    去除 目标实体=myClass.Class ,效果很好。

        10
  •  1
  •   Simone Gianni    13 年前

    对于记录,在jpa2之前的openjpa中,它是@elementdependent。

        11
  •  0
  •   vipin chauhan    9 年前

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

    使用openremoval=true后,问题得到解决。