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

标签 grails gorm

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

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/

相关文章:

grails - GORM按属性获取域对象列表

grails - GORM组合保存错误,找不到与以下对象匹配的构造函数:java.lang.String(java.lang.Long)

hibernate - Hibernate/GORM-处理多 session 域对象更新

grails - 如何通过其他grails应用程序重用grails应用程序(代码和数据)?

date - 日期字段无法正常工作

grails - 在Netbeans 10.0中不会激活Grails 3.x

grails - 在客户端或服务器端拦截 Grails GSP 操作

grails - 在Grails中为同一域类创建一对多和多对多

grails - 如何处理ajax请求中的grails异常?

oracle - ORA-00972 : identifier is too long - Best strategy to avoid it in Grails