Stored procedures 如何在Hibernate中创建临时表?

Stored procedures 如何在Hibernate中创建临时表?,stored-procedures,transactions,temp-tables,database-versioning,hibernate,Stored Procedures,Transactions,Temp Tables,Database Versioning,Hibernate,目标 在Hibernate中调用CREATE TEMPORARY TABLE语句,而不使用本机SQL。这意味着只使用HQL或HibernateAPI 将对象保存到临时表 调用使用现有表和临时表的存储过程 完成后,放下临时表。(我知道没有必要,但我认为这样做是一个好习惯。) 背景 我非常熟悉SQL,但对Hibernate还不熟悉 我被迫在项目中使用Hibernate,因为,你知道,有人的决定 我将把一个web表单保存到Oracle数据库中 web表单包含一个充满文本字段(由其他人设计)的表,每个单

目标

  • 在Hibernate中调用
    CREATE TEMPORARY TABLE
    语句,而不使用本机SQL。这意味着只使用HQL或HibernateAPI
  • 将对象保存到临时表
  • 调用使用现有表和临时表的存储过程
  • 完成后,放下
    临时表。(我知道没有必要,但我认为这样做是一个好习惯。)
  • 背景

  • 我非常熟悉SQL,但对Hibernate还不熟悉
  • 我被迫在项目中使用Hibernate,因为,你知道,有人的决定
  • 我将把一个web表单保存到Oracle数据库中
  • web表单包含一个充满文本字段(由其他人设计)的表,每个单元格一个
  • 当用户单击保存时,值必须保存在单个事务中
  • web表单由数据库视图备份
  • 数据库视图是使用EAV模式从数据库表创建的。 (之所以这样做是因为这些列在某种程度上是动态的。)
  • web表单中的每个文本字段由数据库表中的一行建模
  • 显示web表单使用视图上的
    SELECT
    语句
  • 更新web表单使用视图上的
    UPDATE
    语句,它调用视图的
    而不是
    触发器
  • 仅更新更改的值。每个更新都有一个审计跟踪
  • 如果其他用户在未通知的情况下更新了任何值,则事务将回滚。下面是这样一个场景的示例:
    (I)
    当用户显示web表单时,a的值为
    4
    (II)
    另一个用户将同一字段更新为
    5
    (III)
    第一个用户将字段更新为
    2
    ,并提交web表单
  • 最初提出的解决方案

  • 使用AJAX(jQuery)检测文本字段中的更改,并仅提交用户更改的内容
  • 但是,需要在数据库中检测其他用户所做的更改
  • 解决方案应该能更好地工作

  • 当用户单击“保存”时,创建一个临时表(临时表是当前会话/连接只能看到的表,在会话关闭/断开连接时自动删除),并将对象(单元格)保存到临时表中
  • 开始一项交易
  • 锁定一些现有表(或仅锁定相关行,以提高性能)
  • 将提交的数据与现有数据进行比较
  • 如果进行了任何未被注意到的更改,请回滚事务
  • 更新必要的行
  • 提交事务并解锁表
  • 放下临时桌子

  • 有什么想法吗?

    这并不能满足您的确切要求,但考虑到还没有人试图找到答案。。。您是否考虑过使用临时CSV表,例如


    虽然它不符合通过hibernate实现的要求,但它是数据库无关的、跨平台的

    会话关闭时不会删除Oracle临时表。它们是永久性的。数据仅在会话处于活动状态时可见。一旦会话关闭,其数据将消失,但表将保留。