【问题标题】:Seqential & continuous invoice number in Hibernate / ColdFusion ORM?Hibernate / ColdFusion ORM中的顺序和连续发票号?
【发布时间】:2010-12-21 03:31:43
【问题描述】:
我的计费软件的要求之一是发票编号必须连续且连续。 (不能跳过发票号)。
我尝试将发票编号设置为PK,并尝试了hibernate的增量和原生生成器,但它们都不能保证交易失败时的连续编号。下一张发票将有下一张发票编号,这会引入一个间隙(不连续)。
我该怎么办?
将 invoiceID 用作 PK,将 invoiceNumber 设置为 Nullable 列,并在 postInsert() 处使用线程安全编号生成器设置发票编号?
【问题讨论】:
标签:
hibernate
orm
coldfusion
【解决方案1】:
是的,如果您需要发票编号是连续的(即连续的),您需要自己分配发票编号。
用于生成伪键值的自动方法容易出现间隙,因为在一般情况下,您可能会拥有 ROLLBACK 或 DELETE 并留下间隙。
试图通过重用已删除的值或重新编号现有记录来填补空白来进行补偿是一个糟糕的主意。它受竞争条件的影响,在任何情况下都表现不佳。
伪密钥的生成器保证是唯一的,但不是连续的。
您可以将伪键作为主键,也将发票编号作为属性,该属性恰好具有UNIQUE 约束。这似乎是多余的,但有时这是最简单的解决方案。