java - JPA + Hibernate + Spring + OneToMany 删除级联

标签 java spring hibernate spring-mvc jpa

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

我正在使用 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 配置来执行此操作,或者我是否需要执行一些递归函数来删除所有 child 和所有 parent ?

我试过了:

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

保持表原样,将 fk 传递给父级? 我已经尝试过了,但我一直收到同样的错误,违反了 fk 限制。

编辑 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>();
    ...
}

这个 @OneToMany 是必需的,即使我们在 BBDD 中只通过引用父 ID 进行映射。

现在当我们删除一个带有子元素的 Foo 时,它的子元素也会被删除。

感谢您的宝贵时间和建议!

最佳答案

orphanRemoval选项:

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

这里是 complete explication关于 CascadeType.REMOVEorphanRemoval

祝你好运!

关于java - JPA + Hibernate + Spring + OneToMany 删除级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25967935/

相关文章:

java - 如何在不使用 toUpperCase 方法的情况下将字符串转换为大写?

java - SpringJunit4ClassRunner 的类路径在哪里,如何直接指向我操作系统中的文件?

java - Spring 4 WebSocket 远程代理配置

java - Hibernate + Jasypt : Unable to resolve name . ..作为策略

javascript - 多个组的正则表达式不起作用 - Java 1.7 到 1.8 - ScriptEngine Rhino 到 Nashorn

java - JTextPane 中没有滚动条

java - 如果if语句为假,为什么这个for循环会运行?

java - 组件注释无法正常工作

java - 如何使用camelCase将Hibernate实体字段映射到snake_case(下划线)数据库标识符

java - 如何测试删除方法