我尝试在Hibernate中创建一个具有byte[12] id的实体。它似乎不喜欢将byte[]作为主键和另一列,它将其设置为支持mysql数据库中的一个tinyblob。我尝试创建一个字符串,但问题是java中的字符串是每个字符2个字节,而在mysql中它是每个字符一个字节。我正在寻找这样的东西
@Entity
public class TestClass {
@Id
@Column(length=12)
private byte[] id;
...
Map到这样的mysql表
Table 'testclass'
Column id - varbinary length 12 primary key
...
我已经尝试了很多不同的方法(主要是尝试摆弄字符串)来做到这一点,但它似乎不能正常工作。已经有人能够做到这一点了吗?谢谢。
2条答案
按热度按时间0h4hbjxa1#
正如您所体验到的,标准JPA不支持这一点。
2.1.4主键和实体标识
...
主索引键(或复合主索引键的字段或属性)应该是下列类型之一:任何Java基本类型;任何基本 Package 类型;第一次
java.sql.Date
。但是,一般而言,近似数值型别(例如浮点型别)绝不能用在主索引键中。主索引键使用其他型别的实体将无法移植。如果使用产生的主索引键,则只有整数型别可以移植。如果将java.util.Date
用做主索引键字段或属性,则暂时型别应指定为DATE
。也就是说,您可以使用
byte[]
周围的 Package 器类型并实现自定义用户类型。UserType for a byte[] identifier property wiki页面提供了一个实现。请参考Hibernate注解文档的2.4.3.2. Type一节,以声明和使用带有注解的自定义类型。
参考
资源
kqqjbcuj2#
不支持
byte[]
作为主键是有原因的-使用BLOB
字段作为主键不是一个好主意(mysql必须索引blob,我不确定这是否会有好的性能)。我甚至不确定mysql是否允许blob键。有一个错误说BLOB/TEXT不能在键规范中使用。您可以使用的是:
UUID
-它是128位唯一标识符