Как получить незащищенный объект EAGER в Hibernate? - PullRequest
2 голосов
/ 28 апреля 2011

Я хочу загрузить объект и забыть, что он приходит из спящего режима! Вот и все, я просто сделать что-то как:

MyClass myObject = MyClassDAO.getUnproxiedObject(objectID);

и у меня есть настоящий экземпляр myObj (а не из прокси Hibernate) со всеми атрибутами, установленными со значениями из базы данных, так что я не могу отличить его от созданного вручную объекта.

В этой теме присутствует метод для создания незащищенного объекта, но он не рассматривает проблему энергичного кодирования объектов, что, я полагаю, необходимо для достижения моих конечных целей.

Для тех, кто интересуется, зачем мне такие объекты, мне нужно затем сериализовать Json с Gson, но я думаю, что это будет иметь много других применений для многих людей.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2011

после тестирования я обнаружил, что метод, приведенный в цитатном посте, сделал именно то, что я искал.

0 голосов
/ 09 марта 2012

Причина, по которой hibernate не использует прокси-сервер при рендеринге с GSON, заключается в том, что GSON использует отражение для сериализации полей, а не с помощью методов получения объекта Hibernate.Чтобы обойти это, вам нужно зарегистрировать новый 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);
        }
    }
}
0 голосов
/ 28 апреля 2011

Используйте FetchType.EAGER для активной загрузки всех отношений. Специально для сериализации JSON, если вы создаете веб-приложение, рассмотрите возможность использования перехватчика OpenSessionInView для ваших HTTP-запросов.

...