2

在 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 提供程序。

4

3 回答 3

1

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

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

于 2009-04-08T21:08:29.267 回答
1

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

于 2009-04-14T12:39:15.360 回答
1

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

于 2009-04-14T13:46:16.883 回答