我有一个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
答案 0 :(得分:0)
在调试hibernate时,我意识到@DynamicInsert
在标识符列中没有任何效果。
重要的区别在于电话
dialect.getIdentityColumnSupport().getIdentityInsertString()
此处PostgresDialect返回null
,H2Dialect返回"null"
。我将H2Dialect扩展到并返回null
。对于我的用例,现在一切正常。
可能有人能够告诉我,背景是什么。