在 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 自动生成身份的问题的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 JPA 2.0、Spring 2.5.6、Hibernate 3.6.1 和 Maven 在 HSQLDB 中持久化
无法以新用户身份连接到 HyperSQL / HSQLDB 数据库