是否有任何Hibernate MultiTableBulkIdStrategy没有做任何DDL?

时间:2016-09-22 10:03:47

标签: hibernate

Hibernate通过将更新或删除的记录的ID存储在临时表或持久表(an excellent blog post about this)中来处理由JOINED继承策略连接的表的UPDATE和DELETE操作。

Hibernate为此提供了三种不同的实现:

  1. GlobalTemporaryTableBulkIdStrategy - 基于ANSI SQL的"全局临时表的定义"
  2. LocalTemporaryTableBulkIdStrategy - 基于ANSI SQL的定义"本地临时表" (每个数据库会话的本地)
  3. PersistentTableBulkIdStrategy - 模拟不支持临时表的数据库的全局临时表的策略
  4. 问题是我们有一个约束,我们不能从应用程序执行任何DDL(事先创建任何表都没问题)。

    我们希望很少有更新/删除可以利用该策略(在少量行上运行),因此性能不是问题。我们还为所有实体(UUID)使用相同的ID类型。

    我看到两种可接受的方法:

    1. 使用单个预先创建的表格
      由于我们可以事先创建所需的表,理论上我们可以使用默认策略之一。但是,由于所有标准策略都在层次结构中为每个实体创建一个表,因此每次添加新实体时都会导致额外的手动工作。
      为了避免这种情况,我认为可以使用包含一对(HT_TABLE_NAMEID)的单个表,其中HT_TABLE_NAME被添加到不同实体的段行(基本上,合并所有临时表分为一个)。

    2. 将ID存储在应用程序内存中
      策略可以将ID提取到应用程序,然后使用每个更新/删除语句将它们发送回数据库。

    3. 我有点惊讶没有Hibernate提供的开箱即用的策略,但也许你知道一个可行的策略?

      我也设法找到了an implementation based on Common Table Expressions,但是看看它的测试套件看起来并不是很成熟。有没有人成功使用过它?

1 个答案:

答案 0 :(得分:1)

我开发了一个SingleGlobalTemporaryTableBulkIdStrategy,它使用一个预先创建的全局临时表。

另外,在原始问题中链接的CTE策略没有为H2和DB2数据库生成有效的SQL。

更新:Hibernate 5.2.8添加了new Bulk Id strategies,这使得我的项目在大多数情况下都很有用。