2010-08-29 64 views
9

我對映射到HSQLDB中的表的實體中的id字段具有以下定義。Hibernate @generatedvalue HSQLDB

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

但是,這似乎並沒有產生一個唯一的ID;而是嘗試將空插入到導致失敗的列中。如果我手動創建序列和生成策略以使用該序列,那麼數據將按預期保持。

不自動生成策略暗示提供程序(在這種情況下,hibernate)會自動選擇正確的方法並根據需要執行所有繁重的操作(創建順序,使用本機方法或任何適用於該特定方法的操作平臺)?我的理解不正確?

回答

11

沒有自動的生成策略意味着,供應商(在這種情況下,休眠)會自動選擇正確的方法,做所有繁重的需要(創建序列,使用原生的方法或任何用於工程那個特定的平臺)?我的理解不正確?

它在理論上(默認爲使用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到ID,預計將持續到IDENTITY列),它不會產生或改變你的物理模型,如果你不」使用DDL生成和導出功能。

+0

*方言已被設置爲org.hibernate.dialect.HSQLDialect *我使用HSQL DB管理器創建了表。只是正常的創建表地址... *我已經手動創建表,而不是通過休眠 *是的,通過entitymanager的持續。 我沒有在我的情況下將ID列設置爲身份 - 只需將其設置爲主鍵。 – calvinkrishy 2010-08-29 23:00:10

+0

對於一些reasone在我的情況下生成的DDL命令是:CREATE TABLE employees(id BIGINT NOT NULL,name VARCHAR(50)NOT NULL,CONSTRAINT PK_EMPLOYEES PRIMARY KEY(id));根本沒有使用身份。 – Alexandr 2013-05-20 07:49:27

1

當我使用JpaSchemaGenerator工具類時,我遇到了同樣的問題。

當生成一個org.hibernate.dialect.HSQLDialect(這裏我用一個序列來生成我的唯一ID)的架構,我用下面的休眠特性:

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實體時,其中一期工程完美。

+0

您的小費爲我工作,謝謝!當我同時升級Hibernate和Hsqldb時(分別爲5.0.10.Final和2.4.0),我遇到了這個問題。 – Dherik 2017-09-08 12:49:15

相關問題