2017-09-04 93 views
0

實現一對多的關係,選擇父母和孩子 我有一個onetomany關係,我想要做一個查詢(SELECT *)JPA:選擇父母和孩子與一對多relatinships

Folders.java

@Entity 
@Table(name = "FOLDERS") 
public class Folders implements Serializable { 
    @Id 
    @Column(name = "id") 
    Long id; 
    @ManyToOne 
    @JoinColumn(name = "Folder_Author", insertable=false, updatable=false) 
    private Authors author; 
    // Getter + setter 
} 

Authors.java

@Entity 
@Table(name = "AUTHORS") 
public class Authors implements Serializable { 

    @Id 
    @Column(name = "id") 
    Long id; 
    @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.PERSIST) 
    @JoinColumn(name = "Folder_Author", referencedColumnName = "id", nullable=false) 
    private List<Folders> folders = new ArrayList<Folders>(); 
} 

我的要求:

Query query = em.createQuery("SELECT f FROM Folders f"); 
return query.getResultList(); 

我得到了這樣的結果:

[ 
    { 
     "id":29, 
     "noFolder":"0017", 
     "author":{ 
      "id":9, 
      "name":"Alpha", 
      "service":null, 
      "folders":[ 
       {"id":29, 
       "noFolder":"0017", 
       "author":{ 
        "id":9, 
        "name":"Alpha", 
        "service":null, 
        "folders":[ 
        { 
         "id":29, 
         "noFolder":"0017", 
         "author":{ 
         "id":9, 
         "name":"Alpha", 
         "service":null, 
         "folders":[ 
          .. 
          .. 
      } 
]  

什麼是錯在我的代碼?什麼是當我執行查詢,我得到這個結果的問題..我想得到這樣的結果

[ 
    { 
     "id":29, 
     "noFolder":"0017", 
     "author":{ 
      "id":9, 
      "name":"Alpha", 
      "service":null, 
      } 
    } 
]   
+0

你的意思是你想要的1-N場是懶加載,並且將它設置爲EAGER? –

+0

是的你是對的,但是當我試着懶時我得到這個錯誤:'引起:org.hibernate.LazyInitializationException:未能懶惰地初始化一個角色集合:business.entities.folders.Authors.folders,無法初始化代理 - 沒有會議 \t在rg.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:587) \t在' .. – user1814879

+0

也是'OneToMany'需要一個指定的mappedBy雙方聯繫起來。 –

回答

1

只需使用@JsonIgnore在這樣您的收藏領域:

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.PERSIST) 
    @JoinColumn(name = "Folder_Author", referencedColumnName = "id", nullable=false) 
    @JsonIgnore 
    private List<Folders> folders = new ArrayList<Folders>(); 
+0

是的,但如果我這樣做,我怎麼能得到父母(作者)的價值?就像爲每個文件夾我想要他的作者... – user1814879

+0

@ user1814879你必須打破無限循環使用'@ JsonIgnore'或否則它永遠不會工作。所以你必須採取一對多或多對一的方式。 – Chaitanya

1

使用@ JsonBackReference對作者類中的文件夾列表進行阻止遞歸序列化。

又見here