gpt4 book ai didi

java - hibernate 同表父/子关系

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:25 24 4
gpt4 key购买 nike

我在单表中有父/子关系,可以说很简单

id | parent_id | some_data

我正在尝试了解/实现如何为单表关系构建 Hibernate 类的最佳实践。

我有一个来自某个地方的提要,它有嵌套的 JSON 结构,所以在解析它之后我想在 OracleDB 中表示它。

Feed 看起来像

{
1:
=> 2:
=> 3
=> 4:
=> 5
=> 6
}

此数据应以 db 形式结束:

1 | 0 (main rec, no parent)
2 | 1
3 | 2
4 | 2
5 | 4
6 | 1

它可能会越来越深......

我想遍历 JSON 结构并构建类,最后保存在 db 中

session.save(parent)

parent 将是我的 hibernate 映射类的实例,我们将其命名为 Feed。

每次我下降一棵树时,它都会创建一个新的 Feed,找到它的父级并将其添加到列表中。

Feed **parent** = new Feed();

-> Feed child2 = new Feed();
child2.setParent(parent)
parent.add(child2);

-> Feed child3 = new Feed();
child3.setParent(child2)
child2.add(child3);

Feed child4 = new Feed();
child4.setParent(child2)
child2.add(child4);

.............

session.save(**parent**)

我的问题是我可以使用@ManyToOne 和@OneToMany 方法吗?

我也查看了@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 但我不认为我可以将它应用于我的问题,因为我不认识 parent ,他们是动态的。我无法构建父类并扩展它。

归根结底,我要解决两个问题

  1. 在父级别轻松保存

  2. 如何在需要时从父节点获取数据到叶节点

一些 Hibernate 映射类示例将不胜感激。

最佳答案

似乎我需要做的就是:

@Entity
@Table(name = "table_name")
public class TableName {

......

@Transient
private Long parentId;

......

@ManyToOne(fetch = FetchType.LAZY, optional=true)
@JoinColumn(name="parent_id")
private TableName parent;

@OneToMany(mappedBy="parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true)
private Set<TableName> children = new HashSet<TableName>();
}

那么简单

TableName papa = new TableName();
papa.setParent(null); // parent

TableName kid1 = new TableName();
kid1.setParent(papa);
papa.getChildren().add(kid1);

TableName kid1_1 = new TableName();
kid1_1.setParent(kid1);
kid1.getChildren().add(kid1_1);

TableName kid2 = new TableName();
kid2.setParent(papa);
papa.getChildren().add(kid2);

session.save(papa)

关于java - hibernate 同表父/子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30334044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com