2015-10-16 2 views
3

Я использую Play Framework v.1.2.6 для проекта, и у меня возникают проблемы с спящим объектом, когда я пытаюсь извлечь их из базы данных. https://www.playframework.com/documentation/1.2.x/jpaОбъекты JPA persistence и Hibernate javassist

У меня есть запрос, который выбирает строки из таблицы mysql, и в результате есть прокси-объекты. См. Изображение ниже. enter image description here

Я не использую конфигурационный файл Hibernate. Я использую только @Annotations в моем классе модели.

Пример моего запроса:

static List<User> getAllUsersFromAccount(Account account) { 
    return User.find(
      "SELECT u " + 
      "FROM User u " + 
      "WHERE u.account=?", 
      account).fetch(); 
} 

Кто-нибудь знает, как я могу избежать прокси-объектов в результатах запроса?

Теперь мы перебираем массив пользователей и проверяем, является ли сущность экземпляром HibernateProxy. Мы не хотим этого делать, потому что, возможно, у нас такая же проблема и для других запросов.

private static <T> T initializeAndUnproxy(T entity) { 
    Hibernate.initialize(entity); 
    if(entity instanceof HibernateProxy) { 
     entity = (T)((HibernateProxy)entity).getHibernateLazyInitializer().getImplementation(); 
    } 
    return entity; 
} 
+0

Св хороший вопрос с или без контекста, но не могли бы вы объяснить, почему так или иначе вы спрашиваете об этом? Должно ли позднее предотвращать ленивые ошибки init? – Gimby

+0

Когда мой код пытается сериализовать класс, я получаю такие ошибки, как «Попытка сериализации java.lang.Class: org.hibernate.proxy.HibernateProxy. Забыл зарегистрировать адаптер типа?». У нас есть запрос и сериализация по всему проекту и прекрасно работает. Мне кажется, что это происходит только с результатом этого пользовательского запроса, который очень странный. –

+0

Это похоже на то, что в объекте есть что-то, что невозможно для сериализации. У вас есть какие-либо свойства, которые сделаны Transient (как в: не сохраняются)? – Gimby

ответ

0

Вы можете использовать ключевое слово JOIN FETCH в вашем запросе JPQL/HQL. В вас, например, если вы не хотите иметь дело с прокси-объекты вместо объектов реального счета добавить «JOIN FETCH u.account»

static List<User> getAllUsersFromAccount(Account account) { 
    return User.find(
      "SELECT u " + 
      "FROM User u " + 
      "JOIN FETCH u.account " + 
      "WHERE u.account=?", 
      account).fetch(); 
} 
+0

Проблема заключается в том, что объекты User возвращаются как объекты-прокси, которые являются странными. –

+1

Возможно ли, что пользователи с идентификаторами 102 и 106 были загружены ранее в сеансе и проксимизованы? – antonu17

+0

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

Смежные вопросы