【问题标题】:Java EE/JPA: Improve query performance - store UUID as binaryJava EE/JPA:提高查询性能 - 将 UUID 存储为二进制
【发布时间】: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


    【解决方案1】:

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

        @Type(type = "pg-uuid")
    

    但是我在这样做时也遇到了原生查询的问题。

    【讨论】:

      猜你喜欢
      • 2017-09-22
      • 2016-11-03
      • 2018-10-19
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      相关资源
      最近更新 更多