使用客户ID生成的JPA序列号

时间:2015-03-27 16:42:03

标签: java mysql jpa netbeans eclipselink

当我尝试使用随机生成器而不是内置策略为ID生成序列号时出现此错误:

run:
[EL Info]: 2015-03-27 18:22:05.047--ServerSession(1185812646)--EclipseLink, version: Eclipse Persistence Services - 2.5.0.v20130507-3faac2b
[EL Info]: connection: 2015-03-27 18:22:09.295--ServerSession(1185812646)--file:/C:/Users/Sobhie/Desktop/people/build/classes/_peoplePU login successful
[EL Warning]: 2015-03-27 18:22:09.498--ServerSession(1185812646)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: BLOB/TEXT column 'R' used in key specification without a key length
Error Code: 1170
Call: CREATE TABLE PERSON (R LONGBLOB NOT NULL, FNAME VARCHAR(255), ID BIGINT, LNAME VARCHAR(255), X INTEGER, PRIMARY KEY (R))
Query: DataModifyQuery(sql="CREATE TABLE PERSON (R LONGBLOB NOT NULL, FNAME VARCHAR(255), ID BIGINT, LNAME VARCHAR(255), X INTEGER, PRIMARY KEY (R))")
BUILD SUCCESSFUL (total time: 13 seconds)

1 个答案:

答案 0 :(得分:1)

您当前的自定义主键策略导致主键映射为blob(因此可能是序列化对象))。 开箱即用,BLOB或TEXT不能用作mysql中的PRIMARY KEY

a)mysql限制了有多少characeters可以构成索引的一部分(因此整个TEXT内容是不可能的), b)TEXT没有大小限制(例如TEXT(512))

要将TEXT用作主键,必须将索引长度声明为显式(因此mysql将仅查看前X个字符)。

CREATE TABLE PERSON (R TEXT NOT NULL, FNAME VARCHAR(255), ..., KEY ix_length_r (R(255)))

如果您的R值在前XX个字符中不唯一,则无效。

但mysql ix限制长度,对于unicodecharacters降至255,对于latin-1降至765。因此,对于unicode,您基本上可以使用VARCHAR(255)作为主键。

您提到了主键的随机数生成器,但它们被映射为blob。我不相信拥有超过255个字符的键是有意义的(它是一个关于2E462的巨大空间,所以比宇宙中的原子更多!!!),所以你应该限制自己将它们作为简单的varchar。

但很可能你想使用简单的Long,但是你搞砸了你的映射。不过没有代码就不可能说。