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

时间:2009-04-08 21:05:30

标签: java sql jpa types bytearray

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

3 个答案:

答案 0 :(得分:1)

我不认为除了主键大于通常的4字节(int)之外的性能损失之外,还有其他问题。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我同意之前的一位回复者的意见,即将密钥存储为字节会使得在进行问题诊断时难以手工查询。使用char(x)或varchar(x)字段不会占用更多空间,并且支持人员更容易阅读。