我有两个域类,我想要从每个域到另一个单向关系:
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
一起使用,我从来没有用空字符串看到它。
所以问题:这样做的正确方法是什么?或者它是一个没有记录的功能/错误,到目前为止我的解决方法还不错?
答案 0 :(得分:1)
如果你没有在关系的另一端指定一个字段,那么关系在JVM方面将保持单向 - 即你的例子是足够的,你不需要更多。 hasOne
中的User
或belongsTo
中的HistoryEntry
也会有效。
该示例可能缺少某些内容,因为断言不能为假:entry
刚刚创建,并且从未分配给任何内容,因此User
或任何其他对象无法引用它。此外,entry
尚未保存或刷新。
关系数据库中的1:1关系是单向还是双向是更多的解释问题:通常你只在一端有外键,但另一种方式也可以计算。
所以不用担心,Grails永远不会在关系的另一端自动添加引用字段,除非您明确声明该字段。