Bri*_*asa 9 java hibernate jpa gson
我遇到了一个问题,即JPA在我不想要的时候试图懒洋洋地加载我的数据.基本上发生的事情是我正在使用服务来检索一些数据,当我将这些数据解析为JSON时,JSON库正在触发hibernate尝试并且懒洋洋地加载数据.有没有办法阻止这个?我在下面给出了一个例子.
// Web Controller method
public String getEmployeesByQuery(String query) {
Gson gson = new Gson();
List<Employee> employees = employeeService.findEmployeesByQuery(query);
// Here is where the problem is occurring - the gson.toJSON() method is (I imagine)
// using my getters to format the JSON output, which is triggering hibernate to
// try and lazily load my data...
return gson.toJSON(employees);
}
Run Code Online (Sandbox Code Playgroud)
是否可以将JPA/hibernate设置为不尝试并且懒惰地加载数据?
更新:我意识到你可以使用FetchType.EAGER - 但如果我不想急于加载那些数据呢?我只想阻止hibernate尝试检索更多数据 - 我已经拥有了我想要的数据.现在每当我尝试访问get()方法时,hibernate都会抛出"no session或session is closed"错误,这是有道理的,因为我的事务已经从我的服务中提交了.
谢谢!
有几种选择:
如果您总是需要急切地加载您的集合,您可以fetch = FetchType.EAGER在映射中指定,如其他答案中所建议的那样.
否则,您可以为特定查询启用急切提取:
通过JOIN FETCH在HQL/JPQL查询中使用子句:
SELECT e FROM Employee e JOIN FETCH e.children WHERE ...
Run Code Online (Sandbox Code Playgroud)Session通过访问Hibernate em.unwrap(Session.class))你确实有两个选择:
toJSON库反映整个对象图。我知道一些 JSON 库只允许您将对象的某些属性序列化为 JSON。就我个人而言,我认为如果你的库只使用反射,#1 会更容易。