Support for @Identity - with start, increment, cache

This commit is contained in:
rob bygrave
2020-03-04 16:59:42 +13:00
parent 9410f82f5a
commit 2ac19bea1a
41 changed files with 510 additions and 115 deletions
@@ -10,7 +10,6 @@ import io.ebean.config.dbplatform.oracle.OraclePlatform;
import io.ebean.config.dbplatform.postgres.PostgresPlatform;
import io.ebean.config.dbplatform.sqlserver.SqlServer17Platform;
import io.ebeaninternal.dbmigration.migration.AlterColumn;
import io.ebeaninternal.dbmigration.migration.IdentityType;
import io.ebeaninternal.server.core.PlatformDdlBuilder;
import org.junit.Test;
@@ -76,7 +75,7 @@ public class PlatformDdl_AlterColumnTest {
}
@Test
public void testAlterColumnBaseAttributes() throws Exception {
public void testAlterColumnBaseAttributes() {
AlterColumn alterColumn = alterNotNull();
assertNull(h2Ddl.alterColumnBaseAttributes(alterColumn));
@@ -117,7 +116,7 @@ public class PlatformDdl_AlterColumnTest {
}
@Test
public void testAlterColumnType() throws Exception {
public void testAlterColumnType() {
String sql = h2Ddl.alterColumnType("mytab", "acol", "varchar(20)");
assertEquals("alter table mytab alter column acol varchar(20)", sql);
@@ -139,7 +138,7 @@ public class PlatformDdl_AlterColumnTest {
}
@Test
public void testAlterColumnNotnull() throws Exception {
public void testAlterColumnNotnull() {
String sql = h2Ddl.alterColumnNotnull("mytab", "acol", true);
assertEquals("alter table mytab alter column acol set not null", sql);
@@ -161,7 +160,7 @@ public class PlatformDdl_AlterColumnTest {
}
@Test
public void testAlterColumnNull() throws Exception {
public void testAlterColumnNull() {
String sql = h2Ddl.alterColumnNotnull("mytab", "acol", false);
assertEquals("alter table mytab alter column acol set null", sql);
@@ -183,7 +182,7 @@ public class PlatformDdl_AlterColumnTest {
}
@Test
public void testAlterColumnDefaultValue() throws Exception {
public void testAlterColumnDefaultValue() {
String sql = h2Ddl.alterColumnDefaultValue("mytab", "acol", "'hi'");
assertEquals("alter table mytab alter column acol set default 'hi'", sql);
@@ -203,15 +202,14 @@ public class PlatformDdl_AlterColumnTest {
boolean exceptionCaught = false;
try {
hanaDdl.alterColumnDefaultValue("mytab", "acol", "'hi'");
}
catch (UnsupportedOperationException e) {
} catch (UnsupportedOperationException e) {
exceptionCaught = true;
}
assertTrue(exceptionCaught);
}
@Test
public void testAlterColumnDropDefault() throws Exception {
public void testAlterColumnDropDefault() {
String sql = h2Ddl.alterColumnDefaultValue("mytab", "acol", "DROP DEFAULT");
assertEquals("alter table mytab alter column acol drop default", sql);
@@ -231,8 +229,7 @@ public class PlatformDdl_AlterColumnTest {
boolean exceptionCaught = false;
try {
hanaDdl.alterColumnDefaultValue("mytab", "acol", "DROP DEFAULT");
}
catch (UnsupportedOperationException e) {
} catch (UnsupportedOperationException e) {
exceptionCaught = true;
}
assertTrue(exceptionCaught);
@@ -241,49 +238,49 @@ public class PlatformDdl_AlterColumnTest {
@Test
public void useIdentityType_h2() {
assertEquals(h2Ddl.useIdentityType(null), IdType.IDENTITY);
assertEquals(h2Ddl.useIdentityType(IdentityType.SEQUENCE), IdType.SEQUENCE);
assertEquals(h2Ddl.useIdentityType(IdentityType.IDENTITY), IdType.IDENTITY);
assertEquals(h2Ddl.useIdentityType(IdentityType.GENERATOR), IdType.GENERATOR);
assertEquals(h2Ddl.useIdentityType(IdentityType.EXTERNAL), IdType.EXTERNAL);
assertEquals(h2Ddl.useIdentityType(IdType.SEQUENCE), IdType.SEQUENCE);
assertEquals(h2Ddl.useIdentityType(IdType.IDENTITY), IdType.IDENTITY);
assertEquals(h2Ddl.useIdentityType(IdType.GENERATOR), IdType.GENERATOR);
assertEquals(h2Ddl.useIdentityType(IdType.EXTERNAL), IdType.EXTERNAL);
}
@Test
public void useIdentityType_postgres() {
assertEquals(pgDdl.useIdentityType(IdentityType.GENERATOR), IdType.GENERATOR);
assertEquals(pgDdl.useIdentityType(IdentityType.EXTERNAL), IdType.EXTERNAL);
assertEquals(pgDdl.useIdentityType(IdType.GENERATOR), IdType.GENERATOR);
assertEquals(pgDdl.useIdentityType(IdType.EXTERNAL), IdType.EXTERNAL);
assertEquals(pgDdl.useIdentityType(null), IdType.IDENTITY);
assertEquals(pgDdl.useIdentityType(IdentityType.SEQUENCE), IdType.SEQUENCE);
assertEquals(pgDdl.useIdentityType(IdentityType.IDENTITY), IdType.IDENTITY);
assertEquals(pgDdl.useIdentityType(IdType.SEQUENCE), IdType.SEQUENCE);
assertEquals(pgDdl.useIdentityType(IdType.IDENTITY), IdType.IDENTITY);
}
@Test
public void useIdentityType_mysql() {
assertEquals(mysqlDdl.useIdentityType(null), IdType.IDENTITY);
assertEquals(mysqlDdl.useIdentityType(IdentityType.SEQUENCE), IdType.IDENTITY);
assertEquals(mysqlDdl.useIdentityType(IdentityType.IDENTITY), IdType.IDENTITY);
assertEquals(mysqlDdl.useIdentityType(IdentityType.GENERATOR), IdType.GENERATOR);
assertEquals(mysqlDdl.useIdentityType(IdentityType.EXTERNAL), IdType.EXTERNAL);
assertEquals(mysqlDdl.useIdentityType(IdType.SEQUENCE), IdType.IDENTITY);
assertEquals(mysqlDdl.useIdentityType(IdType.IDENTITY), IdType.IDENTITY);
assertEquals(mysqlDdl.useIdentityType(IdType.GENERATOR), IdType.GENERATOR);
assertEquals(mysqlDdl.useIdentityType(IdType.EXTERNAL), IdType.EXTERNAL);
}
@Test
public void useIdentityType_oracle() {
assertEquals(oraDdl.useIdentityType(null), IdType.SEQUENCE);
assertEquals(oraDdl.useIdentityType(IdentityType.SEQUENCE), IdType.SEQUENCE);
assertEquals(oraDdl.useIdentityType(IdentityType.IDENTITY), IdType.IDENTITY);
assertEquals(oraDdl.useIdentityType(IdentityType.GENERATOR), IdType.GENERATOR);
assertEquals(oraDdl.useIdentityType(IdentityType.EXTERNAL), IdType.EXTERNAL);
assertEquals(oraDdl.useIdentityType(IdType.SEQUENCE), IdType.SEQUENCE);
assertEquals(oraDdl.useIdentityType(IdType.IDENTITY), IdType.IDENTITY);
assertEquals(oraDdl.useIdentityType(IdType.GENERATOR), IdType.GENERATOR);
assertEquals(oraDdl.useIdentityType(IdType.EXTERNAL), IdType.EXTERNAL);
}
@Test
public void useIdentityType_hana() {
assertEquals(hanaDdl.useIdentityType(null), IdType.IDENTITY);
assertEquals(hanaDdl.useIdentityType(IdentityType.SEQUENCE), IdType.IDENTITY);
assertEquals(hanaDdl.useIdentityType(IdentityType.IDENTITY), IdType.IDENTITY);
assertEquals(hanaDdl.useIdentityType(IdentityType.GENERATOR), IdType.GENERATOR);
assertEquals(hanaDdl.useIdentityType(IdentityType.EXTERNAL), IdType.EXTERNAL);
assertEquals(hanaDdl.useIdentityType(IdType.SEQUENCE), IdType.IDENTITY);
assertEquals(hanaDdl.useIdentityType(IdType.IDENTITY), IdType.IDENTITY);
assertEquals(hanaDdl.useIdentityType(IdType.GENERATOR), IdType.GENERATOR);
assertEquals(hanaDdl.useIdentityType(IdType.EXTERNAL), IdType.EXTERNAL);
}
}
@@ -0,0 +1,129 @@
package io.ebeaninternal.dbmigration.model;
import io.ebean.annotation.IdentityGenerated;
import io.ebean.config.dbplatform.IdType;
import io.ebeaninternal.dbmigration.migration.CreateTable;
import io.ebeaninternal.dbmigration.migration.IdentityType;
import io.ebeaninternal.server.deploy.IdentityMode;
import io.ebeaninternal.server.deploy.meta.DeployIdentityMode;
import org.junit.Test;
import java.math.BigInteger;
import static org.junit.Assert.*;
public class MTableIdentityTest {
@Test
public void toCreateTable() {
IdentityMode mode = new IdentityMode(IdType.SEQUENCE, IdentityGenerated.BY_DEFAULT, 11, 12, 13, "foo_seq");
CreateTable tab = new CreateTable();
MTableIdentity.toCreateTable(mode, tab);
assertEquals(BigInteger.valueOf(11), tab.getIdentityStart());
assertEquals(BigInteger.valueOf(12), tab.getIdentityIncrement());
assertEquals(BigInteger.valueOf(13), tab.getIdentityCache());
assertEquals("foo_seq", tab.getSequenceName());
assertEquals("by_default", tab.getIdentityGenerated());
assertEquals(IdentityType.SEQUENCE, tab.getIdentityType());
}
@Test
public void toCreateTable_when_auto() {
IdentityMode mode = new IdentityMode(IdType.AUTO, IdentityGenerated.AUTO, 11, 12, 13, "foo_seq");
CreateTable tab = new CreateTable();
MTableIdentity.toCreateTable(mode, tab);
assertNull(tab.getIdentityGenerated());
assertNull(tab.getIdentityType());
}
@Test
public void toCreateTable_when_PlatformDefault_expect_typeNull() {
DeployIdentityMode deploy = DeployIdentityMode.auto();
deploy.setPlatformType(IdType.SEQUENCE);
CreateTable tab = new CreateTable();
MTableIdentity.toCreateTable(new IdentityMode(deploy), tab);
assertNull(tab.getIdentityType());
}
@Test
public void toCreateTable_when_notPlatformDefault_expectType() {
DeployIdentityMode deploy = DeployIdentityMode.auto();
deploy.setIdType(IdType.SEQUENCE);
CreateTable tab = new CreateTable();
MTableIdentity.toCreateTable(new IdentityMode(deploy), tab);
assertEquals(IdentityType.SEQUENCE, tab.getIdentityType());
}
@Test
public void fromCreateTable_when_empty() {
CreateTable tab = new CreateTable();
final IdentityMode mode = MTableIdentity.fromCreateTable(tab);
assertEquals(IdType.AUTO, mode.getIdType());
assertEquals(IdentityGenerated.AUTO, mode.getGenerated());
assertEquals(0, mode.getStart());
assertEquals(0, mode.getIncrement());
assertEquals(0, mode.getCache());
assertNull(mode.getSequenceName());
}
@Test
public void fromCreateTable_when_allSet() {
CreateTable tab = new CreateTable();
tab.setIdentityType(IdentityType.SEQUENCE);
tab.setIdentityGenerated("always");
tab.setSequenceName("foo_seq");
tab.setIdentityStart(BigInteger.valueOf(5));
tab.setIdentityIncrement(BigInteger.valueOf(7));
tab.setIdentityCache(BigInteger.valueOf(9));
final IdentityMode mode = MTableIdentity.fromCreateTable(tab);
assertEquals(IdType.SEQUENCE, mode.getIdType());
assertEquals(IdentityGenerated.ALWAYS, mode.getGenerated());
assertEquals(5, mode.getStart());
assertEquals(7, mode.getIncrement());
assertEquals(9, mode.getCache());
assertEquals("foo_seq", mode.getSequenceName());
}
@Test
public void fromCreateTable_expect_useNewPropertiesWin() {
CreateTable tab = new CreateTable();
// old properties lose
tab.setSequenceInitial(BigInteger.valueOf(42));
tab.setSequenceAllocate(BigInteger.valueOf(43));
// new properties win
tab.setIdentityStart(BigInteger.valueOf(5));
tab.setIdentityIncrement(BigInteger.valueOf(7));
final IdentityMode mode = MTableIdentity.fromCreateTable(tab);
assertEquals(5, mode.getStart());
assertEquals(7, mode.getIncrement());
}
@Test
public void fromCreateTable_when_seqInitAndSeqAll() {
CreateTable tab = new CreateTable();
tab.setSequenceInitial(BigInteger.valueOf(42));
tab.setSequenceAllocate(BigInteger.valueOf(43));
final IdentityMode mode = MTableIdentity.fromCreateTable(tab);
assertEquals(42, mode.getStart());
assertEquals(43, mode.getIncrement());
}
}
@@ -2,6 +2,7 @@ package org.tests.compositekeys;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.annotation.Identity;
import io.ebeaninternal.api.SpiEbeanServer;
import io.ebeaninternal.server.deploy.BeanDescriptor;
import io.ebeaninternal.server.deploy.BeanPropertyAssocMany;
@@ -22,6 +23,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
import static org.junit.Assert.assertEquals;
/**
@@ -89,6 +91,7 @@ public class TestOnCascadeDeleteChildrenWithCompositeKeys extends BaseTestCase {
beanProperty.findIdsByParentId(1L, null, null, null, true);
}
@Identity(generated = BY_DEFAULT)
@Entity
@Table(name = "em_user")
public static class User {
@@ -1,9 +1,15 @@
package org.tests.compositekeys.db;
import io.ebean.annotation.Identity;
import io.ebean.annotation.IdentityGenerated;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Version;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
@Identity(generated = BY_DEFAULT)
@Entity
public class SubType {
@EmbeddedId
@@ -1,8 +1,13 @@
package org.tests.idkeys.db;
import io.ebean.annotation.Identity;
import javax.persistence.Entity;
import javax.persistence.Id;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
@Identity(generated = BY_DEFAULT)
@Entity
// Just let Ebean define Identity mechanism for testing across all DB types
//@SequenceGenerator(name = "AD_SEQ_NAME", sequenceName = "AD_SEQ")
+5 -1
View File
@@ -1,12 +1,16 @@
package org.tests.merge;
import io.ebean.annotation.Identity;
import javax.persistence.Entity;
import javax.persistence.Id;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
@Entity
public class MGroup {
@Id
@Id @Identity(generated = BY_DEFAULT)
private long id;
private String name;
@@ -2,6 +2,7 @@ package org.tests.model.basic;
import io.ebean.Model;
import io.ebean.annotation.Cache;
import io.ebean.annotation.Identity;
import javax.persistence.Entity;
import javax.persistence.Id;
@@ -9,12 +10,14 @@ import javax.persistence.Table;
import javax.persistence.Version;
import java.sql.Timestamp;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
@Cache(enableQueryCache = true)
@Entity
@Table(name = "e_basicver")
public class EBasicVer extends Model {
@Id
@Id @Identity(generated = BY_DEFAULT)
Integer id;
String name;
@@ -4,6 +4,7 @@ import io.ebean.annotation.Cache;
import io.ebean.annotation.CacheQueryTuning;
import io.ebean.annotation.CreatedTimestamp;
import io.ebean.annotation.DocStore;
import io.ebean.annotation.Identity;
import javax.persistence.Entity;
import javax.persistence.Id;
@@ -13,9 +14,12 @@ import javax.validation.constraints.Size;
import java.io.Serializable;
import java.sql.Timestamp;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
/**
* Product entity bean.
*/
@Identity(generated = BY_DEFAULT)
@DocStore
@Cache
@CacheQueryTuning(maxSecsToLive = 15)
@@ -1,5 +1,6 @@
package org.tests.model.ddd;
import io.ebean.annotation.Identity;
import org.tests.model.ivo.Oid;
import org.tests.model.ivo.converter.AnEnumType;
@@ -8,6 +9,9 @@ import javax.persistence.Id;
import javax.persistence.Version;
import java.sql.Timestamp;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
@Identity(generated = BY_DEFAULT)
@Entity
public class DExhEntity {
@@ -1,6 +1,7 @@
package org.tests.model.draftable;
import io.ebean.Model;
import io.ebean.annotation.Identity;
import io.ebean.annotation.WhenCreated;
import io.ebean.annotation.WhenModified;
@@ -9,6 +10,9 @@ import javax.persistence.MappedSuperclass;
import javax.persistence.Version;
import java.sql.Timestamp;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
@Identity(generated = BY_DEFAULT)
@MappedSuperclass
public class BaseDomain extends Model {
@@ -1,5 +1,6 @@
package org.tests.model.m2m;
import io.ebean.annotation.Identity;
import org.tests.model.BaseModel;
import javax.persistence.CascadeType;
@@ -8,6 +9,9 @@ import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import java.util.List;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
@Identity(generated = BY_DEFAULT)
@Entity
public class MnyB extends BaseModel {
@@ -1,11 +1,15 @@
package org.tests.model.m2m;
import io.ebean.annotation.Identity;
import org.tests.model.BaseModel;
import javax.persistence.Entity;
import javax.persistence.ManyToMany;
import java.util.List;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
@Identity(generated = BY_DEFAULT)
@Entity
public class MnyC extends BaseModel {
@@ -1,10 +1,15 @@
package org.tests.model.nofk;
import io.ebean.annotation.Identity;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
@Identity(generated = BY_DEFAULT)
@Entity
public class EUserNoFk {
@@ -1,6 +1,7 @@
package org.tests.model.nofk;
import io.ebean.annotation.Formula;
import io.ebean.annotation.Identity;
import io.ebean.annotation.Platform;
import io.ebean.annotation.SoftDelete;
@@ -9,6 +10,9 @@ import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;
import static io.ebean.annotation.IdentityGenerated.BY_DEFAULT;
@Identity(generated = BY_DEFAULT)
@Entity
public class EUserNoFkSoftDel {
@@ -1,11 +1,15 @@
package org.tests.model.onetoone;
import io.ebean.annotation.Identity;
import io.ebean.annotation.IdentityGenerated;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
@Identity(generated = IdentityGenerated.BY_DEFAULT)
@Entity
public class OtoBChild {
@@ -1,9 +1,13 @@
package org.tests.model.onetoone;
import io.ebean.annotation.Identity;
import io.ebean.annotation.IdentityGenerated;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Version;
@Identity(generated = IdentityGenerated.BY_DEFAULT)
@Entity
public class OtoPrimeExtra {