From c12ea28ea92a5994d11ba9cc118ae89e5b876385 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Thu, 12 Sep 2019 22:02:22 +1200 Subject: [PATCH] #1818 - Cannot auto-generate UUID --- .../GeneratedPropertyFactory.java | 6 +++ .../UuidGeneratedProperty.java | 40 ++++++++++++++++ .../server/deploy/parse/AnnotationFields.java | 14 ++++-- .../java/org/tests/insert/EIdUidBean.java | 46 +++++++++++++++++++ .../tests/insert/TestInsertWithIdAndUuid.java | 25 ++++++++++ 5 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UuidGeneratedProperty.java create mode 100644 src/test/java/org/tests/insert/EIdUidBean.java create mode 100644 src/test/java/org/tests/insert/TestInsertWithIdAndUuid.java diff --git a/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedPropertyFactory.java b/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedPropertyFactory.java index e9b7dac90..ffd88655e 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedPropertyFactory.java +++ b/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/GeneratedPropertyFactory.java @@ -27,6 +27,8 @@ public class GeneratedPropertyFactory { private final HashSet numberTypes = new HashSet<>(); + private final UuidGeneratedProperty generatedUuid = new UuidGeneratedProperty(); + private final GeneratedWhoModified generatedWhoModified; private final GeneratedWhoCreated generatedWhoCreated; @@ -123,6 +125,10 @@ public class GeneratedPropertyFactory { return idGeneratorMap.get(generatorName); } + public void setUuid(DeployBeanProperty prop) { + prop.setGeneratedProperty(generatedUuid); + } + /** * Wraps the custom IdGenerator to implement PlatformIdGenerator. */ diff --git a/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UuidGeneratedProperty.java b/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UuidGeneratedProperty.java new file mode 100644 index 000000000..2090fac13 --- /dev/null +++ b/src/main/java/io/ebeaninternal/server/deploy/generatedproperty/UuidGeneratedProperty.java @@ -0,0 +1,40 @@ +package io.ebeaninternal.server.deploy.generatedproperty; + +import io.ebean.bean.EntityBean; +import io.ebeaninternal.server.deploy.BeanProperty; + +import java.util.UUID; + +public class UuidGeneratedProperty implements GeneratedProperty { + + @Override + public Object getInsertValue(BeanProperty prop, EntityBean bean, long now) { + return UUID.randomUUID(); + } + + @Override + public Object getUpdateValue(BeanProperty prop, EntityBean bean, long now) { + return null; + } + + @Override + public boolean includeInInsert() { + return true; + } + + @Override + public boolean isDDLNotNullable() { + return true; + } + + @Override + public boolean includeInUpdate() { + return false; + } + + @Override + public boolean includeInAllUpdates() { + return false; + } + +} 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 36783a15f..023899247 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationFields.java @@ -202,12 +202,11 @@ public class AnnotationFields extends AnnotationParser { prop.setDbColumn(dbColumn); } + Id id = get(prop, Id.class); GeneratedValue gen = get(prop, GeneratedValue.class); if (gen != null) { - readGenValue(gen, prop); + readGenValue(gen, id, prop); } - - Id id = get(prop, Id.class); if (id != null) { readIdScalar(prop); } @@ -519,8 +518,13 @@ public class AnnotationFields extends AnnotationParser { return util.createDataEncryptSupport(table, column); } - private void readGenValue(GeneratedValue gen, DeployBeanProperty prop) { - + private void readGenValue(GeneratedValue gen, Id id, DeployBeanProperty prop) { + if (id == null) { + if (UUID.class.equals(prop.getPropertyType())) { + generatedPropFactory.setUuid(prop); + return; + } + } descriptor.setIdGeneratedValue(); String genName = gen.generator(); diff --git a/src/test/java/org/tests/insert/EIdUidBean.java b/src/test/java/org/tests/insert/EIdUidBean.java new file mode 100644 index 000000000..59bf6a04a --- /dev/null +++ b/src/test/java/org/tests/insert/EIdUidBean.java @@ -0,0 +1,46 @@ +package org.tests.insert; + +import io.ebean.Model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import java.util.UUID; + +@Entity +public class EIdUidBean extends Model { + + @Id + private long id; + + @GeneratedValue + @Column(unique = true) + private UUID uuid; + + String name; + + public EIdUidBean(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public UUID getUuid() { + return uuid; + } + + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } +} diff --git a/src/test/java/org/tests/insert/TestInsertWithIdAndUuid.java b/src/test/java/org/tests/insert/TestInsertWithIdAndUuid.java new file mode 100644 index 000000000..d2777fc3b --- /dev/null +++ b/src/test/java/org/tests/insert/TestInsertWithIdAndUuid.java @@ -0,0 +1,25 @@ +package org.tests.insert; + +import io.ebean.BaseTestCase; +import io.ebean.DB; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestInsertWithIdAndUuid extends BaseTestCase { + + @Test + public void insert() { + + EIdUidBean bean = new EIdUidBean("one"); + bean.save(); + + assertThat(bean.getId()).isGreaterThan(0); + assertThat(bean.getUuid()).isNotNull(); + + final EIdUidBean found = DB.find(EIdUidBean.class, bean.getId()); + + assertThat(bean.getId()).isEqualTo(found.getId()); + assertThat(bean.getUuid()).isEqualTo(found.getUuid()); + } +}