我阅读了一些相关问题,但它们并不完全与我的问题相同。
我正在使用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
。
现在,当我们删除具有子项的时,它的子项也将被删除。
感谢您的时间和良好的建议!