2

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

MyClass myObject = MyClassDAO.getUnproxiedObject(objectID);

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

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

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

4

3 回答 3

0

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

于 2011-04-28T05:33:22.877 回答
0

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

于 2011-04-30T04:05:44.443 回答
0

hibernate 在使用 GSON 渲染时不取消代理的原因是 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);
        }
    }
}
于 2012-03-08T20:55:07.387 回答