Java JSF/JPA应用程序中的多序列号生成

Java JSF/JPA应用程序中的多序列号生成,java,mysql,jsf,jpa,Java,Mysql,Jsf,Jpa,我有一个JSF/JPA应用程序,其中有20多个用户登录到系统并生成账单类型的实体。这些新生成的实体需要具有部门和票据类型唯一的票据编号 枚举中的票据类型示例 Opd Payment Inward 部门类型示例用户输入几乎无限数量的部门 Ruhuna Coop Arogya 账单编号示例 Ruhuna/Opd/001 Ruhuna/Opd/002 Ruhuna/Payment/001 Coop/Opd/001 Ruhuna/Opd/003 Coop/Payment/001 我将所有账单记录在

我有一个JSF/JPA应用程序,其中有20多个用户登录到系统并生成账单类型的实体。这些新生成的实体需要具有部门和票据类型唯一的票据编号

枚举中的票据类型示例

Opd
Payment
Inward
部门类型示例用户输入几乎无限数量的部门

Ruhuna
Coop
Arogya
账单编号示例

Ruhuna/Opd/001
Ruhuna/Opd/002
Ruhuna/Payment/001
Coop/Opd/001
Ruhuna/Opd/003
Coop/Payment/001
我将所有账单记录在一个名为“账单”的实体中。 目前,我使用带有@Named注释的应用程序范围JSF控制器在将BillType和Department作为参数传递后检查账单总数。我向计数中添加一个,并向计数中添加BillType和Department Code前缀以生成BillNo。添加票据编号后不久,我将保留新创建的票据

问题是,如果两个用户同时结算来自同一部门和同一票据类型的票据,则BillNumber会重复。例如,可能有两个Ruhunu/Opd/21300,第三个账单将作为Ruhunu/Opd/21302。因此,Ruhunu/Opd/21301票据编号缺失。 错误示例

Ruhunu/Opd/21300与第二张账单同时计费。 Ruhunu/Opd/21300与第一张账单同时计费。 Ruhunu/Opd/21302第三法案

绝对有必要防止生成重复号码,因为在实际设置中,该号码用于跟踪账单、取消、退款、付款等

请建议生成多个序列号的方法,以防止重复

提前谢谢

Technical Details
    Application Server - GlassFish 3.1.2.2
    Persistence Provider - EclipseLink 2.5 (used with all possible caching methods, still failed.)
    Database - MySQL
    Number of Application Instances - One
    Clustering of Application Servers - Not at this moment
    Clustering of Database - Not at this moment

如果您不关心非常小的数字,您可以使用UUID生成唯一的ID-不,客户希望它从1开始就有序。例如,一个部门的主要出纳应该能够在一天结束时获取账单编号,并手动查找丢失的账单。在这种情况下,在mysql数据库中创建自动增量并从中生成ID更安全。想象一下,如果托管bean中创建了某个id,那么集群环境中会出现所有混乱。此外,如果实体被删除,您的需求是否也需要重用id?但实际上,部门的数量是无限的。例如,最终用户可以在开发人员不知情的情况下创建任意数量的部门。因此,在这里不可能写入单独的表并自动生成id,因为不能在用户每次创建新部门时创建表。