From bca787b54dd1e64e8c347ec8bd73146c213ae167 Mon Sep 17 00:00:00 2001 From: rbygrave <=> Date: Tue, 2 Oct 2012 14:59:27 +1300 Subject: [PATCH] Fixes to only allow m2m intersection save from one direction based on beanName. Supports BUG 429 : Pull Request: jroper - Fixing ManyToMany association saving bug --- .../ebeaninternal/api/SpiTransaction.java | 5 ++++ .../server/persist/DefaultPersister.java | 13 ++++++++-- .../server/transaction/JdbcTransaction.java | 25 +++++++++++++++++++ .../avaje/tests/model/basic/Attribute.java | 1 - 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java b/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java index 372789244..6b8b8bed4 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiTransaction.java @@ -181,4 +181,9 @@ public interface SpiTransaction extends Transaction { *
*/ public Connection getInternalConnection(); + + /** + * Return true if the manyToMany intersection should be persisted for this particular relationship direction. + */ + public boolean isSaveAssocManyIntersection(String intersectionTable, String beanName); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java index fac5471bf..e9b849c16 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java @@ -719,6 +719,10 @@ public final class DefaultPersister implements Persister { this.deleteMissingChildren = false; this.updateNullProperties = false; } + + public boolean isSaveIntersection() { + return t.isSaveAssocManyIntersection(many.getIntersectionTableJoin().getTable(), many.getBeanDescriptor().getName()); + } private Object getValue() { return many.getValue(parentBean); @@ -764,14 +768,19 @@ public final class DefaultPersister implements Persister { private void saveMany(SaveManyPropRequest saveMany) { if (saveMany.getMany().isManyToMany()) { - // save the beans that are in the manyToMany + + // check if we can save the m2m intersection in this direction + boolean saveIntersectionFromThisDirection = saveMany.isSaveIntersection(); if (saveMany.isCascade()) { // Need explicit Cascade to save the beans on other side saveAssocManyDetails(saveMany, false, saveMany.isUpdateNullProperties()); } // for ManyToMany save the 'relationship' via inserts/deletes // into/from the intersection table - saveAssocManyIntersection(saveMany, saveMany.isDeleteMissingChildren()); + if (saveIntersectionFromThisDirection) { + // only allowed on one direction of a m2m based on beanName + saveAssocManyIntersection(saveMany, saveMany.isDeleteMissingChildren()); + } } else { if (saveMany.isCascade()) { saveAssocManyDetails(saveMany, saveMany.isDeleteMissingChildren(), saveMany.isUpdateNullProperties()); diff --git a/src/main/java/com/avaje/ebeaninternal/server/transaction/JdbcTransaction.java b/src/main/java/com/avaje/ebeaninternal/server/transaction/JdbcTransaction.java index 20aa94dec..8812841dd 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/transaction/JdbcTransaction.java +++ b/src/main/java/com/avaje/ebeaninternal/server/transaction/JdbcTransaction.java @@ -117,6 +117,7 @@ public class JdbcTransaction implements SpiTransaction { HashSet