2009-04-08 20 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

相關問題