繁体   English   中英

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

[英]JPA serial numbers using a customer ID generation

当我尝试使用随机生成器而不是内置策略生成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)

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

a)mysql对可以构成索引一部分的字符有限制(因此整个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的限制长度,对于unicode字符为255,对于latin-1为765。 因此,对于unicode,您基本上与使用VARCHAR(255)作为主键一样好。

您提到了用于主键的随机数生成器,但它们被映射为斑点。 我不认为拥有超过255个字符的键是没有任何意义的(2E462的空间很大,比宇宙中的原子还要多!!),所以您应该将自己限制为简单的varchar。

但是很可能您想使用简单的Long,但是您搞砸了映射。 虽然没有代码也无法说。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM