使用自动增量生成String类型的长数字ID

时间:2018-02-20 10:12:41

标签: java jpa spring-boot h2

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

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

更新

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

2 个答案:

答案 0 :(得分: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。你可以根据自己的口味调整。

答案 1 :(得分:0)

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