JPA + Hibernate + Spring + OneToMany删除级联

Gar*_*cía 21 spring annotations hibernate jpa spring-mvc

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

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

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

就像是:

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

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Foo parentNode;
    ...
}
Run Code Online (Sandbox Code Playgroud)

Wich会得到一张表:

Foo id    parent_id
1
2         1 
3         1
Run Code Online (Sandbox Code Playgroud)

当我与ID = 1删除行欲删除与ID = 2和id = 3行(它可以是递归的,与PARENT_ID = 2和PARENT_ID = 3的元件将被删除以及).

对于某些限制,我只能在父子方面与parent_id引用建立关系.

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

我尝试过:

@OneToMany(name = "PARENT_ID", cascade = CascadeType.REMOVE)
Run Code Online (Sandbox Code Playgroud)

我读过可能使用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>();
    ...
}
Run Code Online (Sandbox Code Playgroud)

将表格保持原样,将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>();
    ...
}
Run Code Online (Sandbox Code Playgroud)

@OneToMany即使我们通过刚才闯民宅父ID做我们BBDD映射是必要的.

现在,当我们删除带有子项的Foo时,它的子项也将被删除.

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

Har*_*til 24

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

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

有关详细信息,请参阅此链接.


jmv*_*ivo 20

看看orphanRemoval选项:

@OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true)
Run Code Online (Sandbox Code Playgroud)

这是关于和的完整解释.CascadeType.REMOVEorphanRemoval

祝好运!