From 4cfab3a2de02431faf67efc89cb668d080c32bee Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 11 Oct 2019 20:50:47 +1300 Subject: [PATCH] #1842 - Refactor persisting to delay the setting of generated Id value (sequences and deferred imported ids) --- .../server/core/PersistRequestBean.java | 5 +++ .../server/deploy/BeanDescriptor.java | 12 +++++++ .../server/persist/DefaultPersister.java | 31 ------------------- 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java b/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java index 45fcc1376..320dc1816 100644 --- a/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java +++ b/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java @@ -1262,6 +1262,7 @@ public final class PersistRequestBean extends PersistRequest implements BeanP } private void executeInsert() { + setGeneratedId(); setTenantId(); if (controller == null || controller.preInsert(this)) { beanManager.getBeanPersister().insert(this); @@ -1469,4 +1470,8 @@ public final class PersistRequestBean extends PersistRequest implements BeanP public void setSaveRecurse() { saveRecurse = true; } + + public void setGeneratedId() { + beanDescriptor.setGeneratedId(entityBean, transaction); + } } diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 8cda5f3aa..e2edf7c70 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -3107,6 +3107,18 @@ public class BeanDescriptor implements BeanType, STreeType { return idType; } + /** + * Set the generated Id value if appropriate. + */ + public void setGeneratedId(EntityBean entityBean, Transaction transaction) { + if (idGenerator == null || idProperty == null || idProperty.isEmbedded()) { + return; + } + if (isNullOrZero(idProperty.getValue(entityBean))) { + convertSetId(nextId(transaction), entityBean); + } + } + /** * Return true if the Id value is marked as a @GeneratedValue. */ diff --git a/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java b/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java index fac78d52e..9d893c9fe 100644 --- a/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java +++ b/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java @@ -506,11 +506,7 @@ public final class DefaultPersister implements Persister { // save associated One beans recursively first saveAssocOne(request); } - - // set the IDGenerated value if required - setIdGenValue(request); request.executeOrQueue(); - if (request.isPersistCascade()) { // save any associated List held beans saveAssocMany(request); @@ -1197,33 +1193,6 @@ public final class DefaultPersister implements Persister { } } - /** - * Set Id Generated value for insert. - */ - private void setIdGenValue(PersistRequestBean request) { - - BeanDescriptor desc = request.getBeanDescriptor(); - if (!desc.isUseIdGenerator()) { - return; - } - - BeanProperty idProp = desc.getIdProperty(); - if (idProp == null || idProp.isEmbedded()) { - // not supporting IdGeneration for concatenated or Embedded - return; - } - - EntityBean bean = request.getEntityBean(); - Object uid = idProp.getValue(bean); - - if (isNullOrZero(uid)) { - // generate the nextId and set it to the property - Object nextId = desc.nextId(request.getTransaction()); - // cast the data type if required and set it - desc.convertSetId(nextId, bean); - } - } - /** * Create the Persist Request Object that wraps all the objects used to * perform an insert, update or delete.