使用UUID作为数据库主键,Java类型是字节[]

使用UUID作为数据库主键,Java类型是字节[],java,sql,jpa,types,bytearray,Java,Sql,Jpa,Types,Bytearray,在JPA实体中使用字节[]作为主键是否存在任何问题 我想使用UUID作为主键,但作为字符串存储,我觉得它太大了 我正在考虑这样做,将ID存储为字节[],并将其设置为实体的ID: public static byte[] byteArray(UUID uuid) { long lsb = uuid.getLeastSignificantBits(); long msb = uuid.getMostSignificantBits(); Byt

在JPA实体中使用字节[]作为主键是否存在任何问题

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

我正在考虑这样做,将ID存储为字节[],并将其设置为实体的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字节(int)的性能损失


为什么需要UUID作为主键?为什么不能将代理整数键与自动递增一起使用?

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

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

需要在数据库之外生成ID,并且需要能够使用UUID从数据库检索任何对象。关于此假设是错误的