我在应用程序中使用了Hibernate JPA。我有一个具有主键(序列)的表。服务将记录插入到该表。
版本:Oracle 12c
方言:org.hibernate.dialect.Oracle10gDialect
问题:
在负载测试期间,我们会遇到问题(在SEQUENCE key 上违反唯一约束)。
问题:
数据库序列:
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;
}
最佳答案
Oracle 10方言
对于,Oracle10gDialect 使用此配置
@Id
@Column(name = "MY_PRIMARY_KEY")
@GeneratedValue(strategy=GenerationType.AUTO)
Long myPrimaryKey;
Hibernate创建一个表和一个序列:
create table MY_TABLE (
MY_PRIMARY_KEY number(19,0) not null,
VALUE varchar2(255 char),
primary key (MY_PRIMARY_KEY))
create sequence hibernate_sequence
在存储时,首先获取新的序列ID,然后将其传递到
INSERT
语句中select hibernate_sequence.nextval from dual
insert into MY_TABLE (VALUE, MY_PRIMARY_KEY) values (?, ?)
Oracle 12方言
如果您使用 native 支持
IDENTITY column
的Oracle的 Oracle 12 ,则最好将其升级到oracle.com。将
strategy
设置为GenerationType.IDENTITY
@Id
@Column(name = "MY_PRIMARY_KEY", updatable = false, nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
Long myPrimaryKey;
下表已创建-重要的部分是
generated as identity
,它提供了独特的用法。请注意,不需要创建任何显式的
sequence
,它是在内部进行管理的。create table MY_TABLE (
MY_PRIMARY_KEY number(19,0) generated as identity,
VALUE varchar2(255 char),
primary key (MY_PRIMARY_KEY))
在存储时,不会在INSERT 中传递任何ID,它由Oracle分配并返回到 session
insert into MY_TABLE (VALUE) values (?) RETURNING MY_PRIMARY_KEY INTO ?
请注意,与Oracle 10相比,您可以节省一次数据库往返时间。
关于spring - Hibernate Jpa-主键(序列)上的约束违反异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53505794/