2015-05-29 2 views
1

Предположим, у меня есть таблица «ученик» в БД, которая очень БОЛЬШАЯ. В студенте есть несколько столбцов, включая 'id' и 'class-id'.Можно ли добавить параметр в спящий сгенерированный запрос?

В HBM файл я в настоящее время имеют defenter код hereinition так:

<id name="id" column="ID" type="long"> 
 
      <generator class="native"> 
 
       <param name="sequence">student_ID_SEQ</param> 
 
       <param name="max_lo">999</param> 
 
      </generator> 
 
</id> 
 
<property name="class-id" column="class-id" not-null="true" insert="true" update="true"/>

В этом случае, если я обновлю студента сохраняется класс, то запрос будет как:

update .... set .... where ID={id} 

Но для того, чтобы разделить причину, я хочу также включить идентификатор класса в запрос, например:

update .... set .... where ID={id} and class-id={class-id} 

Я пробовал составной идентификатор, но заметил, что генератор не разрешен в составном id, потому что составные идентификаторы обычно основаны на назначении, а не на основе генератора.

Итак, мне просто интересно, возможно ли добавлять параметры в спящие сгенерированные запросы?

ответ

1

Нет, к сожалению, в Hibernate нет ничего подобного.

На самом деле очень сложно использовать разделение базы данных вместе с Hibernate из-за того, как Hibernate читает связанные объекты. Предположим, что у нас есть сущность A со множеством-к-одному сопоставлением с объектом B. Когда Hibernate читает объект A, он автоматически считывает объект B. Это зависит от плана и стратегии выборки, как и когда B точно загружается из базы данных, но в любом случае это запрос, который не будет содержать столбец раздела в предложении where (если составные первичные ключи не используются).

Надеюсь, что будущие версии Hibernate будут учитывать это.

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

Кроме того, в зависимости от того, для чего вы используете разделение, вы можете создавать представления базы данных, которые включают в себя условие раздела, а затем сопоставлять объекты Hibernate с представлениями.

Или, как вы упомянули, и я бы также сказал, что это самый простой способ при других обстоятельствах, вы можете использовать составные первичные ключи и использовать свою собственную реализацию генератора id (на самом деле это не должно быть сложно реализуйте одно, если это ваша единственная причина не рассматривать составные идентификаторы).

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