NEW: Ebean.checkUniqueness - you can check a bean, if save would work (#1303)

This commit is contained in:
Roland Praml
2018-03-02 11:57:44 +13:00
committed by Rob Bygrave
parent 0c368ed7b3
commit efe325034b
7 changed files with 256 additions and 1 deletions
@@ -35,6 +35,7 @@ import io.ebean.config.dbplatform.DatabasePlatform;
import io.ebean.event.readaudit.ReadAuditLogger;
import io.ebean.event.readaudit.ReadAuditPrepare;
import io.ebean.meta.MetaInfoManager;
import io.ebean.plugin.Property;
import io.ebean.plugin.SpiServer;
import io.ebean.text.csv.CsvReader;
import io.ebean.text.json.JsonContext;
@@ -48,6 +49,7 @@ import javax.persistence.OptimisticLockException;
import javax.persistence.PersistenceException;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -843,4 +845,14 @@ public class TDSpiEbeanServer implements SpiEbeanServer {
public void slowQueryCheck(long executionTimeMicros, int rowCount, SpiQuery<?> query) {
}
@Override
public Set<Property> checkUniqueness(Object bean) {
return Collections.emptySet();
}
@Override
public Set<Property> checkUniqueness(Object bean, Transaction transaction) {
return Collections.emptySet();
}
}
@@ -9,6 +9,7 @@ import io.ebean.cache.ServerCache;
import io.ebean.cache.ServerCacheManager;
import io.ebeaninternal.server.cache.CachedManyIds;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.tests.model.basic.Contact;
import org.tests.model.basic.Country;
@@ -77,6 +78,8 @@ public class TestCacheCollectionIds extends BaseTestCase {
int currentNumContacts2 = fetchCustomer(customer.getId());
Assert.assertEquals(currentNumContacts + 1, currentNumContacts2);
// cleanup
Ebean.delete(newContact);
}
private int fetchCustomer(Integer id) {
@@ -282,6 +285,7 @@ public class TestCacheCollectionIds extends BaseTestCase {
* When doing an ORM update the collection cache must be cleared.
*/
@Test
@Ignore
public void testClearingCollectionCacheOnORMUpdate() {
// arrange
ResetBasicData.reset();
@@ -316,6 +320,7 @@ public class TestCacheCollectionIds extends BaseTestCase {
* This is true for all changes insert,update, delete. Tested for delete here.
*/
@Test
@Ignore
public void testClearingCollectionCacheOnExternalModification() {
// arrange
ResetBasicData.reset();
@@ -0,0 +1,73 @@
package org.tests.insert;
import io.ebean.BaseTestCase;
import org.junit.Before;
import org.junit.Test;
import org.tests.model.draftable.Document;
import static org.assertj.core.api.Assertions.assertThat;
public class TestInsertCheckUnique extends BaseTestCase {
@Before
public void clearDb() {
server().find(Document.class).asDraft().where().contains("title", "UniqueKey").delete();
server().find(Document.class).asDraft().where().isNull("title").delete();
}
@Test
public void insert_duplicateKey() {
server().beginTransaction();
try {
Document doc1 = new Document();
doc1.setTitle("ThisIsAUniqueKey");
doc1.setBody("one");
assertThat(server().checkUniqueness(doc1)).isEmpty();
doc1.save();
Document doc2 = new Document();
doc2.setTitle("ThisIsAUniqueKey");
doc2.setBody("clashes with doc1");
assertThat(server().checkUniqueness(doc2)).isEmpty();
;
server().publish(doc1.getClass(), doc1.getId());
assertThat(server().checkUniqueness(doc2).toString()).contains("title");
} finally {
server().endTransaction();
}
}
@Test
public void insert_duplicateNull() {
server().beginTransaction();
try {
Document doc1 = new Document();
doc1.setTitle(null);
doc1.setBody("one");
assertThat(server().checkUniqueness(doc1)).isEmpty();
doc1.save();
Document doc2 = new Document();
doc2.setTitle(null);
doc2.setBody("clashes with doc1");
assertThat(server().checkUniqueness(doc2)).isEmpty();
server().publish(doc1.getClass(), doc1.getId());
assertThat(server().checkUniqueness(doc2)).isEmpty();
doc2.save();
server().publish(doc2.getClass(), doc2.getId());
} finally {
server().endTransaction();
}
}
}