【问题标题】:Grails Relation m:n:nGrails 关系 m:n:n
【发布时间】:2015-06-25 14:01:36
【问题描述】:

我们在 grails 下使用现有的 mysql 数据库,其中包含 m:n 关系。这里没问题。但是现在我们的情况是我必须添加第二个 n 关系条目,它链接到同一个表并且必须与第一个 n 条目相关联。

如果是用于数据库,我会简单地创建一个如下所示的表:

field m_id -> links to m table
field n_id1 -> links to n table
field n_id2 -> links to n table

但是如何在 grails 域类中表示呢?

可能已经在某个地方找到了答案,但我所做的搜索没有成功,可能是由于缺乏搜索词的创造力。

编辑:

试图澄清这个问题:我们有一个多对多的关系,但一侧有两个项目,它们必须保持相互关联(并且还必须清楚哪个是原始的,哪个是是替换项),因此它们不能被分成两个独立的关系条目。

嗯...想想赛车手提名一系列比赛,每个提名都必须包含车手和他的替补。比赛是 m(左手),车手是 n1,替补是 n2。 (找到一个例子真的很辛苦......)

编辑:

碰巧我发现this question 解决了同样的问题,但也没有解决。

【问题讨论】:

  • 有趣的是,一个人在四个多月前提出的问题上被否决了。

标签: database grails grails-domain-class


【解决方案1】:

看一下文档,很清楚: http://grails.github.io/grails-doc/2.5.0/guide/GORM.html#gormAssociation

无论如何,我不确定我是否理解你想要做什么,但让我们试试吧。

如果是一对一的关系,你可以简单地做这样的事情:

class DomainA {

    DomainB domainB
    DomainC firstDomainC
    DomainC secondDomainC
}

class DomainB {
}

class DomainC {
}

这将在“domain_a”表中创建以下字段:

  • “domain_b_id”
  • “first_domain_c_id”
  • “second_domain_c_id”

如果它是从 DomainA 到 DomainB 和 DomainC 的一对多关系,并且在 DomainA 中有两个不同的 DomainC 集合,则您必须在 DomainC 中具有两个不同的 DomainA 属性才能映射它。

文档中的机场和航班示例:

class Airport {
    static hasMany = [outboundFlights: Flight, inboundFlights: Flight]
    static mappedBy = [outboundFlights: "departureAirport",
                   inboundFlights: "destinationAirport"]
}
class Flight {
   Airport departureAirport
   Airport destinationAirport
}

航班需要到 Airport 属性,以便能够区分哪个正在映射正确的 Airport 中的 hasMany 集合。

编辑:以赛车手为例

Grails 支持多对多关系,但其中一个端点必须是主端点,而另一个端点必须另外有一个 belongsTo。虽然情况并非如此,因为比赛既不属于车手,也不属于车手。 我会使用与属性的关系:“驱动器”与属性“mainDriver”。 那不能直接映射,你需要为关系使用域:

class Race {
    static hasMany = [ participants: DriverRace ]

    def mainDrivers() {
        getDrivers( false )
    }

    def substitutes() {
        getDrivers( false )
    }

    private getDrivers( mainDriver ) {
        DriverRace.withCriteria {
            eq( "race", this )
            eq( "mainDriver", mainDriver )
        }.collect { it.driver }
    }
}

class Driver {
    static hasMany = [ races: DriverRace ]
}

class DriverRace {
    static belongsTo = [ race: Race, driver: Driver ]

    boolean mainDriver

}

【讨论】:

    【解决方案2】:

    我们认为可以通过在(左侧)域 m 的映射属性中插入对域/表 n 的第二个引用来解决问题。然后 grails 似乎在关系的右侧对 n 进行了第二次引用。但结果证明这是一个充满希望的周末梦想。

    【讨论】:

    • 检查我更新的答案。顺便说一句,我认为你应该编辑你的问题而不是回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多