【问题标题】:how to obtain an unproxied and EAGER fetched object in Hibernate?如何在 Hibernate 中获取未经代理和 EAGER 获取的对象?
【发布时间】:2011-04-28 05:10:01
【问题描述】:

我想加载一个对象并忘记它来自休眠!就是这样,我只是做一些事情:

MyClass myObject = MyClassDAO.getUnproxiedObject(objectID);

而且我有一个真实的 myObj 实例(而不是来自 Hibernate 代理),所有属性都设置为数据库中的值,因此我无法将它与手动创建的对象区分开来。

this thread 中,存在一个创建未代理对象的方法,但它没有处理急切加载对象的问题,我认为这是实现我的最终目标所必需的。

对于那些想知道为什么我想要这样的对象的人,我需要用 Gson 序列化到 Json,但我认为它对很多人来说还有很多其他用途。

【问题讨论】:

  • 如果你递归地预先获取所有关系,你最终可能会加载整个数据库!

标签: json hibernate serialization gson proxy-classes


【解决方案1】:

使用FetchType.EAGER 急切地加载所有关系。特别是对于 JSON 序列化,如果您正在构建 Web 应用程序,请考虑使用 OpenSessionInView 拦截器来处理您的 HTTP 请求。

【讨论】:

    【解决方案2】:

    经过测试,我发现引用帖子中给出的方法完全符合我的要求。

    【讨论】:

      【解决方案3】:

      使用 GSON 进行渲染时,hibernate 不取消代理的原因是 GSON 使用反射来序列化字段,而不是使用 Hibernate 对象的 getter。要解决此问题,您需要注册一个新的 TypeHierarchyAdapter,以便在 GSON 序列化时取消代理该对象。

      这是我的方法:

      GsonBuilder builder = new GsonBuilder();
      builder.registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxySerializer());
      String jsonLove = gson.toJson(objToSerialize);
      

      这是 HibernateProxySerializer:

      public class HibernateProxySerializer implements JsonSerializer<HibernateProxy> {
      
          @Override
          public JsonElement serialize(HibernateProxy proxyObj, Type arg1, JsonSerializationContext arg2) {
              try {
                  GsonBuilder gsonBuilder = new GsonBuilder();
                  //below ensures deep deproxied serialization
                  gsonBuilder.registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxySerializer());
                  Object deProxied = proxyObj.getHibernateLazyInitializer().getImplementation();
                  return gsonBuilder.create().toJsonTree(deProxied);
              } catch (Exception e) {
                  throw new RuntimeException(e);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-12
        • 2012-06-20
        • 1970-01-01
        • 2010-11-08
        • 2023-03-16
        • 1970-01-01
        • 2015-06-05
        • 1970-01-01
        相关资源
        最近更新 更多