Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字母数字序列发生器_Java_Spring_Hibernate_Spring Data Jpa - Fatal编程技术网

Java 字母数字序列发生器

Java 字母数字序列发生器,java,spring,hibernate,spring-data-jpa,Java,Spring,Hibernate,Spring Data Jpa,如何像 Rxt-AA0001 Rxt-AA0002 Rxt-AA0003 .. .. Rxt-AA9999 Rxt-AB0001 Rxt-AB0002 用这个 public class UserIdGenerator extends SequenceStyleGenerator { public static final String VALUE_PREFIX_PARAMETER = "valuePrefix"; public static final

如何像
Rxt-AA0001
Rxt-AA0002
Rxt-AA0003
..
..
Rxt-AA9999
Rxt-AB0001
Rxt-AB0002

用这个

public class UserIdGenerator extends SequenceStyleGenerator {
 
    public static final String VALUE_PREFIX_PARAMETER = "valuePrefix";
    public static final String VALUE_PREFIX_DEFAULT = "";
    private String valuePrefix;
 
    public static final String NUMBER_FORMAT_PARAMETER = "numberFormat";
    public static final String NUMBER_FORMAT_DEFAULT = "%d";
    private String numberFormat;
 
    @Override
    public Serializable generate(SharedSessionContractImplementor session,
            Object object) throws HibernateException {
        return valuePrefix + String.format(numberFormat, super.generate(session, object));
    }
 
    @Override
    public void configure(Type type, Properties params,
            ServiceRegistry serviceRegistry) throws MappingException {
        super.configure(LongType.INSTANCE, params, serviceRegistry);
        valuePrefix = ConfigurationHelper.getString(VALUE_PREFIX_PARAMETER,
                params, VALUE_PREFIX_DEFAULT);
        numberFormat = ConfigurationHelper.getString(NUMBER_FORMAT_PARAMETER,
                params, NUMBER_FORMAT_DEFAULT);
    }
 
}
这是我在模型中的用户id

    @Id
    @GeneratedValue(generator = "user_seq_generator", strategy = GenerationType.SEQUENCE)
    @GenericGenerator(name = "user_seq_generator", strategy = "user.util.UserIdGenerator", parameters = {
            @Parameter(name = UserIdGenerator.INCREMENT_PARAM, value = "1"),
            @Parameter(name = UserIdGenerator.VALUE_PREFIX_PARAMETER, value = "RxT-AA"),
            @Parameter(name = UserIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%04d") })
    @Column(name = "user_id")
    private String Id;

我能够生成字母数字id,但我不确定如何在创建id时增加字符数。一般来说,最好不要增加字符数。这使他们不安全。本视频包含一个很好的解释:

Java有一个用于生成ID的内置UUID类。
这是它的javadoc:

通常在创建ID时,最好不要增加ID。这使他们不安全。本视频包含一个很好的解释:

Java有一个用于生成ID的内置UUID类。
这是它的javadoc:

它可以非常简单地完成-请参见下面的类

然而,根据目的不同,使用UUID可能更有益,正如@Someone所建议的那样

import java.util.Arrays;

public class AlphaNumber {
    public static char[] ALPHA_NUMBER_CHARS = "0123ABC".toCharArray(); // add here your characters
    private int[] number = new int[32]; // here you control the maximum size of the number
    private int size = 0; // here we control the actual size of the number

    public AlphaNumber() {
        Arrays.fill(number,0);
    }

    public String inc() {
        for(int i=0;i<=size;i++) {
            number[i]++;
            if (number[i] < ALPHA_NUMBER_CHARS.length) {
                break;
            }
            number[i]=0;
            size = Math.max(i+1,size);
        }
        return toString();
    }

    public String toString() {
        StringBuilder r = new StringBuilder();
        for (int i = size; i>=0; i--) {
            r.append(ALPHA_NUMBER_CHARS[number[i]]);
        }
        return new String(r);
    }

    public static void main(String[] args) {
        AlphaNumber a = new AlphaNumber();
        for (int i = 0; i < 100; i++) {
            System.out.println(a.inc());
        }
    }
}
导入java.util.array;
公共类字母编号{
public static char[]ALPHA_NUMBER_CHARS=“0123ABC”.toCharArray();//在这里添加您的字符
private int[]number=new int[32];//这里您可以控制数字的最大大小
private int size=0;//这里我们控制数字的实际大小
公共字母编号(){
数组。填充(数字,0);
}
公共字符串公司{
对于(int i=0;i=0;i--){
r、 追加(ALPHA_NUMBER_CHARS[NUMBER[i]]);
}
返回新字符串(r);
}
公共静态void main(字符串[]args){
AlphaNumber a=新的AlphaNumber();
对于(int i=0;i<100;i++){
System.out.println(a.inc());
}
}
}

这可以非常简单地完成-请参见下面的类

然而,根据目的不同,使用UUID可能更有益,正如@Someone所建议的那样

import java.util.Arrays;

public class AlphaNumber {
    public static char[] ALPHA_NUMBER_CHARS = "0123ABC".toCharArray(); // add here your characters
    private int[] number = new int[32]; // here you control the maximum size of the number
    private int size = 0; // here we control the actual size of the number

    public AlphaNumber() {
        Arrays.fill(number,0);
    }

    public String inc() {
        for(int i=0;i<=size;i++) {
            number[i]++;
            if (number[i] < ALPHA_NUMBER_CHARS.length) {
                break;
            }
            number[i]=0;
            size = Math.max(i+1,size);
        }
        return toString();
    }

    public String toString() {
        StringBuilder r = new StringBuilder();
        for (int i = size; i>=0; i--) {
            r.append(ALPHA_NUMBER_CHARS[number[i]]);
        }
        return new String(r);
    }

    public static void main(String[] args) {
        AlphaNumber a = new AlphaNumber();
        for (int i = 0; i < 100; i++) {
            System.out.println(a.inc());
        }
    }
}
导入java.util.array;
公共类字母编号{
public static char[]ALPHA_NUMBER_CHARS=“0123ABC”.toCharArray();//在这里添加您的字符
private int[]number=new int[32];//这里您可以控制数字的最大大小
private int size=0;//这里我们控制数字的实际大小
公共字母编号(){
数组。填充(数字,0);
}
公共字符串公司{
对于(int i=0;i=0;i--){
r、 追加(ALPHA_NUMBER_CHARS[NUMBER[i]]);
}
返回新字符串(r);
}
公共静态void main(字符串[]args){
AlphaNumber a=新的AlphaNumber();
对于(int i=0;i<100;i++){
System.out.println(a.inc());
}
}
}

和包含所有字母的数组,并增加数组的索引和包含所有字母的数组,增加数组的索引可能我没问对,看,我有数字值增加了,我需要的是当数字达到9999时,将AA增加到AB,这将保存在数据库中,现在我的想法是将所有id存储在HashMap中,然后为每个新用户生成id,并检查它是否已经被使用,以及数字高于9999更改字母表并再次检查当然我知道UUID,但这是requirement@SunnyKumar你得说实话。。。告诉我们你的要求是什么。我有一种感觉,您可能需要再降低一级,并将其作为存储过程实现。如果您将其保留在hibernate层,则可能无法工作。您有多少个应用服务器?你打算如何保持它们的同步?目前只有一个应用服务器,但未来的计划是添加更多服务器,但既然你提到了,我认为存储过程可能会起作用,我会尝试一下。正如我提到的,我需要在FIXED_ALPHA+VAR_ALPHA+VAR_numberd中的id和第二个数组,比如数字[]。例如:numberDigits[],然后在连续的步骤中处理它们可能我没有要求正确,看到了吗?我有数字值增加了。我需要的是当数字达到9999时,将AA增加到AB,这将保存在数据库中。现在我的想法是将所有id存储在哈希图中,然后为每个新用户生成id,并检查它是否已被使用,以及是否已被使用数字高于9999更改字母表并再次检查当然我知道UUID,但这是requirement@SunnyKumar你得说实话。。。告诉我们你的要求是什么。我有一种感觉,您可能需要再降低一级,并将其作为存储过程实现。如果您将其保留在hibernate层,则可能无法工作。您有多少个应用服务器?你打算如何保持它们的同步?目前只有一个应用服务器,但未来的计划是添加更多服务器,但既然你提到了,我认为存储过程可能会起作用,我会尝试一下。正如我提到的,我需要在FIXED_ALPHA+VAR_ALPHA+VAR_numberd中的id和第二个数组,比如数字[]。例如:numberDigits[],并以连续步骤处理它们