Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在hibernate entity上创建Id,hibernate entity是一个映射到mysql中varbinary值的byte[]

如何在hibernate entity上创建Id,hibernate entity是一个映射到mysql中varbinary值的byte[]
EN

Stack Overflow用户
提问于 2010-09-10 15:36:46
回答 2查看 3.2K关注 0票数 1

我正在尝试创建一个在hibernate中具有byte12 id的实体。它似乎不喜欢将byte[]作为主键,并将其作为另一列设置为支持mysql数据库中的tinyblob。我尝试创建一个字符串,但问题是在java中的字符串是每个字符2个字节,而在mysql中是每个字符一个字节。我在找这样的东西

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Entity
public class TestClass {
    @Id
    @Column(length=12)
    private byte[] id;
...

要像这样映射到mysql表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Table 'testclass'
   Column id - varbinary     length 12     primary key
    ...

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-10 16:09:25

正如您所经历的,这不受标准JPA的支持。从规范中:

2.1.4主键和实体标识

..。

主键(或复合主键的字段或属性)应该是以下类型之一:任何Java基元类型;任何基元包装类型;java.lang.Stringjava.util.Datejava.sql.Date。但是,一般而言,不应该在主键中使用近似数值类型(例如,浮点类型)。主键使用这些类型以外的类型的实体将不可移植。如果使用生成的主键,则只有整型是可移植的。如果java.util.Date用作主键字段或属性,则应将时态类型指定为DATE

也就是说,您似乎可以在byte[]周围使用包装器类型,并实现自定义用户类型。UserType for a byte[] identifier property维基页面提供了一个实现。

请参考Hibernate注解文档的2.4.3.2. Type小节来声明和使用这个带有注解的自定义类型。

参考文献

  • JPA1.0 Specification
    • 第2.1.4“主键和实体JPA

  • Hibernate注释参考指南

资源

票数 1
EN

Stack Overflow用户

发布于 2010-09-11 06:33:35

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

您可以使用的是:

  • UUID -它是128位唯一的identifier
  • Base64 -(使用commons-codec)将字节数组编码为base64并使用字符串主键。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3686008

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文