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