Вопрос

Цель

  1. Вызвать CREATE TEMPORARY TABLE оператор в режиме гибернации без использования собственного SQL.Это означает использование только API HQL или Hibernate.
  2. Сохраните объекты во временной таблице.
  3. Вызовите хранимую процедуру, которая использует существующие таблицы и временную таблицу.
  4. DROP временная таблица, когда закончите.(Я знаю, что в этом нет необходимости, но я думаю, что это хорошая привычка.)

Предыстория

  1. Я очень хорошо знаком с SQL, но новичок в Hibernate.
  2. Я вынужден использовать Hibernate в проекте из-за, знаете ли, чьего-то решения.
  3. Я собираюсь сохранить веб-форму в базе данных Oracle.
  4. Веб-форма содержит таблицу, полную текстовых полей (разработанных кем-то другим), по одному в каждой ячейке.
  5. Когда пользователь нажимает Save, значения ДОЛЖЕН быть сохраненным в рамках одной транзакции.
  6. Веб-форма поддерживается представлением базы данных.
  7. Представление базы данных создается из таблицы базы данных с использованием шаблона EAV.(Это делается так потому, что столбцы каким-то образом динамичны.)
  8. Каждое текстовое поле в веб-форме моделируется одной строкой в таблице базы данных.
  9. Отображение веб-формы использует SELECT заявления о представлении.
  10. Обновление веб-формы использует UPDATE утверждения о представлении, которое вызывает INSTEAD OF триггер представления.
  11. Обновляются только измененные значения.Для каждого обновления существует журнал аудита.
  12. Если какое-либо из значений обновляется другим пользователем без уведомления пользователя, транзакция откатывается.Вот пример такого сценария: (I) значение a равно 4 когда пользователь отображает веб-форму (II) другой пользователь обновляет то же поле, чтобы 5 (III) первый пользователь обновляет поле следующим образом 2 и отправляет веб-форму.

Первоначально Предложенное Решение

  1. Используйте AJAX (jQuery) для обнаружения изменений в текстовых полях и отправки только тех, которые были изменены пользователем.
  2. Однако изменения, внесенные другим пользователем, должны быть обнаружены в базе данных.

Решение Должно работать лучше

  1. Когда пользователь нажимает Save, создайте временную таблицу (временная таблица - это таблица, видимая только текущим сеансом / подключением и автоматически удаляемая при закрытии сеанса / при отключении) и сохраните объекты (ячейки) во временной таблице.
  2. Начните транзакцию.
  3. Заблокируйте некоторые из существующих таблиц (или только связанные строки, для повышения производительности).
  4. Сравните представленные данные с существующими.
  5. Если было внесено какое-либо незамеченное изменение, откатите транзакцию.
  6. Обновите необходимые строки.
  7. Зафиксируйте транзакцию и разблокируйте таблицы.
  8. Удалите временную таблицу.

Есть ли какие-нибудь идеи?

Это было полезно?

Решение

Это не соответствует вашим точным требованиям, но учитывая, что попыток найти ответ не было...рассматривали ли вы возможность использования временной CSV-таблицы, используя что-то вроде http://csvjdbc.sourceforge.net/.

Хотя это не соответствует требованию делать это через hibernate, оно не зависит от базы данных и является кроссплатформенным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top