目标
- 在不使用本机 SQL 的情况下在 Hibernate 中调用
CREATE TEMPORARY TABLE
语句。这意味着只使用 HQL 或 Hibernate API。 - 将对象保存到临时表。
- 调用使用现有表和临时表的存储过程。
DROP
完成后的临时表。(我知道这没有必要,但我认为这样做是一个好习惯。)
背景
- 我对 SQL 非常熟悉,但对 Hibernate 很陌生。
- 由于某人的决定,我被迫在项目中使用 Hibernate。
- 我要将 Web 表单保存到 Oracle 数据库。
- Web 表单包含一个充满文本字段的表格(由其他人设计),每个单元格中都有一个。
- 当用户单击
Save
时,值必须保存在单个事务中。 - Web 表单由数据库视图备份。
- 数据库视图是使用 EAV 模式从数据库表创建的。(这样做是因为列在某种程度上是动态的。)
- Web 表单中的每个文本字段都由数据库表中的一行建模。
- 显示 Web 表单使用
SELECT
视图上的语句。 - 更新 Web 表单使用
UPDATE
视图上的语句,该语句调用视图的INSTEAD OF
触发器。 - 仅更新更改的值。每次更新都有一个审计跟踪。
- 如果其他用户在未通知用户的情况下更新了任何值,则事务将回滚。下面是这种情况的一个示例:a
(I)
的值是4
当用户显示 Web 表单时,(II)
另一个用户将相同的字段更新到5
(III)
第一个用户更新该字段2
并提交 Web 表单。
最初提出的解决方案
- 使用 AJAX (jQuery) 检测文本字段中的更改,并仅提交用户更改的内容。
- 但是,需要在数据库中检测到另一个用户所做的更改。
解决方案应该工作得更好
- 当用户单击
Save
时,创建一个临时表(临时表是仅由当前会话/连接看到的表,并在会话关闭/断开连接时自动删除)并将对象(单元格)保存到临时表中。 - 开始交易。
- 锁定一些现有的表(或只锁定相关的行,以提高性能)。
- 将提交的数据与现有数据进行比较。
- 如果进行了任何未被注意到的更改,则回滚事务。
- 更新必要的行。
- 提交事务并解锁表。
- 删除临时表。
有什么想法吗?