hibernate 休眠同一表父/子关系

nwsw7zdq  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(155)

我有一个单表中的父母/孩子关系,让我们这么简单地说

id | parent_id | some_data

我正在尝试理解/实现如何为单表关系构建Hibernate类的最佳实践。
我有一个来自某个地方的提要,它具有嵌套的JSON结构,所以在解析它之后,我希望在OracleDB中表示它。
提要看起来像

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

此数据在数据库中的结尾应为:
它可能会越来越深……
我想遍历JSON结构并构建类,最后将其保存在数据库中

session.save(parent)

父类将是我的HibernateMap类的示例,我们将其命名为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方法吗?
我还查看了@InheritanceType.SINGLE_TABLE),但我不认为我可以将其应用于我的问题,因为我不认识父母,他们是动态的。我无法构建父类并扩展它。
所以底线是我在努力解决两个问题
1.在父级上轻松保存
1.如何在需要时将数据从父级传输到叶
如果能提供一些HibernateMap类的例子,我们将不胜感激。

9rbhqvlz

9rbhqvlz1#

看起来我需要做的就是:

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

ktecyv1j2#

为什么不创建一个自引用一对多关系,保持CASCADE=ALL。因此,不需要单独保存各个子对象。只有救了父母就够了。例如。
Adding a one to many relationship to a self reference parent/child

相关问题