Java @使用H2数据库时无法识别DynamicSert
我有一个Spring启动应用程序。我使用Postgres数据库,并希望交替使用H2数据库 我的sql模式如下所示Java @使用H2数据库时无法识别DynamicSert,java,spring,hibernate,h2,Java,Spring,Hibernate,H2,我有一个Spring启动应用程序。我使用Postgres数据库,并希望交替使用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 );
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;
}
我的车看起来像这样
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一切正常。关键是必须在不传递id值的情况下调用insert语句。启用日志后,我可以看到此语句insert into Car(名称、内容)值(?,)
现在,当我切换到H2时,我非常惊讶地看到完全相同的代码生成以下sql语句insert-into-Car(name,content,id)值(?,null)
。在这里,id通过值null
传递。这当然会导致列“ID”不允许出现NULL;SQL语句
-异常
为什么会有不同的行为,以及如何修复@DynamicInsert(和@DynamicUpdate)正在工作
PostgreSQL 9.5.3,com.h2数据库:h2:1.4.193,Spring Boot 1.4.2.RELEASE,Hibernate 5.0.11。最终版调试Hibernate时,我意识到
@DynamicInsert
在标识符列中没有任何作用
重要的区别在于电话
dialect.getIdentityColumnSupport().getIdentityInsertString()
这里PostgresDialect返回null
,H2方言返回“null”
。我将H2扩展到并返回了null
。对于我的用例,现在一切都正常了
也许有人能告诉我,背景是什么