2017-01-05 7 views
0

У меня есть приложение Spring Boot. Я использую базу данных Postgres и хочу альтернативно использовать базу данных H2.@DynamicInsert не распознается при использовании базы данных H2

My 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 выглядит следующим образом

@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.

Почему существует другое поведение и как я могу исправить работу @DynamicInsert (и @DynamicUpdate).

PostgreSQL 9.5.3, com.h2database: h2: 1.4.193, весна загрузка 1.4.2.RELEASE, Hibernate 5.0.11.Final

ответ

0

При отладке в спящем режиме, я понял, что @DynamicInsert не имеет никакого эффекта, когда речь идет о к столбцу идентификатора.

Важным отличием является по зову

dialect.getIdentityColumnSupport().getIdentityInsertString() 

Здесь PostgresDialect возвращает null и H2Dialect возвращает "null". Я расширил H2Dialect до и вернулся null. Для моего прецедента все работает.

Возможно, кто-то может сказать мне, что такое фон.