休眠同一表父/子关系

2022-09-03 13:19:19

我在单个表中具有父/子关系,让我们说就像

id | parent_id | some_data

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

我有一个来自某个地方的源,它具有嵌套的JSON结构,因此在解析它之后,我希望在OracleDB中表示它。

源看起来像

{
   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 将是我的休眠映射类的实例,让我们将其命名为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(策略=InheritanceType.SINGLE_TABLE),但我认为我不能把它应用到我的问题,因为我不认识父母,他们是动态的。我无法构建父类并扩展它。

所以底线我试图解决两个问题

  1. 轻松保存在父级

  2. 如何在需要时将数据从父级获取到叶子

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


答案 1

似乎我需要做的就是:

@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)

答案 2

你为什么不创建一个自我引用一对多的关系,保持级联=全部。因此,单个子对象不需要单独保存。只有保存父母就足够了。例如。

将一对多关系添加到自引用父/子


推荐