我正在尝试创建一个在hibernate中具有byte12 id的实体。它似乎不喜欢将byte[]作为主键,并将其作为另一列设置为支持mysql数据库中的tinyblob。我尝试创建一个字符串,但问题是在java中的字符串是每个字符2个字节,而在mysql中是每个字符一个字节。我在找这样的东西
@Entity
public class TestClass {
@Id
@Column(length=12)
private byte[] id;
...
要像这样映射到mysql表
Table 'testclass'
Column id - varbinary length 12 primary key
...
我尝试了许多不同的方法(主要是尝试摆弄Strings)来做这件事,但它似乎不能正常工作。有没有人已经能够做到这一点?谢谢。
发布于 2010-09-10 16:09:25
正如您所经历的,这不受标准JPA的支持。从规范中:
2.1.4主键和实体标识
..。
主键(或复合主键的字段或属性)应该是以下类型之一:任何Java基元类型;任何基元包装类型;java.lang.String
;java.util.Date
;java.sql.Date
。但是,一般而言,不应该在主键中使用近似数值类型(例如,浮点类型)。主键使用这些类型以外的类型的实体将不可移植。如果使用生成的主键,则只有整型是可移植的。如果java.util.Date
用作主键字段或属性,则应将时态类型指定为DATE
。
也就是说,您似乎可以在byte[]
周围使用包装器类型,并实现自定义用户类型。UserType for a byte[] identifier property维基页面提供了一个实现。
请参考Hibernate注解文档的2.4.3.2. Type小节来声明和使用这个带有注解的自定义类型。
参考文献
资源
发布于 2010-09-11 06:33:35
不支持byte[]
作为主键是有原因的--使用BLOB
字段作为主键不是一个好主意(mysql将不得不索引blob,我不确定这是否会有好的性能)。我甚至不确定mysql是否允许blob键。有一个错误,指出BLOB/TEXT不能在关键规范中使用。
您可以使用的是:
UUID
-它是128位唯一的identifierhttps://stackoverflow.com/questions/3686008
复制相似问题