我遇到了休眠生成标识符的问题。我正在使用序列生成器来生成我的标识符。数据库是 Oracle 11g 和休眠版本 3.6.1。
我知道休眠中的默认分配大小是 50,因此休眠每 50 次插入调用数据库以获取标识符。因此,我将 allocationSize 更改为 1000 以减少数据库调用,如下所示:
@GeneratedValue(generator = "test_gen", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "test_gen", sequenceName = "myschema.my_oracle_sequence", allocationSize = 1000)
不过问题很少。
首先,这是一项增强功能,因此我无法升级休眠版本以使用新的序列生成器。
其次,我不能使用以下属性,因为这会影响其他休眠实体,我的更改不应触及这些实体。有没有办法告诉休眠将以下属性仅应用于一个实体?
hibernate.id.new_generator_mappings=true
第三,我尝试了下面的hibernate特定映射。但是,我需要在这里提供一个初始值。如果不是,它将初始值为 1 并计算标识符,并且我得到预期的约束异常,因为标识符已被使用。我无法再次在此处提供初始值,因为代码已在使用中,并且序列的主要 id 和 nextval 都已从其初始值移动。
@GenericGenerator(
name = "sequenceGenerator",
strategy = "enhanced-sequence",
parameters = {
@org.hibernate.annotations.Parameter(
name = "optimizer",
value = "pooled"
),
@org.hibernate.annotations.Parameter(
name = "increment_size",
value = "500"
)
}
)
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sequenceGenerator"
)
第四,我不能使用我在第一个代码块中提到的代码,因为我在插入记录时随机看到 UniqueConstraintViolationException,正如其他人所看到的那样。 JPA 2 @SequenceGenerator @GeneratedValue 产生唯一约束违规
有了所有这些限制,有什么办法可以增加 allocationSize 以提高记录插入性能。我会在一个批次中插入大约 10-4000 万条记录。
问候,五