【问题标题】:Using a UUID as a Database Primary Key, Java type is a byte[]使用 UUID 作为数据库主键,Java 类型是 byte[]
【发布时间】:2010-10-18 10:13:12
【问题描述】:

在 JPA 实体中使用 byte[] 作为主键有什么问题吗?

我想使用 UUID 作为我的主键,但存储为字符串我觉得它太大了。

我正在考虑做这样的事情来将 ID 存储为 byte[] 并将其设置为我的实体 ID:

    public static byte[] byteArray(UUID uuid) {
        long lsb = uuid.getLeastSignificantBits();
        long msb = uuid.getMostSignificantBits();

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(bos);
        try {
            dos.writeLong(lsb);
            dos.writeLong(msb);
            dos.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        byte[] data = bos.toByteArray();
//      System.out.println("Byte Array Length "+data.length);
        return data;

    }

在数据库中添加索引会不会有什么问题?我同时使用 Postgres 和 HSQL。我使用 Hibernate 作为我的 JPA 提供程序。

【问题讨论】:

    标签: java sql jpa types bytearray


    【解决方案1】:

    请记住,使用 SQL 客户端的用户在查询 byte[] id 时会遇到问题。这就是为什么 db id 通常是数字的原因。手写查询要容易得多。

    【讨论】:

      【解决方案2】:

      我认为除了主键大于通常的 4 字节 (int) 主键会带来一点性能损失之外,这不会有任何问题。

      为什么需要 UUID 作为主键?为什么不能只使用具有自动增量的代理整数键?

      【讨论】:

      • 需要在数据库之外生成 ID,并且需要能够使用 UUID 从 DB 中检索任何对象。
      【解决方案3】:

      我同意较早的一位受访者的观点,即将键存储为字节会使在进行问题诊断时手动查询变得非常困难。使用 char(x) 或 varchar(x) 字段不会占用更多空间,并且支持人员更容易阅读。

      【讨论】:

      猜你喜欢
      • 2018-09-08
      • 2012-10-10
      • 2019-12-12
      • 1970-01-01
      • 2012-08-25
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多