jpa 如何在Hibernate实体上创建Id,该实体是Map到mysql中varbinary值的byte[]

46scxncf  于 2022-11-14  发布在  Mysql
关注(0)|答案(2)|浏览(134)

我尝试在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
    ...

我已经尝试了很多不同的方法(主要是尝试摆弄字符串)来做到这一点,但它似乎不能正常工作。已经有人能够做到这一点了吗?谢谢。

0h4hbjxa

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一节,以声明和使用带有注解的自定义类型。

参考

  • JPA 1.0规范
  • 第2.1.4节“主键和实体标识”
  • Hibernate注解参考指南
  • 2.4.3.2.产品类型

资源

kqqjbcuj

kqqjbcuj2#

不支持byte[]作为主键是有原因的-使用BLOB字段作为主键不是一个好主意(mysql必须索引blob,我不确定这是否会有好的性能)。我甚至不确定mysql是否允许blob键。有一个错误说BLOB/TEXT不能在键规范中使用。
您可以使用的是:

  • UUID-它是128位唯一标识符
  • Base64 -(使用commons-codec)将字节数组编码为base64并使用字符串主键。

相关问题