列 "ID" 不允许空;SQL语句

  • 本文关键字:SQL 语句 不允许 ID java sql
  • 更新时间 :
  • 英文 :


Helllo,我一直在尝试创建一个名为ContratoAluguer的实体,但每次尝试创建该实体时,都会发生以下错误:

Internal Exception: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID"; SQL statement:
INSERT INTO CONTRATOALUGUER (CLIENT_ID, AUTOMOVEL_ID) VALUES (?, ?) [23502-200]
Error Code: 23502
Call: INSERT INTO CONTRATOALUGUER (CLIENT_ID, AUTOMOVEL_ID) VALUES (?, ?)
bind => [2 parameters bound] 

-----------------------Entity Code Below-----------
package isep.eapli.demo_orm.domain;
import javax.persistence.*;
import java.util.List;
@Entity
public class ContratoAluguer {
@OneToOne
private Automovel automovel;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "ContratoId")
private List<CondutorAutorizado> condutorAutorizadoList;
@ManyToOne(cascade = CascadeType.ALL)
private Cliente client;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
public ContratoAluguer(Automovel automovel, List<CondutorAutorizado> condutorAutorizadoList, Cliente client) {
this.automovel = automovel;
this.condutorAutorizadoList = condutorAutorizadoList;
this.client = client;
}

错误:您试图将NULL值插入PRIMARY KEY列,这显然没有NULL约束。您期望DB负责为您的实体生成ID——我从生成类型策略中看到了这一点。你可能正在使用H2 DB?所以请检查表定义。主键的类型应为"bigint"(http://www.h2database.com/html/datatypes.html#bigint_type)。

关于H2中的身份,文件显示:

Identity列是使用序列生成的列。用identity数据类型或identity((子句声明为标识列的列是此表的主键列。GENERATED ALWAYS AS IDENTITY、GENERATED BY DEFAULT AS IDENTITY和AUTO_INCREMENT子句不会自动创建主键约束。GENERATED ALWAYS AS IDENTITY子句指示列只能由序列生成,不能显式设置其值。标识列具有隐含的NOT NULL约束。标识列可能没有DEFAULT或ON UPDATE表达式。

所以您的SQL应该看起来像这样:

CREATE TABLE TEST(
ID BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
...);

我猜您正在使用JPA(从注释中(。所以,若您让JPA为您生成表,请检查H2控制台中的表,正如我前面提到的。

这将是我从你提供的信息中迈出的第一步。希望这能帮助

最新更新