EclipseLink: не выбирать некоторые поля по умолчанию - PullRequest
5 голосов
/ 14 октября 2010

Допустим, у нас есть сущность

@Entity
public class Person {
    @Id int id;
    @Basic String name;
    @Basic String remark;
}

Допустим, поле "примечание" заполнено большими текстами, но используется редко. Так что было бы хорошо, если при запуске jpql: SELECT p FROM Person p EclipseLink просто выполняет sql select id, name from person

А потом, когда вы позвоните person.getRemark(), он будет получен с select remark from person where id = ?.

Возможно ли это с EclipseLink 2.1?

Ответы [ 3 ]

4 голосов
/ 14 октября 2010

Вы действительно можете определить атрибут fetch в аннотации Basic и установить его на LAZY. Но позвольте мне процитировать, что спецификация говорит об этом:

11.1.6 Основная аннотация

(...)

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

В конкретном случае EclipseLink поведение будет зависеть от контекста (Java EE против Java SE), как объяснено в Что вам, возможно, нужно знать о EclipseLink JPA Ленивая загрузка .

В среде Java EE (при условии, что контейнер реализует соответствующие контейнерные контракты спецификации EJB 3.0 ):

EclipseLink JPA выполняет отложенную загрузку, когда для атрибута fetch установлено значение javax.persistence.FetchType.LAZY.

В среде Java SE:

По умолчанию EclipseLink JPA игнорирует Атрибут fetch и значение по умолчанию javax.persistence.FetchType.EAGER применяются.

Чтобы настроить EclipseLink JPA для выполнения отложенной загрузки, когда для атрибута извлечения установлено значение FetchType.LAZY, рассмотрите одно из следующих действий:

2 голосов
/ 14 октября 2010

Попробуйте добавить аннотацию @Basic(fetch = FetchType.LAZY)

@Entity
public class Person {
    @Id int id;
    @Basic String name;
    @Basic(fetch = FetchType.LAZY) String remark;
}
1 голос
/ 14 октября 2010

Мы решили эту проблему (при использовании ActiveRecord и Hibernate), поместив большую строку (обычно CLOB или BLOB) в свою собственную таблицу с FK в основную таблицу (Person в данном случае). Затем она работает так, как вы хотите.

...