Как создать временные таблицы в режиме гибернации?
-
17-09-2020 - |
Вопрос
Цель
- Вызвать
CREATE TEMPORARY TABLE
оператор в режиме гибернации без использования собственного SQL.Это означает использование только API HQL или Hibernate. - Сохраните объекты во временной таблице.
- Вызовите хранимую процедуру, которая использует существующие таблицы и временную таблицу.
DROP
временная таблица, когда закончите.(Я знаю, что в этом нет необходимости, но я думаю, что это хорошая привычка.)
Предыстория
- Я очень хорошо знаком с SQL, но новичок в Hibernate.
- Я вынужден использовать Hibernate в проекте из-за, знаете ли, чьего-то решения.
- Я собираюсь сохранить веб-форму в базе данных Oracle.
- Веб-форма содержит таблицу, полную текстовых полей (разработанных кем-то другим), по одному в каждой ячейке.
- Когда пользователь нажимает
Save
, значения ДОЛЖЕН быть сохраненным в рамках одной транзакции. - Веб-форма поддерживается представлением базы данных.
- Представление базы данных создается из таблицы базы данных с использованием шаблона EAV.(Это делается так потому, что столбцы каким-то образом динамичны.)
- Каждое текстовое поле в веб-форме моделируется одной строкой в таблице базы данных.
- Отображение веб-формы использует
SELECT
заявления о представлении. - Обновление веб-формы использует
UPDATE
утверждения о представлении, которое вызываетINSTEAD OF
триггер представления. - Обновляются только измененные значения.Для каждого обновления существует журнал аудита.
- Если какое-либо из значений обновляется другим пользователем без уведомления пользователя, транзакция откатывается.Вот пример такого сценария:
(I)
значение a равно4
когда пользователь отображает веб-форму(II)
другой пользователь обновляет то же поле, чтобы5
(III)
первый пользователь обновляет поле следующим образом2
и отправляет веб-форму.
Первоначально Предложенное Решение
- Используйте AJAX (jQuery) для обнаружения изменений в текстовых полях и отправки только тех, которые были изменены пользователем.
- Однако изменения, внесенные другим пользователем, должны быть обнаружены в базе данных.
Решение Должно работать лучше
- Когда пользователь нажимает
Save
, создайте временную таблицу (временная таблица - это таблица, видимая только текущим сеансом / подключением и автоматически удаляемая при закрытии сеанса / при отключении) и сохраните объекты (ячейки) во временной таблице. - Начните транзакцию.
- Заблокируйте некоторые из существующих таблиц (или только связанные строки, для повышения производительности).
- Сравните представленные данные с существующими.
- Если было внесено какое-либо незамеченное изменение, откатите транзакцию.
- Обновите необходимые строки.
- Зафиксируйте транзакцию и разблокируйте таблицы.
- Удалите временную таблицу.
Есть ли какие-нибудь идеи?
Решение
Это не соответствует вашим точным требованиям, но учитывая, что попыток найти ответ не было...рассматривали ли вы возможность использования временной CSV-таблицы, используя что-то вроде http://csvjdbc.sourceforge.net/.
Хотя это не соответствует требованию делать это через hibernate, оно не зависит от базы данных и является кроссплатформенным.
Не связан с StackOverflow