Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.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
Grails:如何生成一个人类友好的确定唯一的随机数_Grails_Random_Unique - Fatal编程技术网

Grails:如何生成一个人类友好的确定唯一的随机数

Grails:如何生成一个人类友好的确定唯一的随机数,grails,random,unique,Grails,Random,Unique,我有一个域类,它将有许多子类。与我的另一篇文章相关:我想创建父类(MikeyJob)的实例,但不保存它。然后生成一组子项,只有在子项验证后,才保存父项和所有子项 这一切都很好,但是MikeyJob需要一个作业编号,并且该编号必须是唯一的。这让我很困惑,因为在不同的会话中会有很多“可能会被保存”MikeyJobs浮动 这是我的想法: import java.util.Random Class MikeyJob{ BigInteger jobNumber def beforeInsert(

我有一个域类,它将有许多子类。与我的另一篇文章相关:我想创建父类(MikeyJob)的实例,但不保存它。然后生成一组子项,只有在子项验证后,才保存父项和所有子项

这一切都很好,但是MikeyJob需要一个作业编号,并且该编号必须是唯一的。这让我很困惑,因为在不同的会话中会有很多“可能会被保存”
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


  }
}