【问题标题】:Hibernate unable to delete parent/child self-join entityHibernate 无法删除父/子自加入实体
【发布时间】:2012-12-23 01:27:40
【问题描述】:

我正在尝试删除父/子自加入实体,但无法执行此操作 这是我的地图

@Entity
public class FolderNode  {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "hibernate_sequence")
    @SequenceGenerator(name = "hibernate_sequence", sequenceName = "hibernate_sequence")
    @Column(name="folder_id")
    private long folderId;

    
    @ManyToOne
    @Cascade(CascadeType.DELETE)
    @JoinColumn(name="parent_id")
    @OnDelete(action = org.hibernate.annotations.OnDeleteAction.CASCADE)
    private FolderNode parent;

}

【问题讨论】:

    标签: java hibernate annotations parent-child cascade


    【解决方案1】:

    对于正确的父/子关系建模,您应该对关系的一对多部分进行建模,请查找示例:

        @ManyToOne(cascade={CascadeType.ALL})
        @JoinColumn(name="parent_id")
        private Menu parent;
        @OneToMany(mappedBy="parent",orphanRemoval=true)
        private List<Menu> children = new ArrayList<Menu>();
    

    这是一个单向链接,因此关系的所有者将是关系的父方。现在,当您发出EM.delete(parent)session.delete(parent) 时,delete 将被链级联并且子级也将被删除(通常称为孤儿,默认情况下休眠不会对孤儿发出删除语句)所以这就是@987654325 @ 已配置。

    【讨论】:

      【解决方案2】:

      虽然回答有点老了,但今天我遇到了同样的问题,但是在删除孩子时,父母也被删除了。

      如果您希望将 CRUD 操作从子级级联到父级,请不要在父级上使用 cascade={CascadeType.ALL}

      @ManyToOne(cascade={CascadeType.ALL})
      @JoinColumn(name="parent_id")
      private Menu parent;
      
      @OneToMany(mappedBy="parent",orphanRemoval=true)
      private List<Menu> children = new ArrayList<Menu>();
      

      如果删除子级,也会删除父级:您可以从父级中删除级联操作。

      所以我们可以按照下面的方式进行更改,

      @ManyToOne
      @JoinColumn(name="parent_id")
      private Menu parent;
      
      @OneToMany(mappedBy="parent",orphanRemoval=true)
      private List<Menu> children = new ArrayList<Menu>();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-26
        • 2018-12-04
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多