繁体   English   中英

用于HSQLDB的Hibernate @generatedvalue

[英]Hibernate @generatedvalue for HSQLDB

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

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

但这似乎并没有产生一个独特的身份; 而是尝试将null插入到列中,从而导致失败。 如果,我手动创建序列和生成策略以使用该序列,那么数据将按预期保持。

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

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

它在理论上确实(它默认为使用HSQLDB的IDENTITY)并且它适用于我。 这引出了以下问题:

  • 你使用什么方言(以防万一)?
  • 你是怎么创造这张桌子的?
  • 你能展示DDL(如果需要,激活org.hibernate.tool.hbm2ddl的日志记录)?
  • 你如何插入(通过Hibernate的API,对吧?)?

以下是使用HSQLDB时实体Foo的示例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,它将不会创建或更改您的物理模型生成和出口能力。

使用我编写的JpaSchemaGenerator实用程序类时遇到了同样的问题。

在为org.hibernate.dialect.HSQLDialect (我使用SEQUENCE生成我的唯一ID)生成模式时,我使用以下Hibernate属性:

hibernate.id.new_generator_mappings=true

这会产生以下CREATE语句:

CREATE TABLE BATCH (
    BAT_ID NUMBER(19,0) NOT NULL,
    BAT_EXPIRY_DATE TIMESTAMP,
    BAT_NUMBER VARCHAR2(255 CHAR),
    BAT_MAT_ID NUMBER(19,0),
    PRIMARY KEY (BAT_ID)
);

但是当我在我的实用程序类中使用相同的属性来使用org.hibernate.dialect.HSQLDialect生成模式时,我得到以下CREATE语句:

CREATE TABLE BATCH (
    BAT_ID BIGINT NOT NULL,
    BAT_EXPIRY_DATE TIMESTAMP,
    BAT_NUMBER VARCHAR(255),
    BAT_MAT_ID BIGINT,
    PRIMARY KEY (BAT_ID)
);

这意味着如果我创建了一个没有ID的Batch,它就不会为我生成它, NOT NULL约束会导致异常。

如果我将Hibernate属性更改为以下内容:

hibernate.id.new_generator_mappings=false

然后它将生成以下CREATE语句:

CREATE TABLE BATCH (
    BAT_ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
    BAT_EXPIRY_DATE TIMESTAMP,
    BAT_NUMBER VARCHAR(255),
    BAT_MAT_ID BIGINT,
    PRIMARY KEY (BAT_ID)
);

在使用Hibernate创建JPA实体时,这非常有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM