spring - Hibernate Jpa-主键(序列)上的约束违反异常

标签 spring multithreading oracle hibernate jpa

我在应用程序中使用了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;
    
    }
    

    最佳答案

    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/

    相关文章:

    spring - Spring框架安全漏洞CVE是否适用于Grails

    sql - 无法更改密码

    java - spring security认证添加子域

    java - Linux 上的循环引用

    multithreading - 锁(线程)是原子的吗?

    c++ - Boost::Asio 线程服务器异步问题。什么都没发生

    java - onApplicationEnd - CF 实际上正在关闭吗?

    Oracle ORA-30004在使用SYS_CONNECT_BY_PATH函数时,

    sql - 找到第二高的工资

    eclipse - 必须为 ... ApplicationRequestFactory RequestFactory 类型运行 RequestFactory ValidationTool