我有两个域类,我希望彼此之间具有单向关系:
class User {
HistoryEntry lastFooEntry
static constraints = {
lastFooEntry(nullable: true)
}
}
class HistoryEntry {
String name
User createdBy
}
根据grails documentation(据我了解),这是做到这一点的方法。指定
belongsTo
将创建双向关系(我不想要),而hasOne
无论如何都只能与双向关系一起使用。上述建模的问题在于,以下代码仅在
entryName=='foo'
时有效。对于任何其他值,断言为false: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
结合使用,而我从未见过带有空字符串的情况。那么问题来了:什么是正确的方法?还是它是一个未记录的功能/错误,到目前为止我的解决方法还不错?
最佳答案
如果您没有在关系的另一端指定字段,则关系将在JVM方面保持单向-即您的示例足够了,您仅需使用。 hasOne
中的User
或belongsTo
中的/和HistoryEntry
也将起作用。
该示例可能丢失了一些内容,因为断言不能为假:entry
是刚刚创建的,并且从未分配给任何东西,因此该User
或任何其他对象都无法引用它。此外,entry
尚未保存或刷新。
关系数据库中的1:1关系是1方向还是2方向更是一个解释问题:通常,您仅在一端具有外键,但也可以计算另一种方式。
因此,不必担心,除非您明确声明该字段,否则Grails绝不会在关系的另一端自动添加引用字段。
关于grails - 如何正确映射两个域之间的两个单向关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12772345/