Java 仅在需要时加载惰性对象
我正在使用hibernate 4.3 我有一个父表它包含从地址表引用的外键。地址在父表中有@manytone(fetch=FetchType.LAZY)。现在我想要的是 案例1)当类型为parent的用户登录时,我需要从父表获取数据,但在这种情况下不想加载地址 案例2)当家长去编辑他/她的个人信息时,我需要加载家长以及地址 我试过使用休闲代码 ServletJava 仅在需要时加载惰性对象,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我正在使用hibernate 4.3 我有一个父表它包含从地址表引用的外键。地址在父表中有@manytone(fetch=FetchType.LAZY)。现在我想要的是 案例1)当类型为parent的用户登录时,我需要从父表获取数据,但在这种情况下不想加载地址 案例2)当家长去编辑他/她的个人信息时,我需要加载家长以及地址 我试过使用休闲代码 Servlet GsonBuilder builder = new GsonBuilder(); builder.registerType
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY);
Gson gson = new Gson();
int parentID = Integer.parseInt(request.getParameter("parentID"));
return gson.toJson(api.getParentDetails(parentID));
getParentDetails()方法
public HashMap getParentDetails(int parentID) throws Exception {
Parent parentDetails;
responseHashMap = Util.getInitialHashMap();
try {
session.getTransaction().begin();
Query q = session.createQuery("from Parent as p where p.parentId=:parentID");
q.setParameter("parentID", parentID);
parentDetails = (Parent) q.uniqueResult();
//Hibernate.initialize(parentDetails.getAddress());
responseHashMap.put("responseData", parentDetails);
responseHashMap.put("responseCount", 0);
if (parentDetails != null) {
responseHashMap.put("errorCode", 107);
} else {
responseHashMap.put("errorCode", 0);
}
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
throw e;
}
return responseHashMap;
}
现在您可以看到注释行了
//Hibernate.initialize(parentDetails.getAddress())强>
当我取消注释这一行时,我的代码工作正常,但在情况1中失败,对我来说,它为我加载了不必要的数据,作为我在这种情况下不想要的父级地址
当我评论这句话时
//Hibernate.initialize(parentDetails.getAddress())强>
我犯了一个错误
org.hibernate.LazyInitializationException:无法初始化代理-无会话
我知道发生上述错误是因为hibernate处理惰性对象,但它的会话在那里不活动
那么我如何在我的应用程序中实现案例1(见上文) 将用户传递给方法,以便您可以检查其属性并在需要时调用initialize?@Gimby如何详细解释将用户传递给方法,以便您可以检查其属性并在需要时调用initialize?@Gimby如何详细解释