0

我在实体之间有一对多的关系 - RentalUnit 和 Review 。所有测试都运行良好,除非我向不同的 RentalUnit 实例添加相同的评论,如下所示:

def review3 = Review.build().save(flush: true)
def rentalUnit2 = RentalUnit.build().
    addToReviews(review2).addToReviews(review3).save(flush: true)
assert rentalUnit.reviews.contains(review2)

似乎 GORM 和该addTo*方法似乎并不关心我是否添加了相同的 Review 实例,所以我猜我的域类中缺少一些东西。那会是什么?

谢谢你的帮忙

ps

class Review {
    String submittedBy
    String content
    String dateReceived
    boolean isApproved

    static belongsTo = RentalUnit

    static mapping = {
        content type: 'text'
    }

    static constraints = {
        submittedBy blank: false, size: 3..50
        content blank: false, size: 5..2500

    }
}

class RentalUnit {
    String name
    String nickname
    Address address
    static hasMany = [reviews:Review]

    static mapping = {
        reviews cascade: "all-delete-orphan"
    }

    static constraints = {
        name blank: false, unique: true, size: 4..10
        nickname blank: false, size: 5..60
    }
}
4

1 回答 1

1

是的,它不在乎——它不会改变任何其他对象的属性。即使是关系的另一端—— review2.rentalUnit(如果存在这样的字段)在这里也将为空。

下次从数据库加载对象时,评论将消失rentalUnit.reviews(或将被分配)。review2.rentalUnit

不过,您可以review2.rentalUnit手动分配并验证它是否已添加到另一个RentalUnit中 - 分配不会造成任何伤害。

编辑:让我们逐步浏览代码。

rentalUnit1.addToReviews(review2)

这里review2添加到rentalUnit1.reviews. review2.rentalUnit未分配,但在数据库中保存后它将指向rentalUnit1. 字段的唯一持久表示RentalUnit.reviews是子到父引用字段,Review.rentalUnit.

def rentalUnit2 = ...
rentalUnit2.addToReviews(review2).addToReviews(review3).save(flush: true)

这里review2添加到rentalUnit2.reviews. review2.rentalUnit没有再次分配。review2不会从rentalUnit1.reviews但是,保存后,在数据库中,它将指向rentalUnit2.

assert rentalUnit1.reviews.contains(review2)

review2未从 中删除rentalUnit1.reviews,因此断言将通过。但是在下一个会话中rentalUnit1rentalUnit2将拥有正确的reviews 集-仅rentalUnit2将拥有review2.

现在,如果您想始终保持 Java 表示的一致性,请实现如下方法:

class RentalUnit {
    RentalUnit addToReviewsAndCheck(Review r) {
         if (r.rentalUnit == this) return;
         if (r.rentalUnit != null) {
             r.rentalUnit.removeFromReviews(r)
         }
         r.rentalUnit = this
         addToReviews(r)
    }
}

但对我来说,这太过分了。

于 2012-10-15T08:48:40.930 回答