Grails:如何生成一个人类友好的确定唯一的随机数
我有一个域类,它将有许多子类。与我的另一篇文章相关:我想创建父类(MikeyJob)的实例,但不保存它。然后生成一组子项,只有在子项验证后,才保存父项和所有子项 这一切都很好,但是MikeyJob需要一个作业编号,并且该编号必须是唯一的。这让我很困惑,因为在不同的会话中会有很多“可能会被保存”Grails:如何生成一个人类友好的确定唯一的随机数,grails,random,unique,Grails,Random,Unique,我有一个域类,它将有许多子类。与我的另一篇文章相关:我想创建父类(MikeyJob)的实例,但不保存它。然后生成一组子项,只有在子项验证后,才保存父项和所有子项 这一切都很好,但是MikeyJob需要一个作业编号,并且该编号必须是唯一的。这让我很困惑,因为在不同的会话中会有很多“可能会被保存”MikeyJobs浮动 这是我的想法: import java.util.Random Class MikeyJob{ BigInteger jobNumber def beforeInsert(
MikeyJob
s浮动
这是我的想法:
import java.util.Random
Class MikeyJob{
BigInteger jobNumber
def beforeInsert() = {
//this is where I think I need help
Random rand = new Random()
BigInteger max = 99999999
BigInteger randomInt = rand.nextInt(max)
MikeyJob.withSession{
while(randomInt<9999999 || MikeyJob.findByJobNumber(randomInt)){
randomInt = rand.nextInt(max)
}
}
this.jobNumber = randomInt
}
static hasMany=[jobItems:JobItem]
static constraints = {
jobNumber(nullable:true)
}
}
Class JobItem{
String importantStuff
}
这似乎有效,但有更好的方法吗?真的需要随机吗?还是仅仅是独一无二的?获得一个“随机”数字并不能保证它在任何事情上都是唯一的,甚至在任何时间都是唯一的 首先想到的是一个singleton类型的对象,它只在前面的数字上加1(或者使用数据库序列)。在你真正试图拯救整棵树之前,不要设置它。你的单身汉可以用最大的持续工作编号+1来播种自己 我还使用了一个时间戳字符串,可以通过添加会话唯一值来确保它是唯一的。即。。用户id+“-”+新日期().时间 编辑: Spring(grails)中声明的bean在默认情况下是单例的(容器只有一个实例,而不是单例模式)。因此,每次自动连接/注入bean时,整个系统都是同一个实例。然后抛出一个同步方法来获取其中的下一个值。您可以将bean连接起来,以便在容器启动时从数据库中的最大持久(分配)值中获取其种子(起始值) 使用数据库序列有点不同,因为它依赖于底层数据库来分配值,但它会做同样的事情。您应该能够在域对象中定义字段以自动分配序列给定的值
请看,但对于您的场景,您可能希望在jobNumber字段中显示生成器。(虽然不是100%确定这会起作用,但从未在id以外的任何字段上尝试过)您是否仅限于使用
int
s?或者你可以用字符串来表示作业编号
?最好是一个8位数的数字。它需要合理的人工访问。好的。通常我会说,如果a)您可以允许字符串,B)大小不重要,以及C)最终用户看不到,那么a会做得很好。Hrmmmm。。。这些单词像“singleton”和“database sequence”看起来像是我应该知道的东西。。。
Class JobMakerService{
def makeAJob(def bigMessyList){
def someNewJob = new MikeyJob() /NOT SAVED
def validItems = []
def invalidItems = []
bigMessyList.each{
def jobItem = //pseudo code to get a job item out of messy list
//also not saved
if(jobItem.validate())validItems.add jobItem
else invalidItems.add jobItem
}
if(invalidItems = []){
someNewJob.save()
validItems.each{
it.save()
}
} else def errorHandling = 1/0
}
}