【问题标题】:Is generator="increment" good enough for sequential invoice number?generator="increment" 对于顺序发票编号是否足够好?
【发布时间】:2010-12-20 19:15:34
【问题描述】:

我需要使用 ORM (Hibernate) 在 ColdFusion 9 中编写发票生成软件。

其中一个要求是发票编号必须连续无间隔,即不能跳过发票编号。

数据库标识值(即 generator="native")不起作用,因为如果事务提交失败,它会跳过一个数字。

根据CF9 documentation

increment:此算法生成 long、short 或 int 通过增加一个计数器 由 ORM 维护。这是常见的 自动生成时使用 未启用主键 表,您希望 ORM 生成 首要的关键。这应该在什么时候使用 ColdFusion 的单个实例是 只处理将数据插入 表。

Hibernate 的增量生成器是否保证不跳过失败的事务?够好吗?

如果没有,我应该怎么做?在 postInsert() 中通过线程安全的序列号生成器插入发票号?

【问题讨论】:

    标签: hibernate coldfusion


    【解决方案1】:

    generator=”increment” 足以保证在失败的交易中不跳过顺序发票号。

    刚刚测试过:

    // foo.cfc
    /** @generator increment */
    property numeric id;
    
    // test.cfm
    f1 = entityNew("foo");
    f2 = entityNew("foo");
    entitySave(f1);
    ormflush();
    eneitySave(f2);
    throw();
    

    然后我浏览到 test.cfm 并刷新了几次。 Foo 表中的 ID 列都是奇数,因为 f2 被分配了偶数,但没有保存。

    【讨论】:

      【解决方案2】:

      查看 Hibernate 的文档,似乎在配置此生成器方面有相当大的灵活性。基本原理是从数据库中查找ID的最大值,然后加1。数字不应有差距。但是,您应该注意并发问题。

      【讨论】:

      • 根据文档,只要在单个 CF 实例中使用它就不应该有任何并发​​问题。我想我真的必须测试一下,看看失败的交易是否会跳过生成的数字。
      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 2012-06-11
      • 2019-04-19
      • 2012-09-17
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      相关资源
      最近更新 更多