我在我的數據庫中有一個表,並且我在該字段上添加了@Id
屬性。由於strategy
我使用GenerationType.IDENTITY
。當數據庫表尚未由來自SQL腳本的行填充時,此工作正常。如何在數據庫表已被填充時正確設置@Id字段JPA
當表中已經有一些行時,我該如何設法讓它工作?因爲當我試圖從我的應用程序插入實體時它不起作用,因爲它是預先填充的。
我正在使用Derby數據庫和eclipselink作爲實現。
我在我的數據庫中有一個表,並且我在該字段上添加了@Id
屬性。由於strategy
我使用GenerationType.IDENTITY
。當數據庫表尚未由來自SQL腳本的行填充時,此工作正常。如何在數據庫表已被填充時正確設置@Id字段JPA
當表中已經有一些行時,我該如何設法讓它工作?因爲當我試圖從我的應用程序插入實體時它不起作用,因爲它是預先填充的。
我正在使用Derby數據庫和eclipselink作爲實現。
使用序列發生器從序列表中獲取其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;
我會假設你的錯誤是因爲你已經爲你的表開始創建(舉例)中的「1」,你已經填充的IDENTITY與ID「1」行的表。所以肯定存在PK約束違規。如果這是我可以建議的場景:
這應該在德比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)
)
是的,那是我得到的錯誤。我不知道我是否理解你的權利:我應該手動或在代碼中檢查計數嗎?我可以在JPA/eclipselink – LuckyLuke
中做這個「抵消」,你可以手動檢查它。如果你不知道行數,你可以通過例子1000000以最高數字開始標識。如果你需要在表創建後填充數據我的建議是你使用標識,所以你在ID上插入null領域。如果您需要保留要插入數據庫的行的ID,則可能需要一個新列 –
工作這是什麼意思「它不工作」?當你插入實體時會發生什麼? – madth3