2

我遇到了休眠生成标识符的问题。我正在使用序列生成器来生成我的标识符。数据库是 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 万条记录。

问候,五

4

0 回答 0