1

这是一个关于自定义 Hibernate SequenceGenerator 的问题。

我有一个应用程序(Spring 3.1/Hibernate 4),它必须与 Oracle 和 SQLServer 的两个旧数据库一起使用。我遇到了 ID 生成器的问题。

在我的实体中,我将 ID 生成器策略注释为 AUTO,这样当它与 Oracle 一起使用时,它默认选择 SequenceGenerator,而当与 SQLServer 一起使用时,它默认选择 IdentityGenerator。它可以毫无问题地与 SQLServer 一起使用。但是对于 Oracle,hibernate 使用硬编码的“hibernate_sequence”作为默认序列名称。这会导致问题,因为旧版 Oracle 数据库使用约定 TableName+"_SEQ" 作为每个表的序列名称。

我设法通过更改 Hibernate SequenceGenerator 源代码并构建自己的休眠代码库来解决这个问题。但这不太可取,因为我们在升级 Hibernate 时必须记住这一点。

我还尝试编写自己的 ID 生成器(并用它注释 ID 字段)在 SequenceGenerator/IDGenerator 之间切换但失败了。无论如何,这也不是可取的方式,因为这需要进一步深入 JPA/Hibernate 框架内部,而我对此犹豫不决。

我想要的是编写我的 CustomizedSequenceGenerator 并以某种方式覆盖 Hibernate 通过配置使用的那个。但我可以找到“不知何故”。

有没有人有这样的经历?

谢谢,西蒙

4

1 回答 1

0

您可以通过实现IdentifierGenerator接口然后覆盖它的generate方法来创建自定义生成器。

然后你可以在实体中使用它来生成id。

@Id
@GenericGenerator(name="TABLE_X_SEQ", strategy="com.package.TableXIdGenerator")
@GeneratedValue(generator="TABLE_X_SEQ")
于 2013-04-03T07:39:31.617 回答