2009-04-08 42 views
2

在使用byte []作为JPA实体中的主键时是否存在任何问题?将UUID用作数据库主键,Java类型是一个字节[]

我想使用一个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; 

    } 

我有没有把指数在此DB中的任何麻烦?我正在使用Postgres和HSQL。我使用Hibernate作为我的JPA提供程序。

回答

1

请记住,使用SQL客户端的用户将无法查询byte [] ids。这就是为什么db ids通常是数字的原因;手写查询要容易得多。

1

我不认为会有这个问题,除了一个主键大于通常的4个字节(整数)之一的性能损失。

为什么你需要一个UUID作为主键?为什么你不能只用自动增量的代理整数键?

+0

需要在数据库之外生成ID,并且需要能够使用UUID从DB中检索任何对象。 – systemoutprintln 2009-04-08 21:31:02

1

我会同意一位较早的受访者将密钥存储为字节,这使得在进行问题诊断时很难手动查询。使用char(x)或varchar(x)字段不会消耗更多的空间,并且支持人员更容易阅读。

+0

关于http://iops.io/blog/storing-billions-uuid-fields-mysql-innodb这个假设是错误的 – 2014-06-03 07:16:07