【发布时间】:2014-11-16 01:21:16
【问题描述】:
我已经阅读了一些相关的问题,但它们与我的问题并不完全相同。
我正在使用 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>();
...
}
保持表原样,将 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 时,它的子元素也会被删除。
感谢您的宝贵时间和建议!
【问题讨论】:
标签: java spring hibernate spring-mvc jpa