2017-02-13 18 views
2

Hibernate 5.0.10 Я подграф определил, что выглядит следующим образом:Как ограничить столбцы, используемые в графе сущности Hibernate

@NamedSubgraph(name = "proc", attributeNodes = { @NamedAttributeNode("name"), @NamedAttributeNode("childTable1"), @NamedAttributeNode("childTable2"), @NamedAttributeNode("childTable3"), @NamedAttributeNode("childTable4") }),

Проблема в том, что при использовании этого подграфа, я получаю вернуть все атрибуты, определенные в корневой таблице (где существует имя), а не только атрибуты подграфа, которые я указал. Есть ли способ сказать, что спящий режим не привезет этих детей? Мой запрос выглядит так же, как select rec from records rec join rec.proc

ответ

2
  1. Если вы говорите об основных типах, то, по умолчанию, Hibernate будет всегда за ними. Единственный способ включить ленивую загрузку базового типа - использовать усиление байт-кода, как описано в this article.
  2. Если вы говорите об ассоциациях EAGER, то Hibernate не может переопределить их до LAZY, даже если стандарт JPA говорит, что он должен.

Оба варианта 1. и 2. не являются обязательными требованиями с точки зрения JPA, поскольку LAZY является лишь намеком для поставщика JPA.

В целом, графы сущности JPA являются субоптимальным способом получения данных. Avoiding EAGER associations, using subentities и проекции DTO намного лучше, чем диаграммы сущностей.

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

+0

Ну, в этом случае нетерпевая загрузка является лишь частью проблемы. Мне интересен подход DTO. Вы говорите о сопоставлении набора результатов с сущностью? Вместо 'Object []'? –

+0

Кроме того, если посмотреть на улучшение байт-кода, мне все равно понадобится '@Basic (LAZY)' для атрибутов? –

+0

Вы можете преобразовать результат непосредственно в DTO, используя предложение конструктора или Hibernate 'ResultTransformer'. Что касается BE, я думаю, вам нужно '@Basic (LAZY)', чтобы включить ленивую загрузку для атрибутов. В противном случае основными атрибутами являются EAGER. –

0

Я написал статью обо всех проблемах, которые могут возникнуть при использовании модели сущности here, если вы заинтересованы. Поэтому, в общем, вы должны избегать этого, если это возможно. Возможно, вы дадите Blaze-Persistence Entity Views попытку, которая в данном случае является прецедентом. Вы можете определить целевую структуру, то есть DTO, как атрибуты интерфейса и карты для выражений JPQL. Это также поддерживает коллекции и т. Д., Но работает на уровне JPQL вместо уровня SQL.