3

我使用 liquibase 创建了一个表:

<createTable tableName="employees">
    <column name="id" type="bigint">
        <constraints primaryKey="true" nullable="false"/>
    </column>
    <column name="name" type="varchar(50)">
        <constraints nullable="false"/>
    </column>
</createTable>

生成以下 sql ddl 查询:

CREATE TABLE employees (id BIGINT NOT NULL, name VARCHAR(50) NOT NULL, CONSTRAINT PK_EMPLOYEES PRIMARY KEY (id));

对应实体:

@Entity
@Table(name="employees")
public class EmployeeAccessProperty ...
    @Id
    @GeneratedValue
    public long getId() {
        return id;
    }
...

现在,当我尝试通过 JPA 实现保存它时,会生成 sql 查询以插入数据:

Hibernate: insert into employees (id, name) values (default, ?)
2013-05-20T14:29:22.525+0700  WARN  SQL Error: -5544, SQLState: 42544
2013-05-20T14:29:22.526+0700  ERROR  DEFAULT keyword cannot be used as column has no DEFAULT

我预计,当我不指定 id 生成策略时,Hibernate 会根据提供者选择最好的一个。我不明白为什么要尝试使用默认值来生成 ID。我不确定,哪一方对错误负责:hibernate、liqubase 或 hsqldb。

我能做些什么来解决这个问题?请帮我。

4

2 回答 2

4

您没有告诉数据库您的主键必须是自动生成的。以这种方式创建您的表格:

CREATE TABLE employees (id BIGINT GENERATED BY DEFAULT AS IDENTITY, name VARCHAR(50) NOT NULL, CONSTRAINT PK_EMPLOYEES PRIMARY KEY (id));
于 2013-05-20T07:59:20.650 回答
3

Hibernate 确实会根据方言选择最合适的策略。由于 HSQLDB 支持标识列,因此它使用此策略。此策略假设 ID 列是由数据库自动生成的,而您没有这样定义它,因此它不起作用。

将列定义为generated by default as identity,一切都应该没问题。或者使用序列或表选择另一种生成策略(您也必须在数据库中定义)。

于 2013-05-20T07:58:31.517 回答