【问题标题】:Id generation issue with Hibernate, liquibase and hsqldbHibernate、liquibase 和 hsqldb 的 ID 生成问题
【发布时间】:2013-05-14 17:31:49
【问题描述】:

我已经使用 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。

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

【问题讨论】:

    标签: java hibernate hsqldb liquibase


    【解决方案1】:

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

    CREATE TABLE employees (id BIGINT GENERATED BY DEFAULT AS IDENTITY, name VARCHAR(50) NOT NULL, CONSTRAINT PK_EMPLOYEES PRIMARY KEY (id));
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-11-25
        • 1970-01-01
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 2011-05-11
        • 1970-01-01
        • 2021-10-20
        相关资源
        最近更新 更多