diff --git a/src/main/java/com/avaje/ebean/config/dbplatform/DatabasePlatform.java b/src/main/java/com/avaje/ebean/config/dbplatform/DatabasePlatform.java index d1516895a..a8b4b3e70 100644 --- a/src/main/java/com/avaje/ebean/config/dbplatform/DatabasePlatform.java +++ b/src/main/java/com/avaje/ebean/config/dbplatform/DatabasePlatform.java @@ -424,4 +424,23 @@ public class DatabasePlatform { public boolean isDisallowBatchOnCascade() { return disallowBatchOnCascade; } + + /** + * Generate and return the create sequence DDL. + */ + public String ddlCreateSequence(String sequenceName, int initialValue, int allocationSize) { + + StringBuilder sb = new StringBuilder("create sequence "); + sb.append(sequenceName); + if (initialValue > 1) { + sb.append(" start with ").append(initialValue); + } + if (allocationSize > 0 && allocationSize != 50) { + // at this stage ignoring allocationSize 50 as this is the 'default' and + // not consistent with the way Ebean batch fetches sequence values + sb.append(" increment by ").append(allocationSize); + } + sb.append(";"); + return sb.toString(); + } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/ddl/CreateSequenceVisitor.java b/src/main/java/com/avaje/ebeaninternal/server/ddl/CreateSequenceVisitor.java index f0336e343..eb2690296 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/ddl/CreateSequenceVisitor.java +++ b/src/main/java/com/avaje/ebeaninternal/server/ddl/CreateSequenceVisitor.java @@ -36,12 +36,14 @@ public class CreateSequenceVisitor implements BeanVisitor { +" as DatabasePlatform does not support sequences"; logger.warn(msg); return false; - } + } - if (descriptor.getSequenceName() != null) { - ctx.write("create sequence "); - ctx.write(descriptor.getSequenceName()); - ctx.write(";").writeNewLine().writeNewLine(); + String sequenceName = descriptor.getSequenceName(); + if (sequenceName != null) { + int initialValue = descriptor.getSequenceInitialValue(); + int allocationSize = descriptor.getSequenceAllocationSize(); + String createSeq = ctx.getDbPlatform().ddlCreateSequence(sequenceName, initialValue, allocationSize); + ctx.write(createSeq).writeNewLine().writeNewLine(); } return true; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java index b1f255066..551cdec64 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java @@ -92,6 +92,10 @@ public class BeanDescriptor implements MetaBeanInfo { */ private final String sequenceName; + private final int sequenceInitialValue; + + private final int sequenceAllocationSize; + /** * SQL used to return last inserted id. Used for Identity columns where * getGeneratedKeys is not supported. @@ -332,6 +336,8 @@ public class BeanDescriptor implements MetaBeanInfo { this.idType = deploy.getIdType(); this.idGenerator = deploy.getIdGenerator(); this.sequenceName = deploy.getSequenceName(); + this.sequenceInitialValue = deploy.getSequenceInitialValue(); + this.sequenceAllocationSize = deploy.getSequenceAllocationSize(); this.selectLastInsertedId = deploy.getSelectLastInsertedId(); this.lazyFetchIncludes = InternString.intern(deploy.getLazyFetchIncludes()); this.concurrencyMode = deploy.getConcurrencyMode(); @@ -1686,6 +1692,20 @@ public class BeanDescriptor implements MetaBeanInfo { return sequenceName; } + /** + * Return the sequence initial value. + */ + public int getSequenceInitialValue() { + return sequenceInitialValue; + } + + /** + * Return the sequence allocation size. + */ + public int getSequenceAllocationSize() { + return sequenceAllocationSize; + } + /** * Return the SQL used to return the last inserted id. *

diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java index f625952ec..4bf8927b6 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java @@ -91,6 +91,10 @@ public class DeployBeanDescriptor { */ private String sequenceName; + private int sequenceInitialValue; + + private int sequenceAllocationSize; + /** * Used with Identity columns but no getGeneratedKeys support. */ @@ -263,6 +267,22 @@ public class DeployBeanDescriptor { return entityType; } + public void setSequenceInitialValue(int sequenceInitialValue) { + this.sequenceInitialValue = sequenceInitialValue; + } + + public void setSequenceAllocationSize(int sequenceAllocationSize) { + this.sequenceAllocationSize = sequenceAllocationSize; + } + + public int getSequenceInitialValue() { + return sequenceInitialValue; + } + + public int getSequenceAllocationSize() { + return sequenceAllocationSize; + } + public void add(DRawSqlMeta rawSqlMeta) { rawSqlMetas.put(rawSqlMeta.getName(), rawSqlMeta); if ("default".equals(rawSqlMeta.getName())) { diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/AnnotationFields.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/AnnotationFields.java index 7797ee654..7fff02f83 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/AnnotationFields.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/AnnotationFields.java @@ -349,6 +349,8 @@ public class AnnotationFields extends AnnotationParser { if (sequenceGenerator.name().equals(genName)) { genName = sequenceGenerator.sequenceName(); } + descriptor.setSequenceInitialValue(sequenceGenerator.initialValue()); + descriptor.setSequenceAllocationSize(sequenceGenerator.allocationSize()); } GenerationType strategy = gen.strategy(); diff --git a/src/test/java/com/avaje/tests/model/basic/Person.java b/src/test/java/com/avaje/tests/model/basic/Person.java index bcb1650b0..39fa054ef 100644 --- a/src/test/java/com/avaje/tests/model/basic/Person.java +++ b/src/test/java/com/avaje/tests/model/basic/Person.java @@ -1,17 +1,9 @@ package com.avaje.tests.model.basic; +import javax.persistence.*; import java.io.Serializable; import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.OneToMany; -import javax.persistence.Table; - @Entity(name = "Person") @Table(name = "PERSONS") public class Person implements Serializable { @@ -28,6 +20,7 @@ public class Person implements Serializable { @Id @GeneratedValue(strategy = javax.persistence.GenerationType.AUTO) + @SequenceGenerator(name="PERSONS_SEQ", initialValue = 1000, allocationSize = 40) @Column(name = "ID", unique = true, nullable = false) public Long getId() { return id;