如何在 Hibernate 中创建临时表?

Siu*_*ji- 5 stored-procedures hibernate transactions temp-tables database-versioning

目标

  1. CREATE TEMPORARY TABLE在不使用本机 SQL 的情况下调用Hibernate 中的语句。这意味着仅使用 HQL 或 Hibernate API。
  2. 将对象保存到临时表。
  3. 调用一个使用现有表和临时表的存储过程。
  4. DROP完成后的临时表。(我知道没有必要,但我认为这样做是一个好习惯。)

背景

  1. 我对 SQL 非常熟悉,但对 Hibernate 不熟悉。
  2. 由于某人的决定,我被迫在项目中使用 Hibernate。
  3. 我要将 Web 表单保存到 Oracle 数据库。
  4. Web 表单包含一个充满文本字段(由其他人设计)的表格,每个单元格中都有一个。
  5. 当用户单击 时Save,值必须保存在单个事务中。
  6. Web 表单由数据库视图支持。
  7. 数据库视图是使用 EAV 模式从数据库表创建的。(这样做是因为列在某种程度上是动态的。)
  8. Web 表单中的每个文本字段都由数据库表中的一行建模。
  9. 显示 Web 表单使用SELECT视图上的语句。
  10. 更新 Web 表单使用UPDATE视图上的语句,它调用视图的INSTEAD OF触发器。
  11. 仅更新更改的值。每个更新都有一个审计跟踪。
  12. 如果其他用户在没有通知的情况下更新了任何值,则事务将回滚。以下是此类场景的示例:a(I)的值是4当用户显示 Web 表单时,(II)另一个用户将同一字段更新为5 (III)第一个用户更新该字段2并提交 Web 表单。

最初提出的解决方案

  1. 使用 AJAX (jQuery) 检测文本字段中的更改,并仅提交用户更改的内容。
  2. 但是,需要在数据库中检测其他用户所做的更改。

应该更有效的解决方案

  1. 当用户点击 时Save,创建一个临时表(临时表是一个只有当前会话/连接才能看到的表,在会话关闭/断开时自动删除)并将对象(单元格)保存到临时表中。
  2. 开始交易。
  3. 锁定一些现有表(或仅相关行,以提高性能)。
  4. 将提交的数据与现有数据进行比较。
  5. 如果发生了任何未引起注意的更改,请回滚事务。
  6. 更新必要的行。
  7. 提交事务并解锁表。
  8. 删除临时表。

有什么想法吗?

P H*_*ans 1

这并不能满足您的确切要求,但考虑到没有尝试给出答案...您是否考虑过使用类似http://csvjdbc.sourceforge.net/的临时 CSV 表。

虽然它不符合通过 hibernate 执行此操作的要求,但它与数据库无关且跨平台。