2017-01-05 56 views
0

我有一個Spring Boot應用程序。我使用Postgres數據庫,並希望使用H2數據庫。@DynamicInsert在使用H2數據庫時無法識別

我的SQL模式看起來像這樣

CREATE SEQUENCE car_id_seq START WITH 100; 
CREATE TABLE car (
    id  INTEGER DEFAULT nextval('car_id_seq') PRIMARY KEY, 
    name VARCHAR NOT NULL UNIQUE, 
    content VARCHAR NOT NULL 
); 

我的車實體看起來像這樣

@Entity @DynamicInsert @DynamicUpdate 
@Getter @Setter //lombok 
public class Car { 
    @Column @Access(AccessType.PROPERTY) 
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @Column private String name; 
    @Column private String content; 
} 

現在我試着堅持一個實例。使用Postgres-Db一切都很好。關鍵在於必須調用insert語句而不傳遞id的值。啓用日誌後,我可以看到這條語句insert into Car (name, content) values (?, ?)

現在,當我改爲H2時,我非常驚訝地發現完全相同的代碼會產生以下sql語句insert into Car (name, content, id) values (?, ?, null)。這裏的ID傳遞值爲null。這當然會導致一個NULL not allowed for column "ID"; SQL statement -exception。

爲什麼會有不同的行爲,我該如何解決@DynamicInsert(和@DynamicUpdate)是否正在工作。

的PostgreSQL 9.5.3,com.h2database:H2:1.4.193,春天引導1.4.2.RELEASE,休眠5.0.11.Final

回答

0

在調試休眠我意識到,@DynamicInsert沒有效果,當談到到標識符列。

的重要區別是在呼叫

dialect.getIdentityColumnSupport().getIdentityInsertString() 

這裏PostgresDialect返回null和H2Dialect返回"null"。我將H2Dialect擴展到並返回null。對於我的用例,一切現在都可以使用。

也許有人能告訴我,背景是什麼。