小编典典

HSQLDB的Hibernate @GeneratedValue

hibernate

对于映射到HSQLDB中的表的实体中的id字段,我具有以下定义。

...
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ID")
private Integer id;
...

但这似乎不会生成唯一的ID。而是尝试将null插入列中,这将导致失败。如果我手动创建一个序列和生成策略以使用该序列,那么数据将按预期持久保存。

自动生成策略不是暗示提供者(在这种情况下为hibernate)将自动选择正确的方法并根据需要进行所有繁重的工作(创建序列,使用本机方法或适用于该特定平台的任何方法)吗?我的理解不正确吗?


阅读 280

收藏
2020-06-20

共1个答案

小编典典

自动生成策略不是暗示提供者(在这种情况下为hibernate)将自动选择正确的方法并根据需要进行所有繁重的工作(创建序列,使用本机方法或适用于该特定平台的任何方法)吗?我的理解不正确吗?

从理论上讲(它在HSQLDB中默认为IDENTITY),并且对我有用。这提出了以下问题:

  • 您正在使用什么方言(以防万一)?
  • 您是如何创建表格的?
  • 您可以显示DDL(org.hibernate.tool.hbm2ddl如果需要,激活DDL的日志记录)吗?
  • 您如何插入(通过Hibernate的API,对吗?)?

这是Foo使用HSQLDB时实体的示例DDL :

create table Foo (
    id bigint generated by default as identity (start with 1), 
    bar varchar(100),
    primary key (id)
)

我使用HSQL DB管理器创建了表。只是正常的创建表地址…就我而言,我没有将id列设置为标识-只是将其设置为主键。

然后您就有了答案,请使用IDENTITY专栏。

虽然Hibernate确实选择了正确的策略并确实生成了适当的INSERT语句(传递null给预期将保留在IDENTITY列中的id
),但是如果您不使用DDL生成和导出,它将不会创建或更改您的物理模型。能力。

2020-06-20