【发布时间】:2019-04-29 13:19:17
【问题描述】:
我在我的应用程序中使用 Hibernate JPA。我有一个具有主键(序列)的表。服务将记录插入到该表中。
版本:Oracle 12c
方言:org.hibernate.dialect.Oracle10gDialect
问题:
我们在负载测试期间遇到问题(SEQUENCE Key 上的唯一约束违规)。
问题:
此问题并非一直存在。但仅在负载测试期间。有人可以检查并帮助使用线程安全生成器吗?
是 DB 端序列定义问题还是 Java 端?
数据库序列:
CREATE SEQUENCE MY_SEQ
START WITH 1
INCREMENT BY 1
NOMINVALUE
NOMAXVALUE
CACHE 30
NOORDER;
CREATE TABLE MY_TABLE (
MY_PRIMARY_KEY INT default MY_SEQ.nextval NOT NULL,
VALUE_COL VARCHAR2(10) NULL
);
实体:
public class MyTableEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "MY_PRIMARY_KEY")
@GenericGenerator(
name = "mySequenceGenerator",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "SEQUENCE MY_SEQ"),
@Parameter(name = "increment_size", value = "1")
}
)
@GeneratedValue(generator = "mySequenceGenerator")
private long myPrimaryKey;
@Column(name = "VALUE")
private String value;
}
【问题讨论】:
-
首先,
@Parameter(name = "sequence_name", value = "SEQUENCE MY_SEQ"),- 此参数包含两个单独的名称:SEQUENCE+MY_SEQ。第二 - 根据Documentation of SequenceStyleGenerator 没有名为sequence_name的参数,但有SEQUENCE_PARAM - Indicates the name of the sequence (or table) to use.,所以我认为你应该尝试:@Parameter(name = "sequence_param", value = "MY_SEQ"), -
请发布您的 Oracle 版本和使用的 Hybernate 方言。可能的解释是您在
INSERT中传递了一个PK 值,它用sequence覆盖了DEFAULT子句。 -
@Marmite Bomber,我更新了 Oracle 版本和使用的 Hibernate 方言
-
你自己回答了这个问题。
Oracle10gDialect不支持带有序列的列DEFAULT,从 Oracle 12 开始可用。IMO 您的 DB 表定义与 Hibernate 类不对应。使用 Hibernate 自动重新创建表或升级您的方言。 -
@krokodilko 的评论似乎也很相关......
标签: spring multithreading oracle hibernate jpa