有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

oracle随机生成ID并在Java中高效持久化

我需要生成一个长度为12的数字,比如变量finalId。 在这12位数字中,有5位来自另一个值,比如partialid1

现在finalId=partialId1(5位)+partialId2(7位)

我需要随机生成partialid2,在这里我可以使用Java的随机类

最后,我必须将这个finalId作为主键插入数据库

所以,为了确保新生成的finalId不存在于Oracle数据库中,我还需要查询Oracle数据库

除了我上面提到的方法之外,还有其他有效的方法可以在Java中生成Id并在持久化之前签入数据库吗


共 (2) 个答案

  1. # 1 楼答案

    我更喜欢Java UUID

    您可以使用下面的代码使用UUID获得随机id

    String id = UUID.randomUUID().toString().substring(0,7); System.out.println("id "+ id);

    并且可以将其与其他部分id一起追加,并在DB中具有唯一键或主约束,具体取决于@Erwin建议的存储列

    注意:-我们过去做过这么多主键,从来没有发生过id冲突的情况

  2. # 2 楼答案

    一般来说,从一个id到另一个id都会有问题,因为你可能会把两个东西聚在一起,这样就更容易分开。具体地说,当您可以只使用两个键时,您可能会试图将外键压缩到主键中

    在任何情况下,如果您真的想从存根构建一个半随机主键,那么我建议按位进行,因为这样在SQL和Java中很容易提取原始id

    如前所述,如果生成UUID,那么实际上不需要检查它是否已经被使用,否则您可能会想这样做

    也就是说,制作身份证的代码可能是这样的:

    public class IdGenerator {
        private SecureRandom random = new SecureRandom();   
        private long preservedMask;
        private long randomMask;
    
        public void init(int preservedBits) {
            this.preservedMask = (1L << preservedBits) - 1;
            this.randomMask = ~this.preservedMask;
        }
    
        public long makeIdFrom(long preserved) {
            return (this.random.nextLong() & this.randomMask) | (preserved & this.preservedMask);
        }
    
        public UUID makeUuidFrom(long preserved) {
            UUID uuid = UUID.randomUUID();
            return new UUID(uuid.getMostSignificantBits(), (uuid.getLeastSignificantBits() & this.randomMask) | (preserved & this.preservedMask));
        }
    
        public boolean idsMatch(long id1, long id2) {
            return (id1 & this.preservedMask) == (id2 & this.preservedMask);
        }
    }
    

    从本质上讲,这会保留原始文件中的一些最低有效位。调用init时需要指定的号码