diff --git a/src/main/java/com/avaje/ebean/EbeanServer.java b/src/main/java/com/avaje/ebean/EbeanServer.java index bce142ffb..047568a3e 100644 --- a/src/main/java/com/avaje/ebean/EbeanServer.java +++ b/src/main/java/com/avaje/ebean/EbeanServer.java @@ -146,6 +146,17 @@ public interface EbeanServer { */ Object getBeanId(Object bean); + /** + * Set the Id value onto the bean converting the type of the id value if necessary. + *

+ * For example, if the id value passed in is a String but ought to be a Long or UUID etc + * then it will automatically be converted. + *

+ * @param bean The entity bean to set the id value on. + * @param id The id value to set. + */ + Object setBeanId(Object bean, Object id); + /** * Return a map of the differences between two objects of the same type. *

diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index c9ef5f557..eea93d587 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -1957,14 +1957,23 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return typeInfo != null && getBeanDescriptor(typeInfo.getBeanType()) != null; } + @Override + public Object setBeanId(Object bean, Object id) { + EntityBean eb = checkEntityBean(bean); + BeanDescriptor desc = getBeanDescriptor(bean.getClass()); + if (desc == null) { + throw new PersistenceException(bean.getClass().getName() + " is NOT an Entity Bean registered with this server?"); + } + return desc.convertSetId(id, eb); + } + + @Override public Object getBeanId(Object bean) { EntityBean eb = checkEntityBean(bean); BeanDescriptor desc = getBeanDescriptor(bean.getClass()); if (desc == null) { - String m = bean.getClass().getName() + " is NOT an Entity Bean registered with this server?"; - throw new PersistenceException(m); + throw new PersistenceException(bean.getClass().getName() + " is NOT an Entity Bean registered with this server?"); } - return desc.getId(eb); } diff --git a/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java b/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java index b6236ffcf..a26f1bf06 100644 --- a/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java +++ b/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java @@ -244,6 +244,11 @@ public class TDSpiEbeanServer implements SpiEbeanServer { return null; } + @Override + public Object setBeanId(Object bean, Object id) { + return id; + } + @Override public Object getBeanId(Object bean) { return null; diff --git a/src/test/java/com/avaje/tests/basic/TestExplicitInsert.java b/src/test/java/com/avaje/tests/basic/TestExplicitInsert.java index 77ba1bc93..d86cf3043 100644 --- a/src/test/java/com/avaje/tests/basic/TestExplicitInsert.java +++ b/src/test/java/com/avaje/tests/basic/TestExplicitInsert.java @@ -2,6 +2,7 @@ package com.avaje.tests.basic; import java.util.List; +import com.avaje.tests.model.basic.Customer; import com.avaje.tests.model.basic.MyEBasicConfigStartup; import org.junit.Assert; import org.junit.Test; @@ -11,10 +12,35 @@ import com.avaje.ebean.Ebean; import com.avaje.ebean.EbeanServer; import com.avaje.tests.model.basic.EBasic; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; public class TestExplicitInsert extends BaseTestCase { + @Test + public void setId_when_converted() { + + EbeanServer server = Ebean.getDefaultServer(); + + Customer cust = new Customer(); + Object returnId = server.setBeanId(cust, "42"); + + assertThat(returnId).isEqualTo(42); + assertThat(cust.getId()).isEqualTo(42); + } + + @Test + public void setId_when_correctType() { + + EbeanServer server = Ebean.getDefaultServer(); + + Customer customer = new Customer(); + Object returnId = server.setBeanId(customer, 42); + + assertThat(returnId).isEqualTo(42); + assertThat(customer.getId()).isEqualTo(42); + } + @Test public void test() throws InterruptedException { @@ -27,7 +53,7 @@ public class TestExplicitInsert extends BaseTestCase { b.setDescription("explicit insert"); b.setStatus(EBasic.Status.ACTIVE); - EbeanServer server = Ebean.getServer(null); + EbeanServer server = Ebean.getDefaultServer(); server.insert(b); Assert.assertNotNull(b.getId()); @@ -35,6 +61,9 @@ public class TestExplicitInsert extends BaseTestCase { Assert.assertEquals(b.getId(), server.getBeanId(b)); + + + EBasic b2 = server.find(EBasic.class, b.getId()); b2.setId(null);