使用H2数据库时无法识别@DynamicInsert

时间:2017-01-05 18:37:18

标签: java spring hibernate h2

我有一个Spring Boot应用程序。我使用Postgres数据库,并希望交替使用H2数据库。

我的sql架构看起来像这样

@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;
}

我的汽车实体看起来像这样

insert into Car (name, content) values (?, ?)

现在我尝试坚持一个实例。使用Postgres-Db一切都很好。关键是必须调用insert语句而不传递id的值。启用日志后,我可以看到此语句insert into Car (name, content, id) values (?, ?, null)

现在当我改为H2时,我非常惊讶地看到完全相同的代码产生了以下sql语句null。这里的id以值NULL not allowed for column "ID"; SQL statement传递。这当然会导致pod.beta.kubernetes.io/init-containers: '[ { "name": "sysctl", "image": "busybox", "command": ["sysctl", "-w", "vm.max_map_count=262144"], "securityContext": { "privileged": true } } ]' - 例外。

为什么会出现不同的行为,如何解决@DynamicInsert(和@DynamicUpdate)正在运行的问题。

PostgreSQL 9.5.3,com.h2database:h2:1.4.193,Spring Boot 1.4.2.RELEASE,Hibernate 5.0.11.Final

1 个答案:

答案 0 :(得分:0)

在调试hibernate时,我意识到@DynamicInsert在标识符列中没有任何效果。

重要的区别在于电话

dialect.getIdentityColumnSupport().getIdentityInsertString()

此处PostgresDialect返回null,H2Dialect返回"null"。我将H2Dialect扩展到并返回null。对于我的用例,现在一切正常。

可能有人能够告诉我,背景是什么。