Java 多线程和休眠实体id生成器

Java 多线程和休眠实体id生成器,java,mysql,multithreading,oracle,hibernate,Java,Mysql,Multithreading,Oracle,Hibernate,最近,我将我的实体转换为可移植的。 我们希望我们的实体可以用于oracle数据库和mysql(在它成为唯一的oracle之前)。 以前,为了生成实体id,我们使用SequenceGenerator,现在改为GenericGenerator 旧代码: @Id @Column(name = "ID") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_1") @SequenceGenerator(name = "

最近,我将我的实体转换为可移植的。 我们希望我们的实体可以用于oracle数据库和mysql(在它成为唯一的oracle之前)。 以前,为了生成实体id,我们使用SequenceGenerator,现在改为GenericGenerator

旧代码:

@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_1")
@SequenceGenerator(name = "SEQ_1", sequenceName = "SEQ_1",  allocationSize = 1)
public Long getId() {
    return this.id;
}
新代码:

@GenericGenerator(name="SEQ_1", strategy="org.hibernate.id.enhanced.SequenceStyleGenerator",
        parameters={
        @Parameter(name="sequence_name",value="SEQ_1"),
        @Parameter(name="optimizer",    value="seqhilo"),
        @Parameter(name="initial_value",value="1"),
        @Parameter(name="increment_size",value="1")
    })
public Long getId() {
    return this.id;
}
我的问题是,当我们处理多线程时,在实体创建方面有很多例外。
我们使用Hibernate版本的3.3.2。

您得到的错误代码是什么?org.Hibernate.exception.ConstraintViolationException:无法执行JDBC批处理更新。。。。。。原因:java.sql.BatchUpdateException:ORA-00001:违反了唯一约束(TEST_PK)。。。。org.hibernate.util.jdbceptionReporter SQL错误:1,SQLState:23000。请注意,使用旧代码时,一切正常。奇怪的是,根据这一点,您仍然应该在后台使用sequence。我怀疑使用org.hibernate.id.enhanced.SequenceStyleGenerator不是线程安全的。我已检测到问题,代码@Parameter(name=“optimizer”,value=“seqHilo”)我们使用的是优化器NoopOptimizer,它不是线程安全的。seqHilo优化器在我的hibernate版本中不存在,默认优化器为NoopOptimizer。