Grails:防止具有多个关系的两个域类之间的级联关联

Grails:防止具有多个关系的两个域类之间的级联关联,grails,gorm,one-to-many,cascade,Grails,Gorm,One To Many,Cascade,考虑两个域类;工作和报价 一份工作有许多引用,但一份工作也有一个可接受的引用。接受的报价可为空,并且只有在用户接受特定报价后才应设置该报价。我将这些关系映射如下(为了便于说明而简化) 结果表正是我所需要的(至少在美学上),但当我去保存报价时,问题就出现了。 根据我的代码中的逻辑,使用jobId成功保存报价,但不幸的是,报价的id作为acceptedQuote保存在Job表中。是否仍有阻止此级联关联的方法?保存报价的代码相当基本,如下所示: def quoteInstance = new Quot

考虑两个域类;工作和报价

一份工作有许多引用,但一份工作也有一个可接受的引用。接受的报价可为空,并且只有在用户接受特定报价后才应设置该报价。我将这些关系映射如下(为了便于说明而简化)

结果表正是我所需要的(至少在美学上),但当我去保存报价时,问题就出现了。 根据我的代码中的逻辑,使用jobId成功保存报价,但不幸的是,报价的id作为acceptedQuote保存在Job表中。是否仍有阻止此级联关联的方法?保存报价的代码相当基本,如下所示:

def quoteInstance = new Quote(job: jobInstance, quoteAmount: amount)
if (quoteInstance.save(flush: true)) {
   render view: 'show', model: [quoteInstance: quoteInstance]
   break
}
显然,jobInstance被传递给Quote构造函数以在Quote表中保存关联,但我不知道如何防止Quote Id作为接受的Quote保存到作业表中。 也许我使用的GORM策略不能满足这些要求


任何帮助都将不胜感激。

这可能不是您想要的,但我实际上会对其进行稍微不同的建模-我会在
报价
域中有一个可接受的标志:

class Job {
    String title
    static hasMany = [quotes: Quote]
}

class Quote {
    static belongsTo = [job: Job]
    BigDecimal quoteAmount
    Boolean accepted
}
那么,您的持久性可能如下所示:

jobInstance.addToQuotes(new Quote(quoteAmount: 123.34, accepted: false)) //or true
不要担心你原来的问题

您还可以将瞬态及其
getter
添加到
作业
类中,以获取接受的
报价

class Job {
    String title
    static hasMany = [quotes: Quote]

    static transients = ['acceptedQuote']

    Quote getAcceptedQuote() {
        return Quote.findByJobAndAccepted(this, true)
    }

}

Grails/GORM通过遵循约定优于配置的方法,并使事情更加详细,从而简化了关联

您如何看待
类的以下结构

class Job {
    String title
    static hasMany = [quotes: Quote]//Job has many Quotes. Note: Accepted Quote is one of them.
}

class Quote {
    BigDecimal quoteAmount
    Boolean isAccepted

    static belongsTo = [job: Job]//Quote always belongs to a Job.
    //When a Job is deleted, quote is also cascade deleted.
}
现在,如果您创建的报价如下所示,那么一切都应该完美地工作:

def job = new Job(title: "Test Job").save()
//Just adding a quote
def quoteInstance = new Quote(quoteAmount: amount)
job.addToQuotes(quoteInstance)
job.save()

//Now accepting that quote
quoteInstance.isAccepted = true
job.save()
完成了

我们是否需要作业中的
acceptedQuote
参考?否
如何到达acceptedQuote


def acceptedQuote=job.quotes.find{it.isAccepted}

查看和关联配置。查看以了解有关级联行为配置的更多信息。

Bingo!下次我得打字快一点。:)巧合的是,我的评论和你的评论是一样的@Kelly已添加到我的结对程序员列表中。:)我还想在Quote上添加一个自定义验证约束,以防止一个作业有多个接受的Quote。老实说,我并不想挽回面子:-/但我确实想到了这一点,但出于性能原因,我打算采用另一种解决方案。但我越想,我不认为这有多大的优势,也不是一个优雅的战略。我想我开始想得太多了。我同意这个解决方案。大家好。我还要在
Quote
上添加一个自定义验证约束,以防止
Job
有多个接受的
Quote
def job = new Job(title: "Test Job").save()
//Just adding a quote
def quoteInstance = new Quote(quoteAmount: amount)
job.addToQuotes(quoteInstance)
job.save()

//Now accepting that quote
quoteInstance.isAccepted = true
job.save()