0

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

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

class Job {
    String title
    Quote acceptedQuote   
}

class Quote {
    Job job
    BigDecimal quoteAmount 
}

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

def quoteInstance = new Quote(job: jobInstance, quoteAmount: amount)
if (quoteInstance.save(flush: true)) {
   render view: 'show', model: [quoteInstance: quoteInstance]
   break
}

显然,jobInstance 被传递给 Quote 构造函数以将关联保存在 Quote 表中,但我不知道如何防止引用 Id 作为接受的报价保存到作业表中。也许我使用的 GORM 策略不能满足这些要求?

任何帮助将非常感激。

4

3 回答 3

1

这可能不是您要寻找的,但实际上我会对此进行一些不同的建模-我将在Quote域中有一个接受的标志:

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

并且不用担心您原来的问题。

您还可以将瞬态及其添加getterJob类中以获得接受Quote

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

    static transients = ['acceptedQuote']

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

}
于 2013-05-09T22:43:04.140 回答
0

Grails/GORM 通过遵循约定优于配置的方法并使事情变得更加冗长,使关联变得更简单。

您如何看待以下domain类的结构?

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在 Job 中引用吗?否
如何获得接受的报价?

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

于 2013-05-09T22:46:15.020 回答
0

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

于 2013-05-09T22:55:19.223 回答