Java EE / JPA:提高查询性能 - 将UUID存储为二进制文件

时间:2014-06-03 07:57:36

标签: database java-ee jpa jpql

我想将UU​​ID作为主要用途,因为这些原色是全局唯一的,这使得它(例如)很容易将数据从生产环境集成到正在运行的调试环境中。

关于以下文章:http://iops.io/blog/storing-billions-uuid-fields-mysql-innodb使用解码为BIN​​ARY(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。

有没有办法做到这一点?还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

为什么不直接使用特殊的uuid类型?

    @Type(type = "pg-uuid")

但是当我这样做时,我也遇到了本机查询的问题。