在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提供程序。
答案 0 :(得分:1)
我不认为除了主键大于通常的4字节(int)之外的性能损失之外,还有其他问题。
为什么需要UUID作为主键?为什么不能只使用带有自动增量的代理整数键?
答案 1 :(得分:1)
请记住,使用SQL客户端的用户在查询byte [] id时会遇到问题。这就是db ID通常是数字的原因;手写查询要容易得多。
答案 2 :(得分:1)
我同意之前的一位回复者的意见,即将密钥存储为字节会使得在进行问题诊断时难以手工查询。使用char(x)或varchar(x)字段不会占用更多空间,并且支持人员更容易阅读。