使用@TableGenerator的相关实体的可扩展顺序ID生成器

时间:2011-03-12 00:03:14

标签: hibernate jpa primary-key scalability

我正在编写一个Web应用程序,其中URL中的用户可以看到一些ID。该应用程序旨在供拥有每个帐户的更多用户使用。然后,帐户可以拥有项目,每个项目都有任务。

现在,我不希望用户使用ID为24876创建他们的第一个项目(或任何正常生成的ID),而是要有一个“漂亮的”顺序标识符另外生成的主键(主要是因为操作具有非复合标识符的实体更简单)。我们将这些顺序ID称为viewIds。

对于每个不同的“父”标识符,ViewID将从1开始(对于项目,这将是一个帐户)。组合(accountId,projectViewId)是唯一的,以及(projectId,taskViewId)等。

我的问题是:如何生成这些viewIds?我在考虑使用TableGenerator机制,但是这个机制也可以用于非标识符列吗?

但最重要的是,在多个应用程序服务器使用相同数据库的环境中生成此类ID的最佳方法是什么(理想情况下,无需让它们直接与彼此通信)?是否可能已经实现了TableGenerator或实现上述功能的实用程序?

1 个答案:

答案 0 :(得分:0)

好吧,这是我最终采用的解决方案:

我选择了一种基于数据库的方法,而不是依靠Hibernate / JPA来管理这些“漂亮的”ID,而不是

  • 对于具有viewID的每个实体,我定义一个触发器,该触发器将根据一个序列中的元素的最大值(例如,Project 22的所有任务)在每个插入处递增它。
  • 对于像Task这样的实体,我对(project_id,naturalId)也有一个多唯一键约束。

我不确定的一件事是它在例如数据库的主 - 主复制,可以使用两个数据库服务器。但对于应用程序服务器复制,这应该可以完成这项工作。