我们目前正在从MSSQL迁移到Oracle,我们不想对所有表使用hibernate_sequence。每个表都应该有自己的序列。
我们已经对我们的测试环境进行了更改,但如果我们的解决方案可以安全使用,我想获得一些其他信息..
我们的大部分课程都是从基础实体扩展,但我们也有几个独立的实体。
我们改变了什么:
-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”,只有sequenceNames是不同的。 我们的应用程序似乎工作正常,但使用相同的生成器名称是否安全?
答案 0 :(得分:1)
不,这不安全。我的猜测是,所有生成的值都是由相同的序列生成的。的确,javadoc说:
定义在为GeneratedValue批注指定生成元素时可以通过名称引用的主键生成器。可以在实体类或主键字段或属性上指定序列生成器。 生成器名称的范围对于持久性单元是全局的(跨所有生成器类型)。
(强调我的)
每个实体都应该定义自己的生成器。