Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JPA, Hibernate, persistence, FetchType, FetcType.LAZY & fetch all properties 
:(
    Опции темы
LLIbIcpEP
Дата 20.10.2010, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Доброго времени суток. Есть такое дело:
Код

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Unit {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @NotNull(message = "id is required")
    @Column(nullable = false, unique=true)
    private Long id;

Код

@Entity
public class MessageDependency extends Unit {
    
    @ManyToOne(fetch=FetchType.LAZY)
    @NotNull(message = "Owner is required")
    private UserInstance owner;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @NotNull(message = "Dependency is required")
    private Unit dependency;

Код

@Entity
public class UserInstance extends Unit {
    
    @NotNull(message = "uid is required")
    @Column(nullable = false, unique=true)
    @Min(1)
    private Long uid;

Древо наследования достаточно большое, UserInstance - прямой наследник Unit, поле dependency может содержать все что угодно, унаследованное от Unit. Делаю примерно так:
Код

UserInstance userInstance = entityManager.createQuery(
    "select u from UserInstance u where u.uid = :p0", UserInstance.class)
        .setParameter("p0", 1l).getSingleResult();
mess = entityManager.createQuery(
    "select m from MessageDependency m fetch all properties where m.owner = :p0",
        MessageDependency.class).setParameter("p0", userInstance).getResultList();

Потом сериализую полученный лист в JSON через XStream. Вообщем в итоге у меня поле dependency сериализуется как прокси, не смотря на "fetch all properties" в HQL. Почему "fetch all properties" игнорируется? Пробовал Hibernate.initialize(), пробовал @Fetch(FetchMode.SELECT). Не помогает. Поле owner сериализуется нормально, но только за счет того, что я его явно запросил перед этим. Делать так для dependency не получится - там может быть все, что угодно, и заранее я не знаю, какие там могут быть поля.
Помогите, пожалуйста. Заранее благодарен.
PM MAIL   Вверх
LLIbIcpEP
Дата 23.10.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Пока решил проблему такими костылями:
Код
    public static <T extends Unit> T loadUnitFields(T unit) throws ApiException {
        Hibernate.initialize(unit);
        Class<? extends Unit> clasz = unit.getClass();
        while (true) {
            Field[] tmp = clasz.getDeclaredFields();
            for (Field field : tmp) {
                try {
                    if (Unit.class.isAssignableFrom(field.getType())) {
                        field.setAccessible(true);
                        Unit thisUnit = (Unit) field.get(unit);
                        if (thisUnit != null) {
                            thisUnit = DataRepositoryProducer.findUnit(Unit.class, thisUnit.getId());
                            field.set(unit, loadUnitFields(thisUnit));
                        }
                    }
                } catch (Exception e) {
                    throw new ApiException(e);
                }
            }
            if (clasz.equals(Unit.class)) {
                break;
            } else {
                clasz = (Class<? extends Unit>) clasz.getSuperclass();
            }
        }
        return unit;
    }

Это конечно костыли, при том не самые изящные.
Все таки интересно, почему игнорируется "fetch all properties". Ведь в документации написано, что это как-раз и служит для моей цели. Или оно опять-же не работает рекурсивно? Не грузит поля полей? Но я не вижу разницы в возвращаемых данных без и с "fetch all properties".
Очень хочется решить проблему правильно, средствами хибера. Но если что, укажите хотя-бы на ошибки в костылях...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0876 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.