Hibernate uuid生成会导致“数据太长”错误

时间:2014-02-20 08:44:33

标签: hibernate jpa

我在使用hibernate持久存入mysql表时遇到以下错误:

WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] SQL Error: 1406, SQLState: 22001
ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] Data truncation: Data too long for column 'REQUEST_ID' at row 1
ERROR [some.class.ClassImpl] persist failed: org.hibernate.exception.DataException: Data truncation: Data too long for column 'REQUEST_ID' at row 1
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:71) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]

以下是我如何使用生成值uuid作为我的主键

@Id
@Column(name="REQUEST_ID")
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")

这是mysql数据库中的专栏:

+---------------------+---------------+------+-----+---------+-------+
| Field               | Type          | Null | Key | Default | Extra |
+---------------------+---------------+------+-----+---------+-------+
| REQUEST_ID          | varchar(32)   | NO   | PRI | NULL    |       |
+---------------------+---------------+------+-----+---------+-------+

2 个答案:

答案 0 :(得分:5)

我很确定" uuid2"生成一个带有破折号的UUID,例如

4d8bef3d-f46f-4f4e-8cad-673feaed896c

尝试将数据库列设置为:

varchar(36)

并可选择将注释更新为以下内容:

@Column(name="REQUEST_ID", length=36)

@Length(min=36, max=36)

答案 1 :(得分:0)

使用@Column(name="REQUEST_ID", length=32),目前生成的变量字符长度大于32.您还可以使用@Length(max=32)

更新:,因为@ cliff.meyers回答 uuid2 根据this hibernate文档 uuid2 在生成的字符串中使用四个' - ' strong>使用org.hibernate.id.uuid.StandardRandomStrategy作为使用

的默认生成策略
  

“版本3”(又名“随机”)UUID值通过java.util.UUID的randomUUID方法

this引用指定为36个字符长。您需要将REQUEST_ID更改为varchar(36)或使用strategy = "uuid" string of 32 hexidecimal digits