【发布时间】:2013-12-31 08:18:24
【问题描述】:
出于某种目的,我创建了一个表来存储分层数据。 在 LEAF 列中,它决定它是否是叶子。 PARENT_ID 列用于检查哪个是节点的父节点。下面是数据库表。
CREATE TABLE info
(
id bigint NOT NULL,
leaf bigint,
"name" character varying(255),
parent_id bigint,
"value" character varying(255),
"info" character varying(255),
CONSTRAINT info_pkey PRIMARY KEY (id)
)
表名:信息
ID LEAF NAME PARENT_ID VALUE INFO
-- ---- ---- ------ ----- ----
1 0 ROOT 0 '' ''
2 0 S2 1 '' ''
3 0 S3 1 TEST1 INFO1
4 1 S4 1 TEST2 ''
5 1 S5 2 '' ''
6 0 S6 3 '' ''
8 1 S8 6 P8 ''
我在我的项目中使用 JPA Hibernate 和 PostgreSQL,这是唯一包含数据的表。并且它与任何其他表都没有关系。
Q1)如果我想删除“S3”,我应该怎么做,因为它有“S6”作为孩子,而“S8”是“S6”的孩子。所以当我删除“S3”时,它需要在更新时级联。如何在 JPQL 或 JAVA 中的 Hibernate NativeQuery 中执行此操作?
Q2)如何找到特定父节点的子节点和叶子?
【问题讨论】:
-
对于第一季度,我认为如果您在父引用中将其设置为级联删除,它也会删除子级。对于 Q2,我不知道该怎么做,但我认为您正在寻找的是“分层查询”。这可能有助于谷歌。我以前在 plan-ol' Hibernate 中做过一次这样的事情,但已经很久了,我再也没有参考资料了。
-
我如何设置级联删除到这个表,因为它是我唯一的表?你能给个样品吗? @CodeChimp
-
您不是在表格上设置它,而是在您的实体中设置它,通过使用
@CascadeOnDelete或在您的关系注释中设置cascadeType={CascadeType.DELETE}(@OneToMany,@ManyToOne等) -
为了放置 '@OneToMany' 或 '@ManyToOne' 我必须有另一个实体,问题是我只有一个实体等于一个表(如上所示)
-
不,您可以拥有一个指向同一个实体/表的
@OneToMany。当我必须用节点表示树结构时,我这样做了,所以我知道这是可能的。为了支持它,您所要做的就是能够告诉 JPA 关系是如何连接在一起的,以便它可以进行适当的选择。这就是我假设您在这里所做的,因为您提到了父节点和子节点。源代码示例可能会帮助我更好地理解您在做什么或尝试做什么。
标签: java hibernate postgresql jpa jpql