【问题标题】:Gorm: object mappingGorm:对象映射
【发布时间】:2019-07-09 02:04:48
【问题描述】:

我有两个对象,一个 CarOffer 和一个 Car。 CarOffer 由各种属性组成,其中一个属性引用 Car。换句话说,我可以有多个 CarOffer,多个 Cars,但每个 CarOffer 只有一辆车。一辆车可以出现在多个 CarOffers 中。删除 CarOffer 不应删除它引用的汽车,并且除非所有引用它的 CarOffer 也已被删除,否则删除 Car 是不可能的。

通常,我只会向 CarOffer 添加一个 carId 属性,但从 gorm 文档中我觉得我应该使用 Gorm 的强大功能将 Car Object 添加到 CarOffer,而不仅仅是它的 id。

但是我有点迷茫,我觉得“belongsTo”和“hasOne”都没有真正映射到我想要的东西。

此外,我将如何创建新的 CarOffer? 我希望能够做到

new CarOffer(carId: 123).save()

但我觉得我必须这样做:

new CarOffer(car: Car.get(123)).save()

这不会产生一个额外的请求吗?

【问题讨论】:

    标签: grails groovy grails-orm


    【解决方案1】:

    我觉得“belongsTo”和“hasOne”都不是我想要的。

    您不想要belongsTo,因为这会导致级联删除,而您说您不希望这样做(“删除 CarOffer 不应删除它引用的汽车”)。

    您是否可以使用hasOne,这将影响哪个表中有外键。

    如果你不想使用carId 方法,你可以这样做:

    class CarOffer {
        String attribute1
        int attribute 2
        // etc...
    
        Car car
    }
    
    class Car {
        String attribute1
        // etc...
    
        // There could be, but does not need to be
        // any mention of CarOffer in this class
    }
    

    ...我将如何创建新的 CarOffer?

    这取决于您未提及的应用中的详细信息,但您可以执行此类操作...

    Car c = // ...
    CarOffer co = new CarOffer(attribute1: 'something', attribute2: 2112, car: c)
    

    【讨论】:

    • 感谢您的回答。我有 3 个问题: 1. 我并不是说我不想使用 carId 方法,只是我觉得 gorm 应该为我处理它。是这样吗,还是我应该使用 carId 方法? 2. 我不明白 hasOne 是如何工作的:如果 hasOne 在表 Car 中放置了一个 foreignKey,并且它引用了一个 CarOffer,这意味着只有一个 CarOffer 可以引用给定的 Car,事实并非如此(oneToMany,not oneToOne )。
    • 3.当我创建 CarOffer 时,通常已经在 DB 中创建了汽车。因此我的问题是,您的代码是否创建了 2 个请求(获取 Car,然后创建 CarOffer)?是否有可能使用您提到的方法通过仅引用其 ID 来创建 CarOffer,因为它最终只是数据库中的一个 ID?像 CarOffer co = new CarOffer(att1: 'att1', car: new Car(id: '123')) 之类的东西,即使 ID 为 123 的汽车已经存在?
    • "...只是我觉得 gorm 应该为我处理它" - 可以,但不需要。您似乎在要求carId 方法的替代方法,我描述了一种方法。 “......这意味着只有一个 CarOffer 可以引用给定的汽车”。如果您要使用hasOne,则不是一辆车有一个报价,而是报价只有一辆车。 “您的代码是否创建 2 个请求” - 是的。
    • 那么 new CarOffer(car:new Car(id:123)).如果 id 为 123 的汽车已经存在,这可能吗?最终,对于那个用例,您会建议将整个 Car 存储在 CarOffer 中,并依靠 gorm 还是仅使用 carId ?谢谢
    • 我认为new CarOffer(car:new Car(id:123)) 没有意义。那是创建一个新的Car,id 为 123,这似乎不是你想要的。那不是查询数据库来检索现有的Car
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2011-03-09
    相关资源
    最近更新 更多