2015-05-19 3 views
5

У меня есть родитель/потомок в одном столе, скажем так просто, какHibernate же таблица родитель/ребенок отношение

id | parent_id | some_data 

Я пытаюсь понять/применять лучшие практики, как построить Hibernate классы для одного таблица отношений.

У меня есть фид, который приходит откуда-то, и он имеет вложенную структуру JSON, поэтому после разбора я хочу иметь это представление в OracleDB.

лента выглядит

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

эти данные должны в конечном итоге в БД, как:

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

И он может пойти глубже и глубже ...

Я хотел бы пройти JSON структуры и классов сборки, которые в конце я сохраняю в db

session.save(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 (strategy = InheritanceType.SINGLE_TABLE), но я не думаю, что могу применить его к моей проблеме, так как я не знаю родителей, они динамичны. Я не мог создать родительский класс и расширить его.

Так нижняя линия, которую я пытаюсь решить две проблемы

  1. Easy сэкономить на родительском уровне

  2. Как получить данные от родителя к листу, когда мне это нужно

Некоторые примеры классов с гибридным спящим интерфейсом будут очень оценены.

ответ

6

Кажется, все, что мне нужно сделать, это:

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

Почему бы вам не создать ссылку, привязавшуюся ко многим отношениям, сохраняя каскад = все. Поэтому отдельные дочерние объекты не нужно сохранять отдельно. Достаточно сохранить только родителя. Например.

Adding a one to many relationship to a self reference parent/child

+0

это то, что я пытаюсь выяснить, и ищет лучший подход делать такая конфигурация – antohoho

Смежные вопросы