【问题标题】:CockroachDB SERIAL field not working with JPA IDENTITY StrategyCockroachDB SERIAL 字段不适用于 JPA IDENTITY 策略
【发布时间】:2018-09-17 10:46:05
【问题描述】:

我正在迁移一个应用程序以使用 CockroachDB,我们正在使用 Java 中的 GeneratedValue 映射和 SERIAL 类型列来管理主键。

id                   SERIAL PRIMARY KEY -- SQL

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) -- Java JPA

我们收到以下错误

错误:currval():关系“scm_supply_centers_id_seq”不存在

我们挖了一点,发现这是因为 PostgreSQL Dialect 试图获取插入的最后一个 id,正如您在此链接中看到的那样 PostgreSQL81IdentityColumnSupport

如何找到解决此问题的方法?

【问题讨论】:

    标签: java hibernate jpa cockroachdb


    【解决方案1】:

    SERIAL 类型不受 CockroachDB 中的序列支持。为了使用SEQUENCE,您需要显式创建它并将nextval() 函数用作列的DEFAULT 值。例如,

    CREATE SEQUENCE customer_seq;
    
    CREATE TABLE customer_list (
        id INT PRIMARY KEY DEFAULT nextval('customer_seq'),
        customer string,
        address string
    );
    

    请注意,由于额外的同步和通信要求,使用 SEQUENCESERIAL 会对性能产生影响。详情请见https://www.cockroachlabs.com/docs/stable/create-sequence.html

    不过,以上内容并不能完全回答您的问题。我不知道您将如何使用 Hibernate 中的显式序列。

    【讨论】:

    • 谢谢!这是另一种选择。我通过实现自定义 Hibernate 方言来修复它,以允许在插入子句中返回 ID。
    猜你喜欢
    • 2016-03-23
    • 2021-06-04
    • 2020-07-10
    • 2017-04-09
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多