5

目标

  1. 在不使用本机 SQL 的情况下在 Hibernate 中调用CREATE TEMPORARY TABLE语句。这意味着只使用 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. 删除临时表。

有什么想法吗?

4

1 回答 1

1

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

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

于 2011-06-18T21:06:40.263 回答