From c896a65251da610ac9f42e0cb7aa1fd5435c7907 Mon Sep 17 00:00:00 2001 From: jameskleeh Date: Tue, 13 Jul 2021 13:49:17 -0400 Subject: [PATCH] Stop always cascading associations for inserts. Fixes #205 --- .../engine/MongoCodecEntityPersister.groovy | 2 +- .../mongodb/cascade/MongoCascadeSpec.groovy | 50 +++++++++++++++++++ .../grails/mongodb/cascade/Product.groovy | 15 ++++++ .../grails/mongodb/cascade/ProductLine.groovy | 10 ++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/MongoCascadeSpec.groovy create mode 100644 grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/Product.groovy create mode 100644 grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/ProductLine.groovy diff --git a/grails-datastore-gorm-mongodb/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoCodecEntityPersister.groovy b/grails-datastore-gorm-mongodb/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoCodecEntityPersister.groovy index 86bdbd51..64123547 100644 --- a/grails-datastore-gorm-mongodb/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoCodecEntityPersister.groovy +++ b/grails-datastore-gorm-mongodb/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoCodecEntityPersister.groovy @@ -313,7 +313,7 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { if (proxyFactory.isInitialized(value)) { def dirtyCheckable = (DirtyCheckable) value if (dirtyCheckable.hasChanged()) { - if (!isUpdate || association.isOwningSide() || association.doesCascade(CascadeType.PERSIST)) { + if (association.isOwningSide() || association.doesCascade(CascadeType.PERSIST)) { mongoCodecSession.persist(value) } } diff --git a/grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/MongoCascadeSpec.groovy b/grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/MongoCascadeSpec.groovy new file mode 100644 index 00000000..4f82ac4f --- /dev/null +++ b/grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/MongoCascadeSpec.groovy @@ -0,0 +1,50 @@ +package grails.mongodb.cascade + +import grails.gorm.tests.GormDatastoreSpec + +class MongoCascadeSpec extends GormDatastoreSpec { + + @Override + List getDomainClasses() { + [Product, ProductLine] + } + + void "test association is not cascaded on update or insert"() { + given: + ProductLine x = new ProductLine(name: "x") + x.save() + session.flush() + session.clear() + + Product product = new Product(name: "my product", productLine: ProductLine.load(x.id)) + product.save() + session.flush() + session.clear() + + when: + product = Product.get(product.id) + + then: + product.productLine.name == "x" + + when: //no cascading on update + product.productLine.name = "xy" + product.save() + session.flush() + session.clear() + x = ProductLine.get(x.id) + + then: + x.name == "x" + + when: + x.name = "xy" + product = new Product(name: "other product", productLine: x) + product.save() + session.flush() + session.clear() + + then: + ProductLine.get(x.id).name == "x" + } +} diff --git a/grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/Product.groovy b/grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/Product.groovy new file mode 100644 index 00000000..3e4ffced --- /dev/null +++ b/grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/Product.groovy @@ -0,0 +1,15 @@ +package grails.mongodb.cascade + +import grails.persistence.Entity + + +@Entity +class Product { + + String name + ProductLine productLine + + static mapping = { + productLine(cascade: "none") + } +} diff --git a/grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/ProductLine.groovy b/grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/ProductLine.groovy new file mode 100644 index 00000000..ce3f8d28 --- /dev/null +++ b/grails-datastore-gorm-mongodb/src/test/groovy/grails/mongodb/cascade/ProductLine.groovy @@ -0,0 +1,10 @@ +package grails.mongodb.cascade + +import grails.persistence.Entity + +@Entity +class ProductLine { + + String name + +}