Как создать временные таблицы в Hibernate? - PullRequest
4 голосов
/ 19 июля 2010

Цель

  1. Вызовите оператор CREATE TEMPORARY TABLE в Hibernate без использования собственного SQL. Это означает использование только HQL или Hibernate API.
  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. Удалите временную таблицу.

Есть идеи?

1 Ответ

1 голос
/ 19 июня 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...