Java EE中的唯一编号生成

时间:2012-11-15 00:18:12

标签: java-ee jpa

我正在开发一个医疗通道中心的应用程序,多个用户通过JSF和JPA为医生预订。序列号对于Doctor,Date和Session是唯一的。我尝试从计算之前的预订中获取一个唯一的序列号并添加一个,但如果两个请求同时出现,则两个预订会获得相同的数字,从而导致功能上的麻烦。 在这种情况下如何获得唯一编号?我可以使用应用程序范围的bean来生成它吗? (我认为从数据库序列号中获取唯一编号并不实际,因为有几位医生,会议和每日他们必须有不同的预订编号。)

2 个答案:

答案 0 :(得分:1)

这是我将如何做到的:

在数据库中有一个包含6列的表:

  • id(自动生成的主键)
  • doctorId
  • 日期
  • 会话
  • 计数器
  • 版本(映射到用@Version注释的字段,用于乐观锁定)

确保在[doctorId,date,session]上添加一个独特的约束。

创建一个服务,在自己的事务中运行(REQUIRES_NEW传播),名为

 getNextValue(doctorId, date, session)

此服务应该从数据库表中获取与其三个参数相对应的计数器,将其返回并递增。如果还没有行,它应该创建它。

还有可能让两个并发事务尝试同时创建或增加同一行。在创建的情况下,由于唯一约束,其中一个事务将回滚。在增量的情况下,由于JPA乐观锁定,其中一个事务将回滚。

如果服务回滚,则重试,直到不再有例外。

这可以避免将所有这些计数器存储在内存中,是无状态的,因此如果重新启动应用程序不会导致任何问题,即使您拥有服务器集群也能正常工作。

答案 1 :(得分:0)

这是在数据库中使用序列的完美案例。

您应该在数据库表中创建ID,并确保该字段是通过序列自动生成的,然后您不必担心两行使用相同的值。