【问题标题】:Generate long numeric id of type String with auto increment生成具有自动增量的 String 类型的长数字 id
【发布时间】:2018-02-20 10:12:41
【问题描述】:

我需要将具有数字 id(15-25 位)的实体保存到 H2 db。由于db不支持BigInteger(它映射到Decimal),所以保存这么长的数字的唯一方法是String类型。

问题:如何生成String 类型的自动递增数字ID?

更新

ID 应如下所示:123456789012345(最少 15 位,最多 25 位)

【问题讨论】:

标签: java jpa spring-boot h2


【解决方案1】:

您仍然可以在幕后使用BigInteger

这样的东西应该适用于任意位数并且是线程安全的。

private static final AtomicReference<BigInteger> id = new AtomicReference<>(BigInteger.ZERO);

public String nextId() {
    BigInteger next = id.accumulateAndGet(BigInteger.ONE, (x, y) -> x.add(y));
    return next.toString();
}

public void test(String[] args) {
    for ( int i = 0; i < 100; i++ ) {
        System.out.println(nextId());
    }
}

如果您的限制(15 - 25 位)很难,那么可能会这样做。

private static final int MIN_DIGITS = 2;
private static final int MAX_DIGITS = 3;
private static final BigInteger start = BigInteger.TEN.pow(MIN_DIGITS-1);
private static final BigInteger limit = BigInteger.TEN.pow(MAX_DIGITS).subtract(BigInteger.ONE);

private static final AtomicReference<BigInteger> id = new AtomicReference<>(start);

public String nextId() {
    BigInteger next = id.accumulateAndGet(BigInteger.ONE, (x, y) -> {
        if(x.compareTo(limit) >= 0) {
            // Back to start.
            return start;
        }
        return x.add(y);
    });
    return next.toString();
}

public void test(String[] args) {
    for ( int i = 0; i < 1000; i++ ) {
        System.out.println(nextId());
    }
}

请注意,为了进行测试,我将限制设置为 23。您可以根据自己的口味进行调整。

【讨论】:

  • 我没有看到对 db 中现有 ID 的任何引用。是否有可能重复的ID?特别是如果我们将重新启动应用程序
  • @user1376885 - 您必须在启动时从数据库初始化初始值。
【解决方案2】:

使用 IDENTITY(START WITH 10000000000), java Long, autoincrement: http://www.h2database.com/html/datatypes.html#identity_type

【讨论】:

  • 如果可以的话,这将是最简单的方法,但 Long 仅支持最多 19 个符号。我最多需要 25 个符号。这就是为什么我坚持如何做到这一点。
  • @user1376885 为什么需要最多 25 个符号,为什么要自动递增?你的要求很奇怪。
  • 没有解释为什么需要25个符号,这只是测试任务范围内的要求。至于自动增量,我的假设是如何使 id 独一无二。
  • @user1376885 不要假设任何事情,并明确您的要求。你现在用你的“自动递增字符串”做的事情太荒谬了。
  • 我会尝试澄清要求。给你一个问题,如果需要对 ID 使用 Long 类型但最小位数 = 10 和最大位数 = 15,我该如何设置这些限制?
猜你喜欢
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 2019-07-26
  • 2016-10-31
  • 2019-12-29
  • 2016-09-27
相关资源
最近更新 更多