JPA + Hibernate + Spring + OneToMany 删除级联

34

我阅读了一些相关问题,但它们并不完全与我的问题相同。

我正在使用JPA + Hibernate + Spring,并且我想做一些我不确定是否仅通过配置就可以实现的事情。

我有一些具有复杂关系的领域类。有许多元素与一个元素相关联(如果它像一个树一样,许多元素是一个元素的子元素)。

类似这样的东西:

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Foo parentNode;
    ...
}

将会得到一个表格,类似于:

Foo id    parent_id
1
2         1 
3         1
当我删除id = 1的行时,我希望同时删除id = 2和id = 3的行(可能需要递归删除parent_id = 2和parent_id = 3的元素)。
由于一些限制,我只能在子类中通过parent_id引用来建立关系。
我的问题是:是否可以使用JPA或Hibernate配置来实现此操作,还是我需要编写递归函数来删除所有子项和所有父项?
我已尝试使用:
@OneToMany(name = "PARENT_ID", cascade = CascadeType.REMOVE)

我读到过使用Hibernate注释可能会有所帮助。

如果有人能给我一些提示,因为我现在很迷茫。

编辑1

是否可以这样做:

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name="PARENT_ID")
    private Foo parentNode;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parentNode", cascade = CascadeType.REMOVE, orphanRemoval = true)
    private Set<Foo> childs = new LinkedHashSet<Foo>();
    ...
}

保留原来的表格,在其中保留到父表的外键?我尝试过这种方法,但是仍然出现了相同的错误,外键限制被违反。

编辑2

最终解决方案如下:

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Foo parentNode;

    @OneToMany(mappedBy = "parentNode", cascade = CascadeType.REMOVE)
    private Set<Foo> childs = new LinkedHashSet<Foo>();
    ...
}

即使我们只通过引用父ID在我们的数据库中进行映射,也需要这个@OneToMany

现在,当我们删除具有子项的时,它的子项也将被删除。

感谢您的时间和良好的建议!

2个回答

33

29

JPA中的关系始终是单向的,除非您在两个方向上将父对象与子对象关联起来。从父对象到子对象的级联删除操作需要一个从父对象到子对象的关系(而不仅仅是相反的关系)。

因此,在这里您需要将单向关系更改为双向关系。

有关更多详细信息,请参考:


谢谢,但我需要在ManyToOne方面进行操作,因为我没有OneToMany的方式。这可行吗?谢谢。 - Garci García
所以如果我不能实现双向,我需要进行一些递归处理吗?谢谢。 - Garci García
是的,您必须参考http://fruzenshtein.com/bidirectional-many-to-one-association/。 - Harshal Patil
我看到了这个链接:http://www.java2s.com/Code/Java/JPA/ManyToOneCascadeRemove.htm ,它们确实删除了一个多对一的关系,但似乎并没有生效。谢谢。 - Garci García

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接