2009-02-04 4 views
1

Есть ли способ уменьшить ненужные/пустые поля в SQL-вставках и обновлениях SQL?Оптимизация сущностей спящего режима?

Например, у меня есть один класс сущности спящего режима, сопоставленный с таблицей, содержащей 10 столбцов. Заполнение данных фактически выполняется в два этапа. Когда пользователь отправляет запрос, я вставляю информацию запроса в таблицу с помощью объекта спящего режима, но заполняя только 7 полей. После некоторой обработки (например, ожидание взаимодействия с другими пользователями) я заполню оставшиеся 3 поля (с идентификатором, указанным в предыдущей вставке).

Если я придерживаться одного класса сущностей, для второго обновления, шаги, которые я сделать это следующим образом:

1) Загрузите объект, идентифицированный идентификатором

2) Сохранить объект, который генерирует sql, который, кажется, отправляет все поля.

В качестве альтернативы, я создал два класса сущностей и указываю на одну и ту же таблицу и сохраняю их отдельно.

Есть ли у кого лучшее предложение?

Kent

Edit:

То, что я действительно хотел бы достичь, это то, что к следующему эффекту: (??,) вставки т (идентификатор, field1, field2) обновление т набор field3 знак равно Field4 =? где id =?

Лучшее, что я мог бы достигнуть теперь с dynamicUpdate = верно, вставка т (идентификатор, field1, field2) (?,?,?) выберите field1, field2, field3, Field4 от т, где ID =? обновление t set field3 =? Field4 =? где id =?

Есть ли способ устранить этот запрос выбора? Исходный сохраняемый объект не сохраняется в памяти после вставки.

Дополнительное примечание. Класс entity аннотируется с помощью проверки Hibernate. В настоящее время я пытаюсь достичь вышеуказанного желаемого эффекта, поэтому я прокомментировал их. Но когда я верну их обратно, я получаю ошибки проверки из-за @NotNull и @NotEmpty.

+0

dynamicUpdate = true работает отлично. – sqlnewbie

ответ

3

Если добавить аннотацию:

@org.hibernate.annotations.Entity(dynamicUpdate = true) 

к верхней части лица только поля, которые были изменены будут отправлены в базу данных.

+0

Я пробовал, и он работает. Но есть ли способ устранить тот шаг, на котором я должен сначала загрузить объект? Я хотел бы исключить дополнительный оператор select в базу данных (предполагая, что сущность не кэшируется в сеансе) –

+0

Я уверен, что для этого есть некоторые хаки. (например, сохраните исходный объект где-нибудь, а затем выполните слияние или используйте массовое обновление) Однако, если дополнительный запрос выбора беспокоит вас, возможно, спящий режим не является правильным выбором. Для меня это вопрос производительности и ремонтопригодности. – Sam

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