仅在需要时加载延迟对象

时间:2016-11-10 09:16:41

标签: java hibernate hibernate-mapping

我正在使用 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 (见上文)。

0 个答案:

没有答案