2016-06-24 2 views
3

У меня есть два объекта сущности и между ними есть одна иная связь.Спящий режим: от одного до многих getId() не для получения объекта конкурирования

Назовём их "One" и "Многие". Я установил выбор как «Lazy».

Так что, когда у меня есть «много» объект и попытаться получить идентификатор «Один» объект Hibernate внутренне принес полный объект. Принимая во внимание, что он может дать мне Id только на основе сущности «Много», потому что он будет содержать идентификатор «Один». Идентификатор «One» является первичным ключом, и внешний ключ в «Многие»

many.getOne().getId() //fetches complete "One" object 

Можно ли и как?

+0

Невозможно получить только идентификатор. Спящий режим работает с объектами не со свойствами – Jens

+0

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

ответ

4

Возможно, конечно. Вы можете использовать FetchType.LAZY и получить id таким путем:

LazyInitializer initializer = ((HibernateProxy) many.getOne()).getHibernateLazyInitializer(); 
Long id = (Long) initializer.getIdentifier(); 

Он будет работать только с внешними ключами ассоциаций, а не вступать в таблице ассоциаций.

Или вы можете использовать HQL или критерии с проекцией, чтобы получить только id.

+0

Ницца, никогда не думал, что мы можем работать с lazys вот так! – VLef

+0

@VLef Hibernate имеет внешний ключ, так как он находится в одной таблице. Но, конечно, он не будет работать с таблицами соединений. –

+0

Конечно, но этот внешний ключ полностью скрыт по умолчанию без загрузки сущности, именно поэтому это приятно, наконец, знать способ, чтобы получить его =) – VLef

2

Вы должны написать запрос HQL и выбрать только идентификаторы.

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