我正在使用 hibernate 4.3 。我的应用中现在的情况是 我有一个父表,它包含从地址表引用的外键。在中有 @ManyToOne(fetch = FetchType.LAZY)的地址家长 DTO。现在我想要的是
案例1)我需要在类型为父登录的用户时从父表中获取数据,但在这种情况下不想加载地址。
案例2)当父母去编辑他/她的个人信息时,我需要加载父以及地址
我尝试了暂停代码
的Servlet
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 (见上文)。