如何正确映射两个域之间的两个单向关系?

时间:2012-10-07 19:56:37

标签: grails gorm

我有两个域类,我想要从每个域到另一个单向关系:

class User {
    HistoryEntry lastFooEntry

    static constraints = {
        lastFooEntry(nullable: true)
    }
}
class HistoryEntry {
    String name
    User createdBy
}

根据grails documentation(据我所知),这是做到这一点的方法。指定belongsTo将创建双向关系(我不想要的),hasOne仅适用于双向关系。

上述建模的问题是,以下代码仅在entryName=='foo'时有效。对于任何其他值,断言是错误的:

def addHistoryEntry(Long id, String entryName) {
    def user = User.get(id)
    if(!user) {
        user = new User(id: id).save()
    }
    def entry = new HistoryEntry(createdBy: user, name: entryName).save()
    if(entryName=='foo') {
        user.lastFooEntry = entry
        user.save()
    } else {
        assert user.lastFooEntry!=entry
    }
}

我可以通过指定

来解决这个问题
static mappedBy = [createdBy:'']
HistoryEntry中的

。但是根据IntelliJ IDEA和grails documentation,这应该只与hasMany一起使用,我从来没有用字符串看到它。

所以问题:这样做的正确方法是什么?或者它是一个没有记录的功能/错误,到目前为止我的解决方法还不错?

1 个答案:

答案 0 :(得分:1)

如果你没有在关系的另一端指定一个字段,那么关系在JVM方面将保持单向 - 即你的例子是足够的,你不需要更多。 hasOne中的UserbelongsTo中的HistoryEntry也会有效。

该示例可能缺少某些内容,因为断言不能为假:entry刚刚创建,并且从未分配给任何内容,因此User或任何其他对象无法引用它。此外,entry尚未保存或刷新。

关系数据库中的1:1关系是单向还是双向是更多的解释问题:通常你只在一端有外键,但另一种方式也可以计算。

所以不用担心,Grails永远不会在关系的另一端自动添加引用字段,除非您明确声明该字段。