diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index f0a5d6a9f..807fbf16b 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -152,6 +152,11 @@ public class BeanDescriptor implements BeanType, STreeType { */ private final IdType idType; + /** + * Set when Id property is marked with GeneratedValue annotation. + */ + private final boolean idGeneratedValue; + private final boolean idTypePlatformDefault; private final PlatformIdGenerator idGenerator; @@ -450,6 +455,7 @@ public class BeanDescriptor implements BeanType, STreeType { this.defaultSelectClause = deploy.getDefaultSelectClause(); this.idType = deploy.getIdType(); + this.idGeneratedValue = deploy.isIdGeneratedValue(); this.idTypePlatformDefault = deploy.isIdTypePlatformDefault(); this.idGenerator = deploy.getIdGenerator(); this.sequenceName = deploy.getSequenceName(); @@ -1935,7 +1941,7 @@ public class BeanDescriptor implements BeanType, STreeType { // probably have to load the entire bean .setId(id).findOne(); } - + /** * Create a reference bean based on the id. */ @@ -2999,6 +3005,13 @@ public class BeanDescriptor implements BeanType, STreeType { return idType; } + /** + * Return true if the Id value is marked as a @GeneratedValue. + */ + public boolean isIdGeneratedValue() { + return idGeneratedValue; + } + /** * Return true if the identity is the platform default (not explicitly set). */ diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java index 22dcf6ad5..a82974fa4 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java @@ -1369,7 +1369,7 @@ public class BeanDescriptorManager implements BeanDescriptorMap { desc.setIdType(IdType.EXTERNAL); return; } - if (desc.isIdGeneratorAuto() || serverConfig.isIdGeneratorAutomatic()) { + if (desc.isIdGeneratedValue() || serverConfig.isIdGeneratorAutomatic()) { // use IDENTITY or SEQUENCE based on platform desc.setIdType(dbIdentity.getIdType()); desc.setIdTypePlatformDefault(); diff --git a/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java index 98d878a56..199b7a90b 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java @@ -109,7 +109,7 @@ public class DeployBeanDescriptor { /** * Set true when explicit auto generated Id. */ - private boolean idGeneratorAuto; + private boolean idGeneratedValue; /** * The database sequence name (optional). @@ -856,15 +856,15 @@ public class DeployBeanDescriptor { /** * Return true for automatic Id generation strategy. */ - public boolean isIdGeneratorAuto() { - return idGeneratorAuto; + public boolean isIdGeneratedValue() { + return idGeneratedValue; } /** * Set when GeneratedValue explicitly mapped on Id property. */ - public void setGeneratedAuto() { - this.idGeneratorAuto = true; + public void setIdGeneratedValue() { + this.idGeneratedValue = true; } /** diff --git a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java index c1e3ca89b..4b1b28b69 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java @@ -322,7 +322,7 @@ public class AnnotationFields extends AnnotationParser { prop.setDbLength(length.value()); } - io.ebean.annotation.NotNull nonNull = get(prop, io.ebean.annotation.NotNull.class); + io.ebean.annotation.NotNull nonNull = get(prop, io.ebean.annotation.NotNull.class); if (nonNull != null) { prop.setNullable(false); } @@ -389,7 +389,7 @@ public class AnnotationFields extends AnnotationParser { Set dbMigration = getAll(prop, DbMigration.class); dbMigration.forEach(ann -> prop.addDbMigrationInfo( - new DbMigrationInfo(ann.preAdd(), ann.postAdd(), ann.preAlter(), ann.postAlter(), ann.platforms()))); + new DbMigrationInfo(ann.preAdd(), ann.postAdd(), ann.preAlter(), ann.postAlter(), ann.platforms()))); } private void addIndex(DeployBeanProperty prop, Index index) { @@ -515,6 +515,7 @@ public class AnnotationFields extends AnnotationParser { private void readGenValue(GeneratedValue gen, DeployBeanProperty prop) { + descriptor.setIdGeneratedValue(); String genName = gen.generator(); SequenceGenerator sequenceGenerator = find(prop, SequenceGenerator.class); @@ -547,8 +548,6 @@ public class AnnotationFields extends AnnotationParser { descriptor.setCustomIdGenerator(idGenerator); } else if (prop.getPropertyType().equals(UUID.class)) { descriptor.setUuidGenerator(); - } else { - descriptor.setGeneratedAuto(); } } } diff --git a/src/main/java/io/ebeaninternal/server/persist/MergeHandler.java b/src/main/java/io/ebeaninternal/server/persist/MergeHandler.java index c82febba7..ddd34e527 100644 --- a/src/main/java/io/ebeaninternal/server/persist/MergeHandler.java +++ b/src/main/java/io/ebeaninternal/server/persist/MergeHandler.java @@ -51,7 +51,7 @@ class MergeHandler { List merge() { Set paths = options.paths(); - if (paths.isEmpty() && !options.isClientGeneratedIds()) { + if (desc.isIdGeneratedValue() && paths.isEmpty() && !options.isClientGeneratedIds()) { // just do a single insert or update based on Id value present Object id = desc.getId(bean); if (id != null) { diff --git a/src/test/java/io/ebeaninternal/server/deploy/BeanDescriptorTest.java b/src/test/java/io/ebeaninternal/server/deploy/BeanDescriptorTest.java index daf8c7544..d4cbcbfbf 100644 --- a/src/test/java/io/ebeaninternal/server/deploy/BeanDescriptorTest.java +++ b/src/test/java/io/ebeaninternal/server/deploy/BeanDescriptorTest.java @@ -8,9 +8,13 @@ import org.junit.Test; import org.tests.model.basic.Animal; import org.tests.model.basic.AnimalShelter; import org.tests.model.basic.Cat; +import org.tests.model.basic.Contact; +import org.tests.model.basic.Country; import org.tests.model.basic.Customer; import org.tests.model.basic.Dog; import org.tests.model.basic.Order; +import org.tests.model.bridge.BSite; +import org.tests.model.bridge.BUser; import java.util.Collection; @@ -18,7 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat; public class BeanDescriptorTest extends BaseTestCase { - BeanDescriptor customerDesc = spiEbeanServer().getBeanDescriptor(Customer.class); + private BeanDescriptor customerDesc = spiEbeanServer().getBeanDescriptor(Customer.class); @Test public void createReference() { @@ -51,7 +55,7 @@ public class BeanDescriptorTest extends BaseTestCase { Customer bean = customerDesc.createReference(Boolean.FALSE, true, 42, null); assertThat(server().getBeanState(bean).isDisableLazyLoad()).isTrue(); } - + @Test public void createReference_with_inheritance() { Cat cat = new Cat(); @@ -98,4 +102,37 @@ public class BeanDescriptorTest extends BaseTestCase { assertThat(to.getName()).isEqualTo("rob"); } + @Test + public void isIdTypeExternal_when_externalId() { + + BeanDescriptor countryDesc = spiEbeanServer().getBeanDescriptor(Country.class); + assertThat(countryDesc.isIdGeneratedValue()).isFalse(); + } + + @Test + public void isIdTypeExternal_when_platformGenerator_noGeneratedValueAnnotation() { + + assertThat(customerDesc.isIdGeneratedValue()).isFalse(); + } + + @Test + public void isIdTypeExternal_when_explicitGeneratedValue() { + + BeanDescriptor desc = spiEbeanServer().getBeanDescriptor(Contact.class); + assertThat(desc.isIdGeneratedValue()).isTrue(); + } + + @Test + public void isIdTypeExternal_when_uuidGenerator_and_generatedValue() { + + BeanDescriptor desc = spiEbeanServer().getBeanDescriptor(BSite.class); + assertThat(desc.isIdGeneratedValue()).isTrue(); + } + + @Test + public void isIdTypeExternal_when_uuidGenerator_and_noGeneratedValue() { + + BeanDescriptor desc = spiEbeanServer().getBeanDescriptor(BUser.class); + assertThat(desc.isIdGeneratedValue()).isFalse(); + } } diff --git a/src/test/java/org/tests/merge/MBase.java b/src/test/java/org/tests/merge/MBase.java index 0172e9893..c0daf222e 100644 --- a/src/test/java/org/tests/merge/MBase.java +++ b/src/test/java/org/tests/merge/MBase.java @@ -1,5 +1,6 @@ package org.tests.merge; +import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.MappedSuperclass; import javax.persistence.Version; @@ -8,7 +9,7 @@ import java.util.UUID; @MappedSuperclass public class MBase { - @Id + @Id @GeneratedValue private UUID id; @Version diff --git a/src/test/java/org/tests/model/basic/Contact.java b/src/test/java/org/tests/model/basic/Contact.java index 402a4fc2a..be3c82f97 100644 --- a/src/test/java/org/tests/model/basic/Contact.java +++ b/src/test/java/org/tests/model/basic/Contact.java @@ -9,6 +9,7 @@ import io.ebean.annotation.Index; import javax.persistence.CascadeType; import javax.persistence.Entity; +import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; @@ -25,7 +26,7 @@ import java.util.List; @Cache(naturalKey = "email") public class Contact { - @Id + @Id @GeneratedValue int id; @Size(max=127) diff --git a/src/test/java/org/tests/model/bridge/BSite.java b/src/test/java/org/tests/model/bridge/BSite.java index 9e61f255b..2023a8c4b 100644 --- a/src/test/java/org/tests/model/bridge/BSite.java +++ b/src/test/java/org/tests/model/bridge/BSite.java @@ -1,13 +1,14 @@ package org.tests.model.bridge; import javax.persistence.Entity; +import javax.persistence.GeneratedValue; import javax.persistence.Id; import java.util.UUID; @Entity public class BSite { - @Id + @Id @GeneratedValue UUID id; String name;