对于映射到HSQLDB中的表的实体中的id字段,我有以下定义。
...
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "ID")
private Integer id;
...
但这似乎并没有产生一个独特的身份;而是尝试将null插入到列中,从而导致失败。如果,我手动创建序列和生成策略以使用该序列,那么数据将按预期保持。
auto的生成策略是否意味着提供者(在这种情况下为hibernate)将自动选择正确的方法并根据需要执行所有繁重工作(创建序列,使用本机方法或适用于该特定平台的任何方法) )?我的理解不正确吗?
答案 0 :(得分:11)
auto的生成策略是否意味着提供者(在这种情况下为hibernate)将自动选择正确的方法并根据需要执行所有繁重工作(创建序列,使用本机方法或适用于该特定平台的任何方法) )?我的理解不正确吗?
理论上它(默认为使用HSQLDB的IDENTITY)并且它适用于我。这引出了以下问题:
org.hibernate.tool.hbm2ddl
的日志记录?)以下是使用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生成和导出功能,请创建或更改物理模型。
答案 1 :(得分:1)
使用我编写的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的批处理,它就不会为我生成它,而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实体时效果非常好。