2

オブジェクトをロードしたいのですが、それが休止状態からのものであることを忘れてしまいます! それだけです、私は次のように何かをします:

MyClass myObject = MyClassDAO.getUnproxiedObject(objectID);

そして、データベースからの値で設定されたすべての属性を持つ myObj (Hibernate プロキシからではなく) の実際のインスタンスがあるため、手動で作成されたオブジェクトと区別できません。

このスレッドでは、プロキシされていないオブジェクトを作成するためのメソッドが存在しますが、最終的な目標を達成するために必要であると思われる、オブジェクトの熱心な読み込みの問題は処理されません。

なぜそのようなオブジェクトが必要なのか疑問に思っている人のために、Gson を使用して Json にシリアル化する必要がありますが、多くの人にとって他の多くの用途があると思います。

4

3 に答える 3

0

テストした後、引用された投稿に記載されている方法がまさに私が探していたものであることがわかりました。

于 2011-04-30T04:05:44.443 に答える
0

GSON でのレンダリング中に hibernate が de-proxy しない理由は、GSON が Hibernate オブジェクトのゲッターを使用するのではなく、リフレクションを使用してフィールドをシリアル化するためです。回避するには、GSON がシリアル化するときにオブジェクトのプロキシを解除する新しい TypeHierarchyAdapter を登録する必要があります。

これが私のアプローチです:

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 に答える
0

FetchType.EAGERすべてのリレーションを熱心にロードするために使用します。特に JSON シリアル化の場合、Web アプリケーションを構築している場合は、HTTP 要求に OpenSessionInView インターセプターを使用することを検討してください。

于 2011-04-28T05:33:22.877 に答える