2011-11-14 24 views
3

我在我的數據庫中有一個表,並且我在該字段上添加了@Id屬性。由於strategy我使用GenerationType.IDENTITY。當數據庫表尚未由來自SQL腳本的行填充時,此工作正常。如何在數據庫表已被填充時正確設置@Id字段JPA

當表中已經有一些行時,我該如何設法讓它工作?因爲當我試圖從我的應用程序插入實體時它不起作用,因爲它是預先填充的。

我正在使用Derby數據庫和eclipselink作爲實現。

+0

工作這是什麼意思「它不工作」?當你插入實體時會發生什麼? – madth3

回答

3

使用序列發生器從序列表中獲取其id。類似這樣的:

@Id 
@GeneratedValue(generator = "yourTableIdGenerator") 
@GenericGenerator(name = "yourTableIdGenerator", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = { 
        @Parameter(name = "sequence_name", value = "your_table_id_seq"), 
        @Parameter(name = "optimizer", value = "hilo"), 
        @Parameter(name = "initial_value", value = "1000"), 
        @Parameter(name = "increment_size", value = "10") } 
       ) 
@Column(name = "your_table_id", length = 15) 
public Long getId() { 
    return id; 
} 

將initial_value設置爲大於從腳本填充的行的最大id的值。

從Java 6 EE API:http://download.oracle.com/javaee/6/api/javax/persistence/TableGenerator.html

@TableGenerator(
    name="empGen", 
    table="ID_GEN", 
    pkColumnName="GEN_KEY", 
    valueColumnName="GEN_VALUE", 
    pkColumnValue="EMP_ID", 
    initialValue = 1000, 
    allocationSize=1) 
@Id 
@GeneratedValue(strategy=TABLE, generator="empGen") 
int id; 
+2

您如何知道作者正在使用Hibernate? – MaDa

+0

當然,該解決方案僅適用於休眠。 – dcernahoschi

+0

使用eclipselink – LuckyLuke

2

我會假設你的錯誤是因爲你已經爲你的表開始創建(舉例)中的「1」,你已經填充的IDENTITY與ID「1」行的表。所以肯定存在PK約束違規。如果這是我可以建議的場景:

  1. 檢查預填充數據的行數。舉例3500
  2. 創建爲避免PK約束違反上級號標識列,舉例如下表開始於4000身份:

這應該在德比DB

CREATE TABLE MAPS (
    MAP_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 4000, INCREMENT BY 1), 
    MAP_NAME VARCHAR(24) NOT NULL, 
    REGION VARCHAR(26), 
    AREA DECIMAL(8,4) NOT NULL, 
    PHOTO_FORMAT VARCHAR(26) NOT NULL, 
    PICTURE BLOB(102400), 
    UNIQUE (MAP_ID, MAP_NAME) 
) 
+0

是的,那是我得到的錯誤。我不知道我是否理解你的權利:我應該手動或在代碼中檢查計數嗎?我可以在JPA/eclipselink – LuckyLuke

+0

中做這個「抵消」,你可以手動檢查它。如果你不知道行數,你可以通過例子1000000以最高數字開始標識。如果你需要在表創建後填充數據我的建議是你使用標識,所以你在ID上插入null領域。如果您需要保留要插入數據庫的行的ID,則可能需要一個新列 –

相關問題