如何在Hibernate中创建临时表?

时间:2010-07-19 03:01:46

标签: stored-procedures transactions temp-tables database-versioning hibernate

目标

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

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

      1. 使用AJAX(jQuery)检测文本字段中的更改,并仅提交用户更改的更改。
      2. 但是,需要在数据库中检测到其他用户所做的更改。
      3. 解决方案应该更好地运作

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

1 个答案:

答案 0 :(得分:1)

这不符合您的确切要求,但考虑到没有尝试答案......您是否考虑使用http://csvjdbc.sourceforge.net/之类的临时CSV表。

虽然它不符合通过hibernate执行它的要求,但它是数据库不可知的和跨平台的。