【发布时间】:2014-07-23 11:28:23
【问题描述】:
我想将 UUID 用作主要,因为这些主要是全球唯一的,这使得(例如)可以轻松地将生产环境中的数据集成到正在运行的调试环境中。
关于以下文章:http://iops.io/blog/storing-billions-uuid-fields-mysql-innodb SELECT/INSERT 使用解码为 BINARY(16) 的 UUID 将数百万条记录SELECT/INSERT 比使用简单的 CHAR(36) 快得多。
现在,使用 Hibernate @GenericGenerator 注解,我可以使用这个原生 UUID 生成器作为使用 UUID 的主键:
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
另一方面,我可以将二进制 UUID 定义为主要的,如下所示:
@Id
@Getter
@Column(columnDefinition = "BINARY(16)", length = 16, updatable=false, nullable=false)
private byte[] id;
... 并使用 @PrePersist 生成新的 UUID
@PrePersist
private void prePersist() {
if (this.id == null) {
this.generateUUID();
}
}
此解决方案的问题在于(本地/命名)查询中过滤器的二进制表示:
SELECT * from object o WHERE o.id=:id
我真正需要的是能够将上述 UUID 字段作为 BINARY 存储在数据库中,同时将值表示为简单的 UUID-String。
有没有办法做到这一点?有没有其他选择?
【问题讨论】:
标签: database jakarta-ee jpa jpql