2015-05-19 16 views
5

tôi có mối quan hệ cha/con trong một đơn bảng, chúng ta hãy nói đơn giản nhưHibernate cùng bảng mối quan hệ cha/con

id | parent_id | some_data 

Tôi cố gắng để hiểu/thực hiện thực hành tốt nhất làm thế nào để xây dựng các lớp học Hibernate cho đơn mối quan hệ bảng.

Tôi có một nguồn cấp dữ liệu đến từ đâu đó và nó có cấu trúc JSON lồng nhau, vì vậy sau khi phân tích cú pháp nó tôi muốn có nó đại diện trong OracleDB.

thức ăn trông giống như

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

dữ liệu này nên kết thúc trong db như:

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

Và nó có thể đi sâu hơn và sâu hơn ...

Tôi muốn đi qua JSON cấu trúc và xây dựng các lớp học ở cuối tôi lưu trong db

session.save(parent) 

cha mẹ sẽ là trường hợp của lớp được ánh xạ hibernate của tôi, cho phép đặt tên là Feed.

Mỗi khi tôi hạ xuống một cây, nó sẽ tạo một Nguồn cấp dữ liệu mới, tìm thấy đó là cấp độ gốc và thêm nó vào danh sách.

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

Câu hỏi của tôi là tôi có thể sử dụng phương pháp @ManyToOne và @OneToMany?

Tôi cũng đã xem @Inheritance (strategy = InheritanceType.SINGLE_TABLE) nhưng tôi không nghĩ rằng mình có thể áp dụng nó vào vấn đề của mình vì tôi không biết cha mẹ, chúng năng động. Tôi không thể xây dựng lớp cha và mở rộng nó.

dòng Vì vậy, phía dưới tôi đang cố gắng để giải quyết hai vấn đề

  1. dễ dàng tiết kiệm về mặt kĩ mẹ

  2. Làm thế nào để lấy dữ liệu từ một mẹ một lá khi tôi cần nó

Một số ví dụ về Lớp được ánh xạ Hibernate sẽ rất được đánh giá cao.

Trả lời

6

Có vẻ như tất cả những gì cần thiết để làm là:

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

Thần đơn giản

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

Tại sao bạn không tạo tự tham chiếu một đến nhiều mối quan hệ giữ cascade = tất cả. Vì vậy, các đối tượng con cá nhân không cần phải được lưu riêng. Chỉ lưu cha mẹ là đủ. Ví dụ.

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

+0

đó là những gì tôi đang cố gắng tìm ra, và tìm cách tiếp cận tốt nhất để làm cấu hình như vậy – antohoho

Các vấn đề liên quan