0

我有两个域类,我希望彼此之间存在单向关系:

class User {
    HistoryEntry lastFooEntry

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

根据grails 文档(据我所知),这是这样做的方法。指定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 文档,这只能与空字符串结合使用,hasMany而且我从未见过它带有字符串。

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

4

1 回答 1

1

如果您没有在关系的另一端指定字段,则关系在 JVM 方面将保持单向 - 即您的示例已经足够,您不需要更多。hasOneinUser或/和belongsToinHistoryEntry也可以。

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

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

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

于 2012-10-14T19:29:59.893 回答