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

时间:2013-05-09 22:09:48

标签: grails gorm one-to-many cascade

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

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

class Job {
    String title
    Quote acceptedQuote   
}

class Quote {
    Job job
    BigDecimal quoteAmount 
}

结果表正是我所需要的(至少在美学上),但是当我去保存报价时出现问题。 根据我的代码中的逻辑,使用jobId成功保存Quote,但不幸的是,quote的id作为acceptedQuote保存在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策略不能满足这些要求吗?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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

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

您还可以向getter课程添加一个瞬态及其Job以获取已接受的Quote

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

    static transients = ['acceptedQuote']

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

}

答案 1 :(得分: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()

完成。

我们在Job中需要acceptedQuote引用吗?没有
如何到达acceptedQuote?

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

答案 2 :(得分:0)

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