我想将UUID作为主要用途,因为这些原色是全局唯一的,这使得它(例如)很容易将数据从生产环境集成到正在运行的调试环境中。
关于以下文章:http://iops.io/blog/storing-billions-uuid-fields-mysql-innodb使用解码为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。
有没有办法做到这一点?还有其他选择吗?
答案 0 :(得分:0)
为什么不直接使用特殊的uuid类型?
@Type(type = "pg-uuid")
但是当我这样做时,我也遇到了本机查询的问题。