gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:35:04 25 4
gpt4 key购买 nike

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

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中的UserbelongsTo中的/和HistoryEntry也将起作用。

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

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

因此,不必担心,除非您明确声明该字段,否则Grails绝不会在关系的另一端自动添加引用字段。

关于grails - 如何正确映射两个域之间的两个单向关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12772345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com