JPA + Hibernate + Spring + OneToMany删除级联

时间:2014-09-22 06:34:44

标签: spring hibernate spring-mvc jpa annotations

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

我正在使用JPA + Hibernate + Spring,我想做一些我不确定是否可以使用配置的东西。

我的域类具有或多或少的复杂关系。有许多元素与一个元素相关(如果它是一个树,许多元素是一个元素的儿子)。

类似的东西:

@Entity
clas 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的元素)。

对于某些限制,我只能在son的一侧使用parent_id引用。

我的问题是:是否可以使用JPA或Hibernate配置执行此操作,还是需要执行一些递归功能来删除所有子项和所有父项?

我试过了:

@OneToMany(name = "PARENT_ID", cascade = CascadeType.REMOVE)

我已经读过可能使用Hibernate注释的内容。

如果有人能给我一些线索,我现在就输了。

编辑1

是否可以这样做:

@Entity
clas 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>();
    ...
}

将表格保持原样,将fk保留给父级? 我已经尝试了这个但是我一直遇到同样的错误,违反了fk限制。

编辑2

最后解决了:

@Entity
clas 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在我们的BBDD中进行映射,也需要此@OneToMany

现在,当我们删除带有孩子的Foo时,它的孩子也会被删除。

感谢您的时间和建议!

2 个答案:

答案 0 :(得分:22)

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

所以在这里你需要将单向关系改为双向关系。

有关详细信息,请参阅this link.

答案 1 :(得分:17)

查看orphanRemoval选项:

@OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true)

以下是关于CascadeType.REMOVEorphanRemoval的{​​{3}}。

祝你好运!