2 回答

TA貢獻1796條經驗 獲得超4個贊
回答之前的一件事:不要將實體作為休息服務的響應返回,因為您將服務的消費者耦合到您的數據庫,因此是一種不好的做法。
現在答案是:當您的控制器返回一個包含在 ResponseEntity 中的列表時。@ResponseBody 注解的意思是方法的返回值將構成 HTTP 響應的正文。由于響應中不允許有 Java 對象,因此必須將它們序列化為適合 REST 應用程序的格式,即 JSON 或 XML(這將取決于 RequestMapping 注釋的生產屬性的值,以及客戶端接受的內容類型) . 由于這個序列化過程,來自 EmergentTechnology 對象(由 Hibernate 管理,因此它們被代理)的 getter 方法將被調用。此調用將導致獲取工件列表。
因此,您要做的是將您的實體映射到服務 EmergingTechLibService (我推薦MapStruct)中的一個 VO (避免一對),避免調用工件的 getter

TA貢獻1785條經驗 獲得超8個贊
您似乎遇到了 1+N 問題。您可以讓休眠在一個查詢中加載所有數據。為此,您可以將 fetch join 與您的條件一起使用。
@Override
public List<EmergentTechnology> getAllArtifactsById(int emergentTechId) {
logger.info("Enter getEmergentTechnologies");
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<EmergentTechnology> criteriaQuery = criteriaBuilder.createQuery(EmergentTechnology.class);
Root<EmergentTechnology> root = criteriaQuery.from(EmergentTechnology.class);
// NEW CODE
root.fetch("artifacts", JoinType.INNER);
criteriaQuery.select(root);
criteriaQuery.where(criteriaBuilder.equal(root.<Integer>get("id"), emergentTechId));
List<EmergentTechnology> emergingTechnologies = entityManager.createQuery(criteriaQuery).getResultList();
logger.info("Exit getEmergentTechnologies");
return emergingTechnologies;
}
讓休眠通過一個查詢獲取所有數據的另一種選擇是使用命名實體圖。
雖然我不確定這是否會解決您的所有問題,但您仍然應該會看到性能提升。
此外,根據您的數據的性質(在我看來,這是一組不會很大并且不會發生太大或經常變化的信息),您可以充分利用彈簧緩存,這將非常適合您的用例.
另一種選擇是使用休眠查詢緩存。
添加回答
舉報