0

我们目前正在从 MSSQL 迁移到 Oracle,我们不想对所有表使用 hibernate_sequence。每个表都应该有自己的序列。

我们已经在我们的测试环境中进行了更改,但是如果我们的解决方案可以安全使用,我想获得一些额外的信息。

我们的大多数类都是从 baseentities 扩展而来的,但我们也有几个独立的实体。

我们改变了什么:

-baseentities(@MappedSuperclass):   
changed: @GeneratedValue(strategy = GenerationType.AUTO)   
to: @GeneratedValue(strategy = GenerationType.AUTO, generator = "HIBERNATE_GENERATOR")

- 扩展实体:

added after the @Table annotation:  
@SequenceGenerator(name = "HIBERNATE_GENERATOR", sequenceName = "${TABLENAME}_SEQ")

-独立实体:
在@Table 注释之后添加:

@SequenceGenerator(name = "HIBERNATE_GENERATOR", sequenceName = "${TABLENAME}_SEQ")
changed : @GeneratedValue(strategy = GenerationType.AUTO)   
to: @GeneratedValue(strategy = GenerationType.AUTO, generator = "HIBERNATE_GENERATOR")

所以我们总是使用相同的生成器名称“HIBERNATE_GENERATOR”,只是序列名称不同。我们的应用程序似乎运行良好,但始终使用相同的生成器名称是否安全?

4

1 回答 1

1

不,这不安全。我的猜测是您生成的所有值都是由相同的序列生成的。事实上,javadoc 说:

定义一个主键生成器,当为 GeneratedValue 注释指定生成器元素时,该生成器可以按名称引用。可以在实体类或主键字段或属性上指定序列生成器。生成器名称的范围对于持久性单元是全局的(跨所有生成器类型)

(强调我的)

每个实体都应该定义自己的生成器。

于 2013-03-10T10:57:09.763 回答