在 HSQLDB 上使用 JPA2 自动生成身份的问题

Posted

技术标签:

【中文标题】在 HSQLDB 上使用 JPA2 自动生成身份的问题【英文标题】:Problems with automatic identity generation using JPA2 on HSQLDB 【发布时间】:2017-09-22 12:23:00 【问题描述】:

我有一个设置,其中 Oracle 数据库 (12c) 用于生产,而 HSQLDB(内存中)用于测试用例。我使用 Liquibase 来更新数据库。

我有以下课程:

@Entity
@Table(name = "SYSTEM")
public class System 

    @ApiModelProperty(hidden = true)
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", columnDefinition = "BIGINT")
    private Long id;

    @NotNull
    @Size(max = 40)
    @Column(name = "NAME", columnDefinition = "NVARCHAR2")
    private String name;

    @Size(max = 16)
    @GeneratedValue
    @Column(name = "TOKEN", columnDefinition = "VARBINARY")
    private UUID token;

我用于此表的 Liquibase 定义是:

"createTable": 
    "tableName": "SYSTEM",
    "columns": [
        
           "column": 
               "name": "ID",
               "type": "BIGINT",
               "autoIncrement": true,
               "constraints": 
                   "primaryKey": true
               
           
       ,
       
           "column": 
               "name": "NAME",
               "type": "VARCHAR2(40)",
               "constraints": 
                   "nullable": false
               
           
       ,
       
           "column": 
               "name": "TOKEN",
               "type": "RAW(16)",
               "constraints": 
                   "nullable": false
               
           
       
   ]

在 Oracle 数据库上使用 EntityManager.persist 创建新系统时,这是可行的。在数据库中插入一行,ID 字段按预期填充了一个值。

在 HSQLDB 数据库上不会发生这种情况。在我看来,自动生成似乎没有被触发。

HSQLDB创建SYSTEM表的SQL是:

CREATE TABLE PUBLIC."SYSTEM" (ID BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, NAME VARCHAR2(40) NOT NULL, TOKEN RAW(16) NOT NULL, CONSTRAINT PK_SYSTEM PRIMARY KEY (ID))

HSQLDB 中是否存在已知错误或我做错了什么?

【问题讨论】:

如果它是一个错误,h2 数据库 将是一个替代方案 - 也 w.r.t.液化石油气。它甚至还有 Oracle 兼容模式。 如果是 bug 或者我找不到解决方案,我会尝试 h2。谢谢你的建议。 【参考方案1】:

您需要在 JDBC 连接 URL 的末尾添加 ;sql.syntax_ora=true

对于内存数据库,您还需要确保使用相同的 Java 进程来更新和查询数据库。如果使用两个独立的进程,第一个进程创建的数据库会在进程退出时消失。

【讨论】:

;sql.syntax_ora=true 在连接 URL 中,所以恐怕不会改变任何事情。不过谢谢你的建议。 要了解更多信息,请将 HSQLDB 作为服务器运行,设置为 server.silent=false 以显示执行的 SQL。 我试过server.silent=false,但由于某种原因没有奏效。相反,我尝试了hsqldb.sqllog=2 并打印了 SQL。我已经编辑了我的问题以包含 SQL。 检查插入表的SQL。您可以使用hsqldb.sqllog=3 来获取有关准备好的语句执行的更多详细信息。 我发现了问题,我不在 hsqldb 中。就像我的代码中缺少交易一样简单。所以在我添加交易后它现在可以工作了。很抱歉在这个问题上浪费了您的时间。

以上是关于在 HSQLDB 上使用 JPA2 自动生成身份的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 HSQLDB 允许为 SERIAL 定义身份?

无法使用 JPA 2.0、Spring 2.5.6、Hibernate 3.6.1 和 Maven 在 HSQLDB 中持久化

无法以新用户身份连接到 HyperSQL / HSQLDB 数据库

SimpleJdbcInsert 插入失败,因为自动生成的 id 为空 (HSQLDB)

立即执行 hsqldb

我的 HSQLDB 上的更改不一致