2016-02-01 48 views
0

我有一個實體持有延遲加載的集合(@OneToMany)。到現在爲止還挺好。如果我加載實體對象的整個列表(findAll()),我不希望集合加載。我不訪問集合,因此我認爲在從REST端點返回它之前它不會被加載,但Jackson解析爲JSON時似乎可以訪問它。JPA手動加載集合

目前我遍歷整個實體列表並將集合設置爲NULL。這似乎是一個非常糟糕的做法,有沒有辦法隻手動加載一個專門準備的@Query集合,而不是自動加載它(LAZY沒有EAGER)呢? @JsonViews是正確的方法,或者我應該刪除@OneToMany註釋(我想我失去了實際加載集合的查詢的映射)?還有其他建議嗎?

Examplecode

@Entity

@Entity 
public class Entity { 
    @OneToMany(targetEntity = Child.class) 
    private List<Child> children; 

} 

新澤西資源

@GET 
@Produces({MediaType.APPLICATION_JSON}) 
public List<Entity> getAllEntities() { 
    List<Entity> entities = entityService.findAll(); 

    entities.forEach(e-> e.setChildren(null)); 

    return entities ; 
} 

庫= JpaRepository默認findAll()實現。

感謝

+1

好了一些想法 - 不要使用相同的java類來抽象數據庫表和JSON響應實體。引入一個新對象 - EntityResponseDto或其他,並在Resoruce中使用它。傑克遜「控制」你的實體類的行爲是不好的。我認爲引入新類會讓你控制傳遞給Jackson序列化程序的內容。在這個新類上使用JsonViews沒有問題。 – hovanessyan

+0

這是最佳做法嗎?如果與原始文件非常相似或相同,我發現爲每個實體或端點創建特殊對象是沒有必要的。 – KenavR

+1

取決於你想要建立什麼,你的重點是什麼。如果你想擁有獨立/可重用的圖層,那麼最好讓這些圖層分開。在你的情況下,你給了1個對象2的責任,並且你以這種方式混合2層--DAO和REST層。大多數時候這被認爲是不好的做法。當然,如果你不關心分層架構,你的數據庫模型很簡單,你想節省時間..你可以做任何必要的事情。如果您有複雜的情況需要使用Jackson和JPA批註,會發生什麼情況?這在同一班上將非常繁瑣。 – hovanessyan

回答

3

既然你提到「建議」,我面臨同樣的問題,我和我決定來實現自定義的DTO在API響應被髮送。因此,我省略了這些收集字段,而其他所有我不想讓json處理器觸摸的字段。 我沒有實現我的集合DTO的鏡像實際堅持的實體,但可能有一些其他地圖做的工作

+1

這就是要走的路! – hovanessyan

+0

順便說一下,我甚至沒有應用實體和DTOs之間的依賴關係..我創建了一個util類,在公共靜態方法中執行實體和DTO之間的值複製,反之亦然。 – yugo

1

過一段時間前,我問了一個問題的REST API大約designing model classes。可能有一些信息對您有用。

我意識到最好的方法是創建不同的模型,而不是重複使用相同的模型類來實現持久性和REST API。在某些情況下,您不希望持久性模型與您在API中使用的模型相同。因此,定義不同的模型是一條路。

而且我選擇MapStruct從一個模型映射到另一個模型。