#641 - ENH: Add EbeanServer.setBeanId(bean, id) ... to make it easy to convert id value to appropriate type and set

This commit is contained in:
Robin Bygrave
2016-04-08 01:15:34 +12:00
parent 649c14644e
commit 524be4ce55
4 changed files with 58 additions and 4 deletions
@@ -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.
* <p>
* 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.
* </p>
* @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.
* <p>
@@ -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);
}
@@ -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;
@@ -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);