Fix for #258 - Missing Inserts for Large Batches - Ebean 3.2.2

This commit is contained in:
rbygrave
2015-04-11 18:55:08 +12:00
parent db57404e18
commit 3b30388b35
2 changed files with 54 additions and 5 deletions
@@ -2,6 +2,7 @@ package com.avaje.ebeaninternal.server.persist;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.IdentityHashMap;
import com.avaje.ebeaninternal.server.core.PersistRequest;
import com.avaje.ebeaninternal.server.core.PersistRequestBean;
@@ -21,6 +22,8 @@ import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
*/
public class BatchedBeanHolder {
private static final Object DUMMY = new Object();
/**
* The owning queue.
*/
@@ -48,7 +51,11 @@ public class BatchedBeanHolder {
*/
private ArrayList<PersistRequest> deletes;
private HashSet<Integer> beanHashCodes = new HashSet<Integer>();
/**
* Set of beans in this batch. This is used to ensure that a single bean instance is not included
* in the batch twice (two separate insert requests etc).
*/
private IdentityHashMap<Object,Object> persistedBeans = new IdentityHashMap<Object,Object>();
/**
* Create a new entry with a given type and depth.
@@ -90,7 +97,7 @@ public class BatchedBeanHolder {
control.executeNow(deletes);
deletes.clear();
}
beanHashCodes.clear();
persistedBeans.clear();
}
public String toString() {
@@ -113,8 +120,8 @@ public class BatchedBeanHolder {
*/
public int append(PersistRequestBean<?> request) {
Integer objHashCode = new Integer(System.identityHashCode(request.getEntityBean()));
if (!beanHashCodes.add(objHashCode)) {
Object alreadyInBatch = persistedBeans.put(request.getEntityBean(), DUMMY);
if (alreadyInBatch != null) {
// special case where the same bean instance has already been
// added to the batch (doesn't really occur with non-batching
// as the bean gets changed from dirty to loaded earlier)
@@ -154,6 +161,6 @@ public class BatchedBeanHolder {
* Return true if this is empty containing no batched beans.
*/
public boolean isEmpty() {
return beanHashCodes.isEmpty();
return persistedBeans.isEmpty();
}
}
@@ -0,0 +1,42 @@
package com.avaje.ebeaninternal.server.persist;
import com.avaje.ebean.Ebean;
import com.avaje.ebeaninternal.api.SpiEbeanServer;
import com.avaje.ebeaninternal.api.TDSpiEbeanServer;
import com.avaje.ebeaninternal.server.core.PersistRequest;
import com.avaje.ebeaninternal.server.core.PersistRequestBean;
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
import com.avaje.ebeaninternal.server.deploy.BeanManager;
import com.avaje.tests.model.basic.Customer;
import org.junit.Test;
import org.mockito.Mockito;
import static org.junit.Assert.assertEquals;
public class BatchedBeanHolderTest {
@Test
public void testAppend() throws Exception {
TDSpiEbeanServer server = new TDSpiEbeanServer("foo");
BeanDescriptor beanDescriptor = Mockito.mock(BeanDescriptor.class);
BeanManager beanManager = new BeanManager(beanDescriptor, null);
BatchedBeanHolder holder = new BatchedBeanHolder(null, beanDescriptor, 1);
Customer customer = new Customer();
PersistRequestBean req1 = new PersistRequestBean(server, customer, null, beanManager, null, null, PersistRequest.Type.INSERT, false);
int size = holder.append(req1);
assertEquals(1, size);
PersistRequestBean req2 = new PersistRequestBean(server, customer, null, beanManager, null, null, PersistRequest.Type.INSERT, false);
size = holder.append(req2);
assertEquals(0, size);
}
}