我有一個實體持有延遲加載的集合(@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()
實現。
感謝
好了一些想法 - 不要使用相同的java類來抽象數據庫表和JSON響應實體。引入一個新對象 - EntityResponseDto或其他,並在Resoruce中使用它。傑克遜「控制」你的實體類的行爲是不好的。我認爲引入新類會讓你控制傳遞給Jackson序列化程序的內容。在這個新類上使用JsonViews沒有問題。 – hovanessyan
這是最佳做法嗎?如果與原始文件非常相似或相同,我發現爲每個實體或端點創建特殊對象是沒有必要的。 – KenavR
取決於你想要建立什麼,你的重點是什麼。如果你想擁有獨立/可重用的圖層,那麼最好讓這些圖層分開。在你的情況下,你給了1個對象2的責任,並且你以這種方式混合2層--DAO和REST層。大多數時候這被認爲是不好的做法。當然,如果你不關心分層架構,你的數據庫模型很簡單,你想節省時間..你可以做任何必要的事情。如果您有複雜的情況需要使用Jackson和JPA批註,會發生什麼情況?這在同一班上將非常繁瑣。 – hovanessyan