Hibernate非顺序生成实体ID

时间:2016-04-07 19:37:08

标签: database hibernate

如何以非顺序方式为对象生成ID?我更希望ID不是线性序列,因此是可预测的。然而,@GeneratedValue的生成策略是AUTO, TABLE, IDENTITY, SEQUENCE。有这样的(自动)选项吗?或者我需要自己生成它? (然后检查这样的ID是否已存在等。)

在这个注释中,我觉得拥有线性可预测的ID并不是理想的方式。我对么?例如,对于未上市的YouTube视频或Google云端硬盘分享链接等资源,依次拥有ID将是一个很大的缺陷,因为它很容易通过它们进行迭代。

1 个答案:

答案 0 :(得分:0)

我建议的最佳做法是避免将内部主键暴露给外部客户。除了您提到的容易猜到的值之外,它还使得以后合并数据库变得更加困难(例如,如果您要组合多个prod实例)或重构数据设计(在这种情况下,当前主键不再有效)的/有用的/其它)。

如果您将ID保留在本地应用程序中,那么使用顺序PK就可以了,因为它只在数据库中使用,并且它是许多RDBM中的常用方法。

现在,您需要一个业务派生的唯一标识符,以便能够提取消费者可能需要的特定XYZ。可以是单列或多列,但如果有意义,它的含义需要比数据库含义更具商业意义。就个人而言,我喜欢使用GUID / UUID,因为虽然理论上可行,但很少有重叠(但取决于实现)。但是,您可能不希望将GUID用作PK,因为FK关系涉及更多字节,而整数则要小得多。

如果您确实想要使用消费者可以使用的非顺序ID,则可以创建一个进行一些随机化的数据库视图,并将其用作@GeneratedValue中的表(免责声明:I&# 39;我从来没有做过这样的事情,我总是使用序列生成器,但从理论上讲它可能会起作用。)