为什么此值对于我的H2表太长

son*_*rin 8 hibernate h2 spring-data-jpa

我有一个使用H2进行存储的spring-data-jpa应用程序。当我尝试将某些数据解析到表中时,出现错误:

 o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 22001, SQLState: 22001
2014-06-13 15:42:07.062 ERROR 66742 --- [nio-9001-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : Value too long for column "REMARKS VARCHAR(255)": "'""DOB 31 Jan 1939; Cedula No. 6068015 (Colombia); alt. Cedula No. 6067015 (Colombia); Passport T321642 (Colombia); alt. Passport... (259)"; SQL statement:
insert into sdn (call_sign, grt, program, remarks, sdn_num, sdn_type, title, tonnage, vess_flag, vess_owner, vess_type, ent_num) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [22001-172]
Run Code Online (Sandbox Code Playgroud)

我有一个表定义为:

CREATE TABLE IF NOT EXISTS Sdn (
  entNum    BIGINT (11) NOT NULL,
  sdnName   VARCHAR(700)  NULL,
  sdnType   VARCHAR(24)   NULL,
  program   VARCHAR(100)  NULL,
  title     VARCHAR(4000) NULL,
  callSign  VARCHAR(20)   NULL,
  vessType  VARCHAR(50)   NULL,
  tonnage   VARCHAR(30)   NULL,
  grt       VARCHAR(20)   NULL,
  vessFlag  VARCHAR(80)   NULL,
  vessOwner VARCHAR(300)  NULL,
  remarks   CLOB          NULL,
  UNIQUE KEY entityNum(entNum)
);
Run Code Online (Sandbox Code Playgroud)

我的@Entity类为:

@Entity
public class Sdn {

    @Id
    private long entNum;
    private String sdnName;
    private String sdnType;
    private String program;
    private String title;
    private String callSign;
    private String vessType;
    private String tonnage;
    private String grt;
    private String vessFlag;
    private String vessOwner;
    private String remarks;
Run Code Online (Sandbox Code Playgroud)

这是有问题的记录,它显然足够小以适合该列:

"DOB 31 Jan 1939; Cedula No. 9876543 (cccccccc); alt. Cedula No. 6067015 (cccccccc); Passport T123456 (cccccccc); alt. Passport 1234567 (Comoros); alt. Passport 12345 (Argentina); alt. Passport 87654321 (ppppppppp); a.k.a. 'THE TTTT PLAYER'; a.k.a. 'NAME1'."
Run Code Online (Sandbox Code Playgroud)

我所能想到的是分号或其他无效字符引发了此异常。

谁能在这里看到问题,并提出替代解决方案?

Don*_*oby 6

您声明的表定义:

CREATE TABLE IF NOT EXISTS Sdn (
  entNum    BIGINT (11) NOT NULL,
  sdnName   VARCHAR(700)  NULL,
  sdnType   VARCHAR(24)   NULL,
  program   VARCHAR(100)  NULL,
  title     VARCHAR(4000) NULL,
  callSign  VARCHAR(20)   NULL,
  vessType  VARCHAR(50)   NULL,
  tonnage   VARCHAR(30)   NULL,
  grt       VARCHAR(20)   NULL,
  vessFlag  VARCHAR(80)   NULL,
  vessOwner VARCHAR(300)  NULL,
  remarks   CLOB          NULL,
  UNIQUE KEY entityNum(entNum)
);
Run Code Online (Sandbox Code Playgroud)

与错误消息不同,该错误消息说“备注”列是VARCHAR(255)而不是CLOB

您的值确实超过了255个字符的限制。

您可能需要更改表以匹配您的实际想法。

您的实体似乎没有定义列类型的JPA或Hibernate批注。您可能还需要在remarks字段上添加注释,以将其标识为CLOB

  • 谢谢,我将我的实体更改为映射为“@Column(name="remarks") @Lob private String comments;”,这解决了问题。关于 255 的错误代码让我失望,所以我只是忽略了它并使用我的注释来明确。 (3认同)