2014-05-22 92 views
1

我使用的彈簧,它的JdbcTemplate的數據庫連接,我試圖自動爲我的主鍵列的關鍵。我也在使用HSQLDB。該表看起來像這樣:的JdbcTemplate如何自動生成主鍵

CREATE TABLE IF NOT EXISTS Customers (
    cid BIGINT GENERATED BY DEFAULT AS PRIMARY KEY, 
    name VARCHAR(255) NOT NULL, 
    ... 
); 

在我的DAO對象的代碼看起來像這樣:

Map<String, Object> values = new HashMap<String, Object>(); 
values.put("name", customer.getName()); 
// NOT putting the cid 
... 
SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbc).withTableName(
       "CUSTOMERS").usingGeneratedKeyColumns("CID"); 
Long key = (Long) insert.executeAndReturnKey(values); 

正如你所看到的,我不是手動把鑰匙,我想到的是,usingGeneratedKeyColumns方法爲我自動生成它。反正我執行executeAndReturnKey後出現此錯誤:

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL []; integrity constraint violation: NOT NULL check constraint; SYS_PK_10094 table: CUSTOMERS column: CID; nested exception is java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: NOT NULL check constraint; SYS_PK_10094 table: CUSTOMERS column: CID

+0

爲什麼要這麼做?讓你的數據庫使用自動增量生成密鑰。 – Stultuske

回答

1

的問題是,從HSQLDB自動生成密鑰有一個稍微不同的語法。你需要將它定義爲IDENTITY,然後爲PRIMARY KEY

CREATE TABLE IF NOT EXISTS Customers (
    cid BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    name VARCHAR(255) NOT NULL, 
    ... 
);