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[],并以连续步骤处理它们