2014-09-30 5 views
1

Текущая установка:Mapping Один ко многим из другой таблицы

Entity A: 

fieldA; 
@OneToMany(mappedBy="fieldA") 
List<B> Bs; 


Entity B: 

fieldA; 
fieldB; 
fieldX; 

Entity А отображает таблицу А, и Entity B карты в таблице В. FieldA является основным ключом к таблице А, и & FieldB поля А составляют составные первичные ключи в таблице B

Проблема заключается в том, что при загрузке A этой установкой мы возвращаем тысячи объектов в списке B, в то время как нам остается только знать, какое значение fieldB находится в объекте B Чтобы сохранить память, мы хотим иметь List of FieldB, а не List of Bs в сущности A и полностью избавиться от th e объект класса B.

Так выглядит более как этот

Entity A: 

fieldA; 
List<fieldB> Bs; 

Возможно ли это? Ну, конечно, я надеюсь, но я точно не знаю. Будет ли @SecondaryTable с аннотацией, как:

@SecondaryTables({ 
    @SecondaryTable(name="Table B", pkJoinColumns={ 
      @PrimaryKeyJoinColumn(name="fieldA")} 
    ) 

с

@JoinColumn(name="fieldB", table="Table B") 
List<fieldB> Bs; 

сделать трюк? Проблема в том, что я все еще хочу иметь сопоставление отношений @OneToMany, поэтому я думаю, что мне нужно включить это где-то также.

Чтобы быть ясным, я хочу избавиться от класса B от моего кода Java и переместить поле B в класс A, поддерживая отношения @OneToMany. Но все же уметь читать Список и сохранить его обратно в таблицу B.

ответ

0

Вот как работает Hibernate. Он по умолчанию загружает все свойства объектов (кроме коллекций, которые лениво загружаются). Является ли ваше приложение настолько ограниченным в памяти, которое вы хотите оптимизировать на этом уровне?

То, что вы запрашиваете, возможно только в том случае, если вы пишете классы-оболочки, которые вы заполняете с помощью costum HQL.

Вот некоторые вещи, которые вы можете сделать:

  • Используйте lazy property fetching игнорировать ненужные поля.
  • Используйте пользовательский запрос HQL, который возвращает пользовательский объект только с полями . Link
+0

Вы говорите, что это невозможно сделать без написания класса обертки? FieldB - всего лишь примитив. Было бы гораздо полезнее память, чтобы вернуть поле B, а не даже класс-оболочку fieldB. Мы возвращаем сотни тысяч объектов в этот список, поэтому память вызывает беспокойство. – James

+0

Чтобы быть ясным, я хочу избавиться от класса B от кода Java и переместить поле B в класс A, поддерживая отношения @OneToMany. Но все же сможете прочитать список и вернуть его обратно в таблицу B. – James

+0

Да, это то, что я говорю. Если вы хотите работать на таком уровне оптимизации, избегайте Hibernate вообще! Кроме того, не стоит загружать сотни тысяч записей в память, вы обычно используете разбиение на страницы для таких случаев. – isah

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