2015-10-06 2 views
1

Я довольно новый в JPA и Hibernate, и у меня есть следующая проблема.Почему директива fetch = FetchType.LAZY не работает, когда я возвращаю объект с помощью Hibernate?

в Spring MVC проекта У меня есть этот Tid001Anagpartecipa класса модели, отображающие поля на TID001_ANAGPARTECIPA таблицы, определенной в базе данных:

@Entity 
@Table(name="TID001_ANAGPARTECIPA") 
@NamedQuery(name="Tid001Anagpartecipa.findAll", query="SELECT t FROM Tid001Anagpartecipa t") 
public class Tid001Anagpartecipa implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="PRG_PAR") 
    private Integer prgPar; 

    ................................................................ 
    ................................................................ 
    ................................................................ 

    @Lob @Basic(fetch=FetchType.LAZY) 
    @Column(name="OGG_DOC_ALL") 
    private byte[] oggDocAll; 


    @Lob @Basic(fetch=FetchType.LAZY) 
    @Column(name="OGG_DOC_DEL_ALL") 
    private byte[] oggDocDelAll; 

    ................................................................ 
    ................................................................ 
    GETTER & SETTER METHODS 
    ................................................................ 
    ................................................................ 
} 

Как вы можете видеть на этом столе есть 2 BLOB поля, аннотированные аннотациями @Lob, эти поля содержат 2 файла, хранящихся в БД.

В этом классе также объявлен этот именованный запрос, что получить все Tid001Anagpartecipa объект хранится в виде записи в TID001_ANAGPARTECIPA таблице:

Как вы можете видеть в предыдущем коде Snipper на @Lob поля использовали ленивый стратегия (по @Basic (fetch = FetchType.LAZY)). Поэтому я ожидал, что при получении объекта Tid001Anagpartecipa эти поля 2 @Lob не инициализируются.

В методе контроллера я выполнить эту операцию, извлечь Tid001Anagpartecipa объект:

Tid001Anagpartecipa anagrafica = getAnagraficaPartecipante(model); 
List<Tid002Candidatura> listaCandidatureDB = anagrafica.getTid002Candidaturas(); 

Объект правильно восстановить, но проблема в том, что предыдущий 2 @Lob поля inizialized и я хочу что эти поля не инициализированы (infact Я использовал @Basic (fetch = FetchType.LAZY) директива).

Почему эти поля получены? Что мне не хватает? Как я могу сказать Hibernate, чтобы не получить эти поля @Lob, когда извлекается Tid001Anagpartecipa?

Tnx

ответ

1

Раздел 11.1.6 из JPA спецификации нот в отношении @Basic аннотации:

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

Hibernate делает поддержку отложенной загрузки простых свойств, но требует усиления байт-код, чтобы сделать так:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching-lazyproperties

А без этого:

Если ваши постоянные классы не являются расширенный, Hibernate будет игнорировать ленивые настройки свойств и вернуться к немедленной выборке.

+0

mmm но что я должен изменить в своем коде для работы? – AndreaNobili

+0

Ничего. Вам нужно изменить процесс сборки, чтобы улучшить классы. Если вы используете maven и hibernate> = 4.2.8, вы должны просто иметь доступ к соответствующему плагину для pom.xml. См. Раздел «hibernate-enhance-maven-plugin» здесь https://dzone.com/articles/hibernate-bytecode-enhancement –

0

Что означает ленивый? Это означает, что вещи загружаются по требованию. Существует два способа сделать это: используя прокси (перехватить вызов в прокси и загрузить вещь) или повысить байт-код (измените байт-код класса сущности, чтобы ленивый доступ был перехвачен).

Поскольку вы не можете сделать прокси-сервер для byte[], второй подход является единственным подходящим.

Однако вы можете извлечь лоб отдельному лениво нагруженному объекту, как описано here.

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