setArrayParameter(String name, Collection> values);
+
/**
* Bind the parameter by its index position (1 based like JDBC).
*/
diff --git a/ebean-api/src/main/java/io/ebean/SqlUpdate.java b/ebean-api/src/main/java/io/ebean/SqlUpdate.java
index 927050d3f..9ce704922 100644
--- a/ebean-api/src/main/java/io/ebean/SqlUpdate.java
+++ b/ebean-api/src/main/java/io/ebean/SqlUpdate.java
@@ -1,5 +1,7 @@
package io.ebean;
+import java.util.Collection;
+
/**
* A SqlUpdate for executing insert update or delete statements.
*
@@ -324,6 +326,13 @@ public interface SqlUpdate {
*/
SqlUpdate setParameter(String name, Object param);
+ /**
+ * Bind the named multi-value array parameter which we would use with Postgres ANY.
+ *
+ * For Postgres this binds an ARRAY rather than expands into multiple bind values.
+ */
+ SqlUpdate setArrayParameter(String name, Collection> values);
+
/**
* Set a named parameter that has a null value. Exactly the same as
* {@link #setNullParameter(String, int)}.
diff --git a/ebean-api/src/main/java/io/ebean/config/PlatformConfig.java b/ebean-api/src/main/java/io/ebean/config/PlatformConfig.java
index bedbd7de5..0cac9909c 100644
--- a/ebean-api/src/main/java/io/ebean/config/PlatformConfig.java
+++ b/ebean-api/src/main/java/io/ebean/config/PlatformConfig.java
@@ -396,7 +396,7 @@ public class PlatformConfig {
BINARY(false, true, false),
/**
- * Store using DB BINARY(16).
+ * Store using DB BINARY(16) with optimized packing.
*/
BINARY_OPTIMIZED(false, true, true);
diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java
index 305f38efe..61d14f4a6 100644
--- a/ebean-api/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java
+++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/db2/DB2Platform.java
@@ -22,8 +22,8 @@ public class DB2Platform extends DatabasePlatform {
this.platform = Platform.DB2;
// Note: DB2 (at least LUW supports length up to 128)
// TOOD: Check if we need to introduce a new platform (DB2_LUW_11 ?)
- this.maxTableNameLength = 128;
- this.maxConstraintNameLength = 128;
+ this.maxTableNameLength = 18;
+ this.maxConstraintNameLength = 18;
this.truncateTable = "truncate table %s reuse storage ignore delete triggers immediate";
this.sqlLimiter = new Db2SqlLimiter();
diff --git a/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlite/SQLitePlatform.java b/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlite/SQLitePlatform.java
index 09db19312..e936194d5 100644
--- a/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlite/SQLitePlatform.java
+++ b/ebean-api/src/main/java/io/ebean/config/dbplatform/sqlite/SQLitePlatform.java
@@ -24,6 +24,7 @@ public class SQLitePlatform extends DatabasePlatform {
this.dbDefaultValue.setFalse("0");
this.dbDefaultValue.setTrue("1");
this.dbDefaultValue.setNow("CURRENT_TIMESTAMP");
+ this.supportsResultSetConcurrencyModeUpdatable = false;
dbTypeMap.put(DbType.BIT, new DbPlatformType("int"));
dbTypeMap.put(DbType.BOOLEAN, new DbPlatformType("int"));
diff --git a/ebean-api/src/main/java/io/ebean/event/BeanPersistRequest.java b/ebean-api/src/main/java/io/ebean/event/BeanPersistRequest.java
index 57930a107..2f3198b65 100644
--- a/ebean-api/src/main/java/io/ebean/event/BeanPersistRequest.java
+++ b/ebean-api/src/main/java/io/ebean/event/BeanPersistRequest.java
@@ -43,6 +43,12 @@ public interface BeanPersistRequest {
return transaction();
}
+ /**
+ * Return true if this request is due to cascading persist.
+ * False implies this is a "top level" request.
+ */
+ boolean isCascade();
+
/**
* For an update or delete of a partially populated bean this is the set of
* loaded properties and otherwise returns null.
diff --git a/ebean-autotune/pom.xml b/ebean-autotune/pom.xml
index 7f0540dee..5f01ea3cd 100644
--- a/ebean-autotune/pom.xml
+++ b/ebean-autotune/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
@@ -13,8 +13,8 @@
- scm:git:git@github.com:FOCONIS/ebean.git
- ebean-parent-12.13.1-FOC1
+ scm:git:git@github.com:ebean-orm/ebean.git
+ HEAD
ebean autotune
@@ -26,7 +26,7 @@
io.ebean
ebean-core
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
provided
diff --git a/ebean-autotune/pom.xml.releaseBackup b/ebean-autotune/pom.xml.releaseBackup
new file mode 100644
index 000000000..dc7b6c0ac
--- /dev/null
+++ b/ebean-autotune/pom.xml.releaseBackup
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+
+
+
+
+
+
+ scm:git:git@github.com:ebean-orm/ebean.git
+ HEAD
+
+
+ ebean autotune
+ ebean automatic query tuning module
+ ebean-autotune
+
+
+
+
+ io.ebean
+ ebean-core
+ 12.13.2-SNAPSHOT
+ provided
+
+
+
+
+ org.glassfish.jaxb
+ jaxb-runtime
+ 2.3.2
+ provided
+
+
+
+ io.ebean
+ ebean-datasource
+ ${ebean-datasource.version}
+ test
+
+
+
+ io.avaje
+ junit
+ 1.0
+ test
+
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.ebean.tile:enhancement:12.11.3
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
+
diff --git a/ebean-bom/pom.xml b/ebean-bom/pom.xml
index 67c887218..de70b12e4 100644
--- a/ebean-bom/pom.xml
+++ b/ebean-bom/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
ebean bom
@@ -71,88 +71,88 @@
io.ebean
ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-api
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-core
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-core-type
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-ddl-generator
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-externalmapping-api
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-externalmapping-xml
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-autotune
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-querybean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
querybean-generator
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
provided
io.ebean
kotlin-querybean-generator
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
provided
io.ebean
ebean-test
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
io.ebean
ebean-postgis
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-redis
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
diff --git a/ebean-bom/pom.xml.releaseBackup b/ebean-bom/pom.xml.releaseBackup
new file mode 100644
index 000000000..417420c68
--- /dev/null
+++ b/ebean-bom/pom.xml.releaseBackup
@@ -0,0 +1,162 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ ebean bom
+ ebean bill of materials pom
+ ebean-bom
+ pom
+
+
+
+
+
+
+
+
+ io.ebean
+ ebean-ddl-runner
+ ${ebean-ddl-runner.version}
+
+
+
+ io.ebean
+ ebean-migration-auto
+ ${ebean-migration-auto.version}
+
+
+
+ io.ebean
+ ebean-migration
+ ${ebean-migration.version}
+
+
+
+ io.ebean
+ ebean-datasource-api
+ ${ebean-datasource.version}
+
+
+
+ io.ebean
+ ebean-datasource
+ ${ebean-datasource.version}
+
+
+
+ io.ebean
+ ebean-agent
+ ${ebean-agent.version}
+
+
+
+ io.ebean
+ ebean-maven-plugin
+ ${ebean-maven-plugin.version}
+
+
+
+ io.ebean
+ ebean-test-docker
+ ${ebean-test-docker.version}
+
+
+
+
+
+ io.ebean
+ ebean
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-api
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-core
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-core-type
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-ddl-generator
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-externalmapping-api
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-externalmapping-xml
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-autotune
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-querybean
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ querybean-generator
+ 12.13.2-SNAPSHOT
+ provided
+
+
+
+ io.ebean
+ kotlin-querybean-generator
+ 12.13.2-SNAPSHOT
+ provided
+
+
+
+ io.ebean
+ ebean-test
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ io.ebean
+ ebean-postgis
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-redis
+ 12.13.2-SNAPSHOT
+
+
+
+
+
+
+
diff --git a/ebean-core-type/pom.xml b/ebean-core-type/pom.xml
index 46ac37c2b..0e4062b6f 100644
--- a/ebean-core-type/pom.xml
+++ b/ebean-core-type/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
ebean-core-type
@@ -16,7 +16,7 @@
io.ebean
ebean-api
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
diff --git a/ebean-core-type/pom.xml.releaseBackup b/ebean-core-type/pom.xml.releaseBackup
new file mode 100644
index 000000000..3d3e11a75
--- /dev/null
+++ b/ebean-core-type/pom.xml.releaseBackup
@@ -0,0 +1,46 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ ebean-core-type
+ ebean core type
+ ebean scalar types api
+
+
+
+
+ io.ebean
+ ebean-api
+ 12.13.2-SNAPSHOT
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ ${jackson.version}
+ true
+
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
diff --git a/ebean-core/pom.xml b/ebean-core/pom.xml
index cefd28a0f..08752f040 100644
--- a/ebean-core/pom.xml
+++ b/ebean-core/pom.xml
@@ -3,7 +3,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
ebean-core
@@ -14,8 +14,8 @@
https://ebean.io/
- scm:git:git@github.com:FOCONIS/ebean.git
- ebean-parent-12.13.1-FOC1
+ scm:git:git@github.com:ebean-orm/ebean.git
+ HEAD
@@ -41,19 +41,19 @@
io.ebean
ebean-api
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-core-type
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-externalmapping-api
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
diff --git a/ebean-core/pom.xml.releaseBackup b/ebean-core/pom.xml.releaseBackup
new file mode 100644
index 000000000..b250f7a0a
--- /dev/null
+++ b/ebean-core/pom.xml.releaseBackup
@@ -0,0 +1,247 @@
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ ebean-core
+ jar
+
+ ebean core
+ ebean core module
+ https://ebean.io/
+
+
+ scm:git:git@github.com:ebean-orm/ebean.git
+ HEAD
+
+
+
+
+
+ io.ebean
+ ebean-ddl-runner
+ 1.2
+
+
+
+ io.avaje
+ classpath-scanner
+ 6.2
+
+
+
+ io.ebean
+ ebean-migration-auto
+ 1.1
+
+
+
+ io.ebean
+ ebean-api
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-core-type
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-externalmapping-api
+ 12.13.2-SNAPSHOT
+
+
+
+ org.antlr
+ antlr4-runtime
+ 4.8-1
+
+
+
+
+ io.avaje
+ avaje-jsr305-x
+ 1.1
+ provided
+
+
+
+
+ com.h2database
+ h2
+ 1.4.199
+ provided
+
+
+
+ javax.transaction
+ javax.transaction-api
+ 1.3
+ true
+
+
+
+
+ javax.validation
+ validation-api
+ 2.0.1.Final
+ true
+
+
+ jakarta.validation
+ jakarta.validation-api
+ 3.0.0
+ true
+
+
+
+ joda-time
+ joda-time
+ 2.9.7
+ true
+
+
+
+
+
+
+
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ ${jackson.version}
+ true
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+ true
+
+
+
+
+ org.postgresql
+ postgresql
+ 42.2.24
+ true
+
+
+
+
+
+ io.ebean
+ ebean-datasource
+ ${ebean-datasource.version}
+ test
+
+
+
+ io.avaje
+ junit
+ 1.0
+ test
+
+
+
+
+
+
+
+
+ io.ebean
+ ebean-maven-plugin
+ ${ebean-maven-plugin.version}
+
+
+ test
+ process-test-classes
+
+ debug=0
+
+
+ testEnhance
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.0.0-M4
+
+ false
+ false
+ false
+
+ **/Test*.java
+ **/*Test.java
+ **/*Tests.java
+
+
+
+
+ datasource.default
+ ${datasource.default}
+
+
+
+ dbClockDelta
+ ${dbClockDelta}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.1.1
+
+ Ebean 12
+ src/main/java/io/ebean/overview.html
+ io.ebeaninternal.*:io.ebeanservice:io.ebean.common:io.ebean.bean:io.ebean.service:io.ebean.metric:io.ebean.util:io.ebean.config.properties:io.ebean.config.dbplatform
+ true
+ src/main/java/com/avaje/ebean/overview.html
+
+
+
+ attach-javadocs
+
+ jar
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
+
+
+
diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java
index 151a0b899..ca813ae14 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java
@@ -223,6 +223,15 @@ public final class BindParams implements Serializable {
return p;
}
+ /**
+ * Set a named In parameter that is multi-valued.
+ */
+ public Param setArrayParameter(String name, Collection> value) {
+ Param p = getParam(name);
+ p.setInValue(new MultiValueWrapper(value));
+ return p;
+ }
+
/**
* Set an encryption key as a bind value.
*
diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java
index 3f2e97893..222f00b9a 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java
@@ -24,6 +24,7 @@ import io.ebeaninternal.server.querydefn.OrmUpdateProperties;
import io.ebeaninternal.server.rawsql.SpiRawSql;
import java.sql.Timestamp;
+import java.util.Collection;
import java.util.List;
import java.util.Set;
@@ -399,6 +400,11 @@ public interface SpiQuery extends Query, SpiQueryFetch, TxnProfileEventCod
List getSoftDeletePredicates();
+ /**
+ * Bind the named multi-value array parameter which we would use with Postgres ANY.
+ */
+ void setArrayParameter(String name, Collection> values);
+
/**
* Return a copy of the query.
*/
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java
index 8f66ae6eb..756c5665f 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java
@@ -331,6 +331,12 @@ public final class DefaultSqlUpdate implements Serializable, SpiSqlUpdate {
return this;
}
+ @Override
+ public SqlUpdate setArrayParameter(String name, Collection> values) {
+ bindParams.setArrayParameter(name, values);
+ return this;
+ }
+
@Override
public SqlUpdate setNull(String name, int jdbcType) {
bindParams.setNullParameter(name, jdbcType);
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java
index 77651c53a..396170c63 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java
@@ -217,6 +217,11 @@ public final class PersistRequestBean extends PersistRequest implements BeanP
return beanDescriptor.docStoreMode(type, txnMode);
}
+ @Override
+ public boolean isCascade() {
+ return Flags.isRecurse(flags);
+ }
+
/**
* Return true if the draftDirty property should be set to true for this request.
*/
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java
index 325213933..eba1eea95 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java
@@ -208,6 +208,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType {
private final EntityBean prototypeEntityBean;
private final IdBinder idBinder;
+ private final String idSelect;
private String idBinderInLHSSql;
private String idBinderIdSql;
private String deleteByIdSql;
@@ -349,6 +350,23 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType {
propertiesIndex[i] = propMap.get(ebi.getProperty(i));
}
}
+ idSelect = initIdSelect();
+ }
+
+ String initIdSelect() {
+ if (idProperty != null && !idProperty.name().equals("_idClass")) {
+ return idProperty.name();
+ } else if (entityType == EntityType.EMBEDDED) {
+ return null;
+ } else {
+ StringJoiner sj = new StringJoiner(",");
+ for (BeanProperty prop : propertiesNonMany) {
+ if (prop.isImportedPrimaryKey()) {
+ sj.add(prop.name());
+ }
+ }
+ return sj.toString().intern();
+ }
}
public boolean isJacksonCorePresent() {
@@ -3011,6 +3029,10 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType {
return idProperty;
}
+ public String idSelect() {
+ return idSelect;
+ }
+
/**
* Return true if this bean should be inserted rather than updated.
*
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java
index c69fbb265..938a4c3d4 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java
@@ -23,6 +23,11 @@ abstract class BeanDescriptorElement extends BeanDescriptor {
this.elementHelp = elementHelp;
}
+ @Override
+ String initIdSelect() {
+ return null;
+ }
+
private String shortName(String name) {
int pos = name.lastIndexOf('.');
if (pos > 1) {
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java
index 5776b7ccc..7f6c3d96e 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdEmbedded.java
@@ -35,8 +35,7 @@ public final class ImportedIdEmbedded implements ImportedId {
BeanProperty[] embeddedProps = foreignAssocOne.properties();
for (int i = 0; i < imported.length; i++) {
String n = name + "." + foreignAssocOne.name() + "." + embeddedProps[i].name();
- BeanFkeyProperty fkey = new BeanFkeyProperty(n, imported[i].localDbColumn, foreignAssocOne.deployOrder());
- owner.descriptor().add(fkey);
+ owner.descriptor().add(new BeanFkeyProperty(n, imported[i].localDbColumn, foreignAssocOne.deployOrder()));
}
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java
index df4c3272c..fe3e8ce2e 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/id/ImportedIdSimple.java
@@ -88,8 +88,7 @@ public final class ImportedIdSimple implements ImportedId, Comparable type = prop.getPropertyType();
- ScalarType> scalarType = typeManager.getArrayScalarType(type, dbArray, prop.getGenericType(), prop.isNullable());
+ ScalarType> scalarType = typeManager.getArrayScalarType(type, prop.getGenericType(), prop.isNullable());
if (scalarType == null) {
throw new RuntimeException("No ScalarType for @DbArray type for [" + prop.getFullBeanName() + "]");
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineManyType.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DetermineManyType.java
similarity index 67%
rename from ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineManyType.java
rename to ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DetermineManyType.java
index fc1859074..40fc6016b 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/DetermineManyType.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/parse/DetermineManyType.java
@@ -1,4 +1,6 @@
-package io.ebeaninternal.server.deploy;
+package io.ebeaninternal.server.deploy.parse;
+
+import io.ebeaninternal.server.deploy.ManyType;
import java.util.List;
import java.util.Map;
@@ -7,9 +9,9 @@ import java.util.Set;
/**
* Determine the Many Type for a property.
*/
-public final class DetermineManyType {
+final class DetermineManyType {
- public ManyType getManyType(Class> type) {
+ ManyType getManyType(Class> type) {
if (type.equals(List.class)) {
return ManyType.LIST;
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java
index f3cced766..0632e89f2 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaBuilder.java
@@ -37,8 +37,7 @@ final class DtoMetaBuilder {
if (includeMethod(method)) {
try {
final String name = propertyName(method.getName());
- final Class> propertyType = propertyType(method);
- properties.add(new DtoMetaProperty(typeManager, dtoType, method, name, propertyType));
+ properties.add(new DtoMetaProperty(typeManager, dtoType, method, name));
} catch (Exception e) {
CoreLog.log.debug("exclude on " + dtoType + " method " + method, e);
}
@@ -46,10 +45,6 @@ final class DtoMetaBuilder {
}
}
- static Class> propertyType(Method method) {
- return method.getParameterTypes()[0];
- }
-
static String propertyName(String methodName) {
final String name = methodName.substring(3);
return Character.toLowerCase(name.charAt(0)) + name.substring(1);
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java
index fe7d794a1..b73500434 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/dto/DtoMetaProperty.java
@@ -8,6 +8,7 @@ import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Method;
+import java.lang.reflect.Type;
import java.sql.SQLException;
final class DtoMetaProperty implements DtoReadSet {
@@ -19,18 +20,30 @@ final class DtoMetaProperty implements DtoReadSet {
private final MethodHandle setter;
private final ScalarType> scalarType;
- DtoMetaProperty(TypeManager typeManager, Class> dtoType, Method writeMethod, String name, Class> propertyType) throws IllegalAccessException, NoSuchMethodException {
+ DtoMetaProperty(TypeManager typeManager, Class> dtoType, Method writeMethod, String name) throws IllegalAccessException, NoSuchMethodException {
this.dtoType = dtoType;
this.name = name;
if (writeMethod != null) {
- this.setter = LOOKUP.findVirtual(dtoType, writeMethod.getName(), MethodType.methodType(void.class, propertyType));
- this.scalarType = typeManager.getScalarType(propertyType);
+ this.setter = lookupMethodHandle(dtoType, writeMethod);
+ this.scalarType = typeManager.getScalarType(propertyType(writeMethod), propertyClass(writeMethod));
} else {
this.scalarType = null;
this.setter = null;
}
}
+ private static MethodHandle lookupMethodHandle(Class> dtoType, Method method) throws NoSuchMethodException, IllegalAccessException {
+ return LOOKUP.findVirtual(dtoType, method.getName(), MethodType.methodType(method.getReturnType(), method.getParameterTypes()));
+ }
+
+ static Type propertyType(Method method) {
+ return method.getParameters()[0].getParameterizedType();
+ }
+
+ static Class> propertyClass(Method method) {
+ return method.getParameterTypes()[0];
+ }
+
String getName() {
return name;
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java
index 5b3c49aac..8120aa093 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java
@@ -14,6 +14,7 @@ import io.ebeaninternal.server.dto.DtoMappingRequest;
import io.ebeaninternal.server.dto.DtoQueryPlan;
import javax.annotation.Nullable;
+import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
@@ -148,6 +149,16 @@ public final class DefaultDtoQuery extends AbstractQuery implements SpiDtoQue
return this;
}
+ @Override
+ public DtoQuery setArrayParameter(String paramName, Collection> values) {
+ if (ormQuery != null) {
+ ormQuery.setArrayParameter(paramName, values);
+ } else {
+ bindParams.setArrayParameter(paramName, values);
+ }
+ return this;
+ }
+
@Override
public DtoQuery setParameters(Object... values) {
if (ormQuery != null) {
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java
index 908490080..307b2713c 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java
@@ -586,9 +586,9 @@ public final class DefaultOrmQuery extends AbstractQuery implements SpiQuery<
*/
@Override
public void setSelectId() {
- // clear select and fetch joins..
+ // clear select and fetch joins
detail.clear();
- select(beanDescriptor.idBinder().getIdProperty());
+ select(beanDescriptor.idSelect());
}
@Override
@@ -1586,6 +1586,17 @@ public final class DefaultOrmQuery extends AbstractQuery implements SpiQuery<
return this;
}
+ @Override
+ public void setArrayParameter(String name, Collection> values) {
+ if (namedParams != null) {
+ throw new IllegalStateException("setArrayParameter() not supported when EQL parsed query");
+ }
+ if (bindParams == null) {
+ bindParams = new BindParams();
+ }
+ bindParams.setArrayParameter(name, values);
+ }
+
@Override
public boolean checkPagingOrderBy() {
return orderById && !useDocStore;
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java
index f2c86bda9..8c0179a6c 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java
@@ -289,6 +289,18 @@ public final class DefaultTypeManager implements TypeManager {
return nativeMap.get(jdbcType);
}
+ @Override
+ public ScalarType> getScalarType(Type propertyType, Class> propertyClass) {
+ if (propertyType instanceof ParameterizedType) {
+ ParameterizedType pt = (ParameterizedType)propertyType;
+ Type rawType = pt.getRawType();
+ if (List.class == rawType || Set.class == rawType) {
+ return getArrayScalarType((Class>)rawType, propertyType, true);
+ }
+ }
+ return getScalarType(propertyClass);
+ }
+
/**
* This can return null if no matching ScalarType is found.
*/
@@ -327,7 +339,7 @@ public final class DefaultTypeManager implements TypeManager {
}
@Override
- public ScalarType> getArrayScalarType(Class> type, DbArray dbArray, Type genericType, boolean nullable) {
+ public ScalarType> getArrayScalarType(Class> type, Type genericType, boolean nullable) {
Type valueType = getValueType(genericType);
if (type.equals(List.class)) {
return getArrayScalarTypeList(valueType, nullable);
@@ -366,12 +378,10 @@ public final class DefaultTypeManager implements TypeManager {
Type genericType = prop.getGenericType();
boolean hasJacksonAnnotations = objectMapperPresent && checkJacksonAnnotations(prop);
- boolean keepSource = prop.getMutationDetection() == MutationDetection.SOURCE
- || (prop.getMutationDetection() == MutationDetection.DEFAULT && defaultJsonMutationDetection == MutationDetection.SOURCE);
if (type.equals(List.class)) {
DocPropertyType docType = getDocType(genericType);
if (!hasJacksonAnnotations && isValueTypeSimple(genericType)) {
- return ScalarTypeJsonList.typeFor(postgres, dbType, docType, prop.isNullable(), keepSource);
+ return ScalarTypeJsonList.typeFor(postgres, dbType, docType, prop.isNullable(), jsonManager.keepSource(prop));
} else {
return createJsonObjectMapperType(prop, dbType, docType);
}
@@ -379,14 +389,14 @@ public final class DefaultTypeManager implements TypeManager {
if (type.equals(Set.class)) {
DocPropertyType docType = getDocType(genericType);
if (!hasJacksonAnnotations && isValueTypeSimple(genericType)) {
- return ScalarTypeJsonSet.typeFor(postgres, dbType, docType, prop.isNullable(), keepSource);
+ return ScalarTypeJsonSet.typeFor(postgres, dbType, docType, prop.isNullable(), jsonManager.keepSource(prop));
} else {
return createJsonObjectMapperType(prop, dbType, docType);
}
}
if (type.equals(Map.class)) {
if (!hasJacksonAnnotations && isMapValueTypeObject(genericType)) {
- return ScalarTypeJsonMap.typeFor(postgres, dbType, keepSource);
+ return ScalarTypeJsonMap.typeFor(postgres, dbType, jsonManager.keepSource(prop));
} else {
return createJsonObjectMapperType(prop, dbType, DocPropertyType.OBJECT);
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java
index 97592fb34..ec0808f14 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java
@@ -19,8 +19,13 @@ final class JsonTrim {
for (int i = 0; i < len; i++) {
char c = json.charAt(i);
if (c == '\"') {
- if (!escaped) quoted = !quoted;
- else escaped = false;
+ if (!escaped) {
+ quoted = !quoted;
+ } else {
+ escaped = false;
+ }
+ } else if (escaped) {
+ escaped = false;
} else if (quoted && c == '\\') {
escaped = true;
}
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java
index 6660a9f39..25034e409 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeJsonManager.java
@@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import io.ebean.ModifyAwareType;
import io.ebean.annotation.MutationDetection;
import io.ebean.config.dbplatform.DbPlatformType;
+import io.ebeaninternal.server.deploy.meta.DeployBeanProperty;
final class TypeJsonManager {
@@ -25,6 +26,17 @@ final class TypeJsonManager {
return objectMapper;
}
+ boolean keepSource(DeployBeanProperty prop) {
+ if (prop.getMutationDetection() == MutationDetection.SOURCE) {
+ return true;
+ } else if (prop.getMutationDetection() == MutationDetection.DEFAULT) {
+ prop.setMutationDetection(mutationDetection);
+ return mutationDetection == MutationDetection.SOURCE;
+ } else {
+ return false;
+ }
+ }
+
String postgresType(int dbType) {
if (postgres) {
switch (dbType) {
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java
index 3a7071317..692e65681 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/TypeManager.java
@@ -47,6 +47,13 @@ public interface TypeManager {
*/
ScalarType> getScalarType(Class> type, int jdbcType);
+ /**
+ * Find and return the ScalarType taking into account the property type with generics.
+ *
+ * For example Array based ScalarType for types like {@code List}.
+ */
+ ScalarType> getScalarType(Type propertyType, Class> type);
+
/**
* Create a ScalarType for an Enum using a mapping (rather than JPA Ordinal
* or String which has limitations).
@@ -64,7 +71,7 @@ public interface TypeManager {
/**
* Return the ScalarType used to handle DB ARRAY.
*/
- ScalarType> getArrayScalarType(Class> type, DbArray dbArray, Type genericType, boolean nullable);
+ ScalarType> getArrayScalarType(Class> type, Type genericType, boolean nullable);
/**
* Return the ScalarType used to handle HSTORE (Map).
diff --git a/ebean-ddl-generator/pom.xml b/ebean-ddl-generator/pom.xml
index 86708a1b6..4a189ed69 100644
--- a/ebean-ddl-generator/pom.xml
+++ b/ebean-ddl-generator/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
ebean ddl generation
@@ -28,14 +28,14 @@
io.ebean
ebean-core-type
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
provided
io.ebean
ebean-core
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
provided
diff --git a/ebean-ddl-generator/pom.xml.releaseBackup b/ebean-ddl-generator/pom.xml.releaseBackup
new file mode 100644
index 000000000..fc0e83a5f
--- /dev/null
+++ b/ebean-ddl-generator/pom.xml.releaseBackup
@@ -0,0 +1,106 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ ebean ddl generation
+ DDL and DB Migration generation
+ ebean-ddl-generator
+
+
+
+
+ io.ebean
+ ebean-ddl-runner
+ 1.2
+
+
+
+ io.ebean
+ ebean-migration
+ 12.12.1
+
+
+
+ io.ebean
+ ebean-core-type
+ 12.13.2-SNAPSHOT
+ provided
+
+
+
+ io.ebean
+ ebean-core
+ 12.13.2-SNAPSHOT
+ provided
+
+
+
+
+ org.glassfish.jaxb
+ jaxb-runtime
+ 2.3.2
+ provided
+
+
+
+
+ io.avaje
+ junit
+ 1.0
+ test
+
+
+
+ io.ebean
+ ebean-datasource
+ ${ebean-datasource.version}
+ test
+
+
+
+ javax.validation
+ validation-api
+ 2.0.1.Final
+ test
+
+
+
+
+
+
+
+ io.ebean
+ ebean-maven-plugin
+ ${ebean-maven-plugin.version}
+
+
+ test
+ process-test-classes
+
+ debug=0
+
+
+ testEnhance
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
diff --git a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/ClickHouseDbArray.java b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/ClickHouseDbArray.java
index ec141d7f0..0bb2f7895 100644
--- a/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/ClickHouseDbArray.java
+++ b/ebean-ddl-generator/src/main/java/io/ebeaninternal/dbmigration/ddlgeneration/platform/ClickHouseDbArray.java
@@ -14,6 +14,7 @@ class ClickHouseDbArray {
mapping.put("varchar[]", "Array(String)");
mapping.put("integer[]", "Array(UInt32)");
mapping.put("bigint[]", "Array(UInt64)");
+ mapping.put("float[]", "Array(Float32)");
}
/**
@@ -21,6 +22,10 @@ class ClickHouseDbArray {
*/
static String logicalToNative(String logicalArrayType) {
int colonPos = logicalArrayType.indexOf(':');
+ int bracketPos = logicalArrayType.indexOf('(');
+ if (bracketPos > -1 && (bracketPos < colonPos || colonPos == -1)) {
+ colonPos = bracketPos;
+ }
if (colonPos > -1) {
logicalArrayType = logicalArrayType.substring(0, colonPos);
}
diff --git a/ebean-externalmapping-api/pom.xml b/ebean-externalmapping-api/pom.xml
index 0834f5b86..0566534a9 100644
--- a/ebean-externalmapping-api/pom.xml
+++ b/ebean-externalmapping-api/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
ebean external mapping api
diff --git a/ebean-externalmapping-api/pom.xml.releaseBackup b/ebean-externalmapping-api/pom.xml.releaseBackup
new file mode 100644
index 000000000..72278f50b
--- /dev/null
+++ b/ebean-externalmapping-api/pom.xml.releaseBackup
@@ -0,0 +1,30 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ ebean external mapping api
+ API for mapping external named queries
+ ebean-externalmapping-api
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
+
diff --git a/ebean-externalmapping-xml/pom.xml b/ebean-externalmapping-xml/pom.xml
index 3bf48bffe..5a651b9dc 100644
--- a/ebean-externalmapping-xml/pom.xml
+++ b/ebean-externalmapping-xml/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
@@ -13,8 +13,8 @@
- scm:git:git@github.com:FOCONIS/ebean.git
- ebean-parent-12.13.1-FOC1
+ scm:git:git@github.com:ebean-orm/ebean.git
+ HEAD
ebean external mapping xml
@@ -33,7 +33,7 @@
io.ebean
ebean-externalmapping-api
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
@@ -59,14 +59,14 @@
io.ebean
ebean-core
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
io.ebean
ebean-ddl-generator
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
diff --git a/ebean-externalmapping-xml/pom.xml.releaseBackup b/ebean-externalmapping-xml/pom.xml.releaseBackup
new file mode 100644
index 000000000..8155aa728
--- /dev/null
+++ b/ebean-externalmapping-xml/pom.xml.releaseBackup
@@ -0,0 +1,100 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+
+
+
+
+
+
+ scm:git:git@github.com:ebean-orm/ebean.git
+ HEAD
+
+
+ ebean external mapping xml
+ XML implementation for mapping external named queries
+ ebean-externalmapping-xml
+
+
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.30
+ provided
+
+
+
+ io.ebean
+ ebean-externalmapping-api
+ 12.13.2-SNAPSHOT
+
+
+
+ org.glassfish.jaxb
+ jaxb-runtime
+ 2.3.2
+
+
+
+ io.avaje
+ classpath-scanner
+ 6.2
+
+
+
+
+ io.ebean
+ ebean-datasource
+ ${ebean-datasource.version}
+ test
+
+
+
+ io.ebean
+ ebean-core
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ io.ebean
+ ebean-ddl-generator
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ io.avaje
+ junit
+ 1.0
+ test
+
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+
+ io.ebean.tile:enhancement:12.11.3
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
+
diff --git a/ebean-kotlin/pom.xml b/ebean-kotlin/pom.xml
new file mode 100644
index 000000000..22fafea6c
--- /dev/null
+++ b/ebean-kotlin/pom.xml
@@ -0,0 +1,104 @@
+
+
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+ 4.0.0
+
+ ebean-kotlin
+
+
+ 1.8
+ 1.8
+ 12.13.0
+ 1.6.0
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+ ${kotlin.version}
+ provided
+
+
+
+ io.ebean
+ ebean-core
+ 12.13.2-SNAPSHOT
+ provided
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-test
+ ${kotlin.version}
+ test
+
+
+
+ io.avaje
+ junit
+ 1.0
+ test
+
+
+
+ io.ebean
+ ebean-test
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+
+
+
+ ${project.basedir}/src/main/kotlin
+ ${project.basedir}/src/test/kotlin
+
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-plugin
+ ${kotlin.version}
+
+ 1.8
+
+
+
+ compile
+
+ compile
+
+
+
+ test-compile
+
+ test-compile
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.ebean.tile:enhancement:12.13.1
+
+
+
+
+
+
+
+
diff --git a/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntity.kt b/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntity.kt
new file mode 100644
index 000000000..f1bc6d753
--- /dev/null
+++ b/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntity.kt
@@ -0,0 +1,18 @@
+package org.example.domain
+
+import io.ebean.Model
+import javax.persistence.Entity
+import javax.persistence.Id
+import javax.persistence.Version
+
+@Entity
+class FooEntity(name: String) : Model() {
+
+ @Id
+ var id: Long = 0
+
+ var name: String = name
+
+ @Version
+ var version: Long = 0
+}
diff --git a/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntityTest.kt b/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntityTest.kt
new file mode 100644
index 000000000..ef94f3b48
--- /dev/null
+++ b/ebean-kotlin/src/test/kotlin/org/example/domain/FooEntityTest.kt
@@ -0,0 +1,21 @@
+package org.example.domain
+
+import io.ebean.DB
+import org.assertj.core.api.Assertions.assertThat
+import org.junit.jupiter.api.Test
+
+class FooEntityTest {
+
+ @Test
+ fun iud() {
+
+ val foo = FooEntity("hello")
+ foo.save()
+
+ val found = DB.find(FooEntity::class.java, foo.id)
+ assertThat(found).isNotNull
+
+ found?.delete()
+
+ }
+}
diff --git a/ebean-kotlin/src/test/resources/application-test.yaml b/ebean-kotlin/src/test/resources/application-test.yaml
new file mode 100644
index 000000000..310638fcb
--- /dev/null
+++ b/ebean-kotlin/src/test/resources/application-test.yaml
@@ -0,0 +1,4 @@
+ebean:
+ test:
+ platform: h2
+
diff --git a/ebean-postgis/pom.xml b/ebean-postgis/pom.xml
index a04e1f401..0862a5696 100644
--- a/ebean-postgis/pom.xml
+++ b/ebean-postgis/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
ebean postgis
@@ -23,7 +23,7 @@
io.ebean
ebean-core
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
provided
@@ -74,7 +74,7 @@
io.ebean
ebean-test
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
diff --git a/ebean-postgis/pom.xml.releaseBackup b/ebean-postgis/pom.xml.releaseBackup
new file mode 100644
index 000000000..3d1fa16d0
--- /dev/null
+++ b/ebean-postgis/pom.xml.releaseBackup
@@ -0,0 +1,118 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ ebean postgis
+ ebean postgis module
+ https://ebean.io/
+
+ ebean-postgis
+
+
+ 2.2.1
+
+
+
+
+
+
+ io.ebean
+ ebean-core
+ 12.13.2-SNAPSHOT
+ provided
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ ${jackson.version}
+ true
+
+
+
+ net.postgis
+ postgis-jdbc
+ [${postgis.jdbc.version}]
+
+
+
+
+ org.postgresql
+ postgresql
+ 42.2.24
+ provided
+
+
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.30
+ provided
+
+
+
+
+ org.geolatte
+ geolatte-geom
+ 1.0.6
+ provided
+
+
+
+ io.ebean
+ ebean-datasource
+ ${ebean-datasource.version}
+ test
+
+
+
+ io.ebean
+ ebean-test
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ org.avaje.composite
+ logback
+ 1.1
+ test
+
+
+
+ io.avaje
+ junit
+ 1.0
+ test
+
+
+
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.ebean.tile:enhancement:12.11.3
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
+
+
+
diff --git a/ebean-querybean/pom.xml b/ebean-querybean/pom.xml
index 2ade3c32d..a6e2507d7 100644
--- a/ebean-querybean/pom.xml
+++ b/ebean-querybean/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
ebean querybean
@@ -17,7 +17,7 @@
io.ebean
ebean-core
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
provided
@@ -56,21 +56,21 @@
io.ebean
ebean-ddl-generator
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
io.ebean
querybean-generator
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
io.ebean
ebean-test
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
diff --git a/ebean-querybean/pom.xml.releaseBackup b/ebean-querybean/pom.xml.releaseBackup
new file mode 100644
index 000000000..5ed7e1669
--- /dev/null
+++ b/ebean-querybean/pom.xml.releaseBackup
@@ -0,0 +1,112 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ ebean querybean
+ Ebean querybean support
+ ebean-querybean
+
+
+
+
+
+ io.ebean
+ ebean-core
+ 12.13.2-SNAPSHOT
+ provided
+
+
+
+
+ io.avaje
+ avaje-lang
+ 1.0
+
+
+
+ joda-time
+ joda-time
+ 1.6
+ true
+
+
+
+ javax.validation
+ validation-api
+ 2.0.1.Final
+ true
+
+
+
+
+ io.ebean
+ ebean-datasource
+ ${ebean-datasource.version}
+ test
+
+
+
+ io.ebean
+ ebean-ddl-generator
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ io.ebean
+ querybean-generator
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ io.ebean
+ ebean-test
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ io.avaje
+ junit
+ 1.0
+ test
+
+
+
+ org.avaje.composite
+ logback
+ 1.1
+ test
+
+
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.ebean.tile:enhancement:12.11.3
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
+
+
diff --git a/ebean-redis/pom.xml b/ebean-redis/pom.xml
index f018334c4..dca810bd2 100644
--- a/ebean-redis/pom.xml
+++ b/ebean-redis/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
ebean-redis
@@ -22,35 +22,35 @@
io.ebean
ebean-api
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
provided
io.ebean
ebean-core
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
provided
io.ebean
ebean-querybean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
io.ebean
querybean-generator
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
io.ebean
ebean-test
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
diff --git a/ebean-redis/pom.xml.releaseBackup b/ebean-redis/pom.xml.releaseBackup
new file mode 100644
index 000000000..7ada5696b
--- /dev/null
+++ b/ebean-redis/pom.xml.releaseBackup
@@ -0,0 +1,93 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ ebean-redis
+ ebean redis
+ Ebean Redis L2 Cache
+
+
+
+
+ redis.clients
+ jedis
+ 3.6.3
+
+
+
+ io.ebean
+ ebean-api
+ 12.13.2-SNAPSHOT
+ provided
+
+
+
+ io.ebean
+ ebean-core
+ 12.13.2-SNAPSHOT
+ provided
+
+
+
+ io.ebean
+ ebean-querybean
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ io.ebean
+ querybean-generator
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ io.ebean
+ ebean-test
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ io.avaje
+ junit
+ 1.0
+ test
+
+
+
+ org.avaje.composite
+ logback
+ 1.1
+ test
+
+
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.ebean.tile:enhancement:12.11.3
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
+
+
+
diff --git a/ebean-test/pom.xml b/ebean-test/pom.xml
index a4cd127e4..af698ce97 100644
--- a/ebean-test/pom.xml
+++ b/ebean-test/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
ebean test
@@ -29,14 +29,14 @@
io.ebean
ebean-core
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
provided
io.ebean
ebean-ddl-generator
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
diff --git a/ebean-test/pom.xml.releaseBackup b/ebean-test/pom.xml.releaseBackup
new file mode 100644
index 000000000..b015a4544
--- /dev/null
+++ b/ebean-test/pom.xml.releaseBackup
@@ -0,0 +1,261 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ ebean test
+ Testing support for Ebean
+ ebean-test
+
+
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.30
+ provided
+
+
+
+ io.ebean
+ ebean-datasource
+ ${ebean-datasource.version}
+
+
+
+ io.ebean
+ ebean-core
+ 12.13.2-SNAPSHOT
+ provided
+
+
+
+ io.ebean
+ ebean-ddl-generator
+ 12.13.2-SNAPSHOT
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+ true
+
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+ ${jackson.version}
+ true
+
+
+
+ io.ebean
+ ebean-test-docker
+ 4.3
+
+
+
+ org.assertj
+ assertj-core
+ 3.14.0
+
+
+
+
+ org.glassfish.jaxb
+ jaxb-runtime
+ 2.3.2
+
+
+
+
+ com.h2database
+ h2
+ 1.4.199
+
+
+
+
+
+ io.avaje
+ avaje-jsr305
+ 1.1
+ test
+
+
+
+ io.ebean
+ ebean-migration
+ 12.12.1
+ test
+
+
+
+ io.avaje
+ mod-uuid
+ 1.1
+ test
+
+
+
+ javax.transaction
+ jta
+ 1.1
+ test
+
+
+
+
+ javax.validation
+ validation-api
+ 2.0.1.Final
+ test
+
+
+
+ jakarta.validation
+ jakarta.validation-api
+ 3.0.0
+ test
+
+
+
+ joda-time
+ joda-time
+ 2.9.7
+ test
+
+
+
+ javax.annotation
+ javax.annotation-api
+ 1.3.2
+ test
+
+
+ commons-io
+ commons-io
+ 2.7
+ test
+
+
+
+ org.postgresql
+ postgresql
+ 42.2.24
+
+
+ org.checkerframework
+ checker-qual
+
+
+ test
+
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+ 9.4.0.jre8
+ test
+
+
+
+ mysql
+ mysql-connector-java
+ 8.0.26
+ test
+
+
+
+ org.mariadb.jdbc
+ mariadb-java-client
+ 2.6.0
+ test
+
+
+
+ com.sap.cloud.db.jdbc
+ ngdbc
+ 2.3.48
+ test
+
+
+
+ com.oracle.database.jdbc
+
+ ojdbc8
+ 19.12.0.0
+ test
+
+
+
+ com.ibm.db2
+ jcc
+ 11.5.6.0
+ test
+
+
+
+ org.xerial
+ sqlite-jdbc
+ 3.36.0.3
+ test
+
+
+
+ com.nuodb.jdbc
+ nuodb-jdbc
+ 22.0.0
+ test
+
+
+
+ ru.yandex.clickhouse
+ clickhouse-jdbc
+ 0.3.1-patch
+ test
+
+
+
+ ch.qos.logback
+ logback-classic
+ 1.2.3
+ test
+
+
+
+ io.avaje
+ junit
+ 1.0
+ test
+
+
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.ebean.tile:enhancement:12.11.3
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
+
+
diff --git a/ebean-test/src/test/java/io/ebean/DtoQueryTest.java b/ebean-test/src/test/java/io/ebean/DtoQueryTest.java
index 53b2b4ca4..f41928909 100644
--- a/ebean-test/src/test/java/io/ebean/DtoQueryTest.java
+++ b/ebean-test/src/test/java/io/ebean/DtoQueryTest.java
@@ -208,19 +208,33 @@ public class DtoQueryTest extends BaseTestCase {
ResetBasicData.reset();
+ LoggedSql.start();
List ids = Arrays.asList(1, 2);
- List list = server().findDto(DCust.class, "select id, name from o_customer where id = any(?)")
+ List list = DB.findDto(DCust.class, "select id, name from o_customer where id = any(?)")
.setParameter(ids)
.findList();
assertThat(list).isNotEmpty();
- list = server().findDto(DCust.class, "select id, name from o_customer where id in (:idList)")
+ List list1 = DB.findDto(DCust.class, "select id, name from o_customer where id in (:idList)")
.setParameter("idList", ids)
.findList();
- assertThat(list).isNotEmpty();
+ assertThat(list1).isNotEmpty();
+
+
+ List list2 = DB.findDto(DCust.class, "select id, name from o_customer where id = any(:idList)")
+ .setArrayParameter("idList", ids)
+ .findList();
+
+ assertThat(list2).isNotEmpty();
+
+ List sql = LoggedSql.stop();
+ assertThat(sql).hasSize(3);
+ assertThat(sql.get(0)).contains(" id = any(?)");
+ assertThat(sql.get(1)).contains(" id in (?,?)");
+ assertThat(sql.get(2)).contains(" id = any(?)");
}
@ForPlatform(Platform.POSTGRES)
diff --git a/ebean-test/src/test/java/io/ebeaninternal/server/dto/DtoMetaBuilderTest.java b/ebean-test/src/test/java/io/ebeaninternal/server/dto/DtoMetaBuilderTest.java
index 3d476132c..bd75d835c 100644
--- a/ebean-test/src/test/java/io/ebeaninternal/server/dto/DtoMetaBuilderTest.java
+++ b/ebean-test/src/test/java/io/ebeaninternal/server/dto/DtoMetaBuilderTest.java
@@ -34,8 +34,10 @@ public class DtoMetaBuilderTest {
Map methods = getIncludedMethodsFor(D0.class);
assertThat(methods).hasSize(2);
- assertThat(DtoMetaBuilder.propertyType(methods.get("setName"))).isEqualTo(String.class);
- assertThat(DtoMetaBuilder.propertyType(methods.get("setId"))).isEqualTo(long.class);
+ assertThat(DtoMetaProperty.propertyClass(methods.get("setName"))).isEqualTo(String.class);
+ assertThat(DtoMetaProperty.propertyClass(methods.get("setId"))).isEqualTo(long.class);
+ assertThat(DtoMetaProperty.propertyType(methods.get("setName"))).isEqualTo(String.class);
+ assertThat(DtoMetaProperty.propertyType(methods.get("setId"))).isEqualTo(long.class);
}
@Test
diff --git a/ebean-test/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java b/ebean-test/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java
index 3762cd51b..3c3055151 100644
--- a/ebean-test/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java
+++ b/ebean-test/src/test/java/io/ebeaninternal/server/profile/BasicProfileLocationTest.java
@@ -5,25 +5,32 @@ import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
-public class BasicProfileLocationTest {
+class BasicProfileLocationTest {
@Test
- public void obtain() {
+ void obtain() {
DProfileLocation loc = new DTimedProfileLocation(12, "foo", MetricFactory.get().createTimedMetric("junk"));
+ String javaVersion = System.getProperty("java.version");
assertThat(loc.obtain()).isTrue();
- assertThat(loc.fullLocation()).endsWith(":12)");
- if (System.getProperty("java.version").startsWith("1.8")) {
+ if (javaVersion.startsWith("1.8")) {
+ assertThat(loc.fullLocation()).endsWith("invoke0(Native Method:12)");
assertThat(loc.location()).isEqualTo("sun.reflect.NativeMethodAccessorImpl.invoke0");
+ assertThat(loc.label()).isEqualTo("NativeMethodAccessorImpl.invoke0");
+ } else if (javaVersion.startsWith("18")){
+ assertThat(loc.fullLocation()).endsWith("jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)");
+ assertThat(loc.location()).isEqualTo("java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke");
+ assertThat(loc.label()).isEqualTo("DirectMethodHandleAccessor.invoke");
} else {
+ assertThat(loc.fullLocation()).endsWith("jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method:12)");
assertThat(loc.location()).isEqualTo("java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0");
+ assertThat(loc.label()).isEqualTo("NativeMethodAccessorImpl.invoke0");
}
- assertThat(loc.label()).isEqualTo("NativeMethodAccessorImpl.invoke0");
}
@Test
- public void basic_trimPackage() {
+ void basic_trimPackage() {
BasicProfileLocation loc = new BasicProfileLocation("com.foo.Bar.all");
assertThat(loc.obtain()).isFalse();
@@ -33,7 +40,7 @@ public class BasicProfileLocationTest {
}
@Test
- public void basic_trimSinglePackage() {
+ void basic_trimSinglePackage() {
BasicProfileLocation loc = new BasicProfileLocation("foo.Bar.all");
assertThat(loc.obtain()).isFalse();
diff --git a/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java b/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java
index c08ceeab7..27d1ad8f9 100644
--- a/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java
+++ b/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java
@@ -5,17 +5,59 @@ import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
-public class JsonTrimTest {
+class JsonTrimTest {
@Test
- public void trim_array() {
+ void trim_array() {
final String trimmed = JsonTrim.trim("[{\"name\": \"one\", \"along\": 1, \"timestamp\": 1629609021559}, {\"name\": \"two\", \"along\": 2, \"timestamp\": 1629609021559}]");
assertThat(trimmed).isEqualTo("[{\"name\":\"one\",\"along\":1,\"timestamp\":1629609021559},{\"name\":\"two\",\"along\":2,\"timestamp\":1629609021559}]");
}
@Test
- public void trim_object() {
+ void trim_object() {
final String trimmed = JsonTrim.trim("{\"name\": \"one\",\t \t \"along\": 1, \"timestamp\": 1629609021559}");
assertThat(trimmed).isEqualTo("{\"name\":\"one\",\"along\":1,\"timestamp\":1629609021559}");
}
+
+ @Test
+ void trim_object_embeddedEscapeSlash() {
+ final String trimmed = JsonTrim.trim("{\"a\": \"o\\nf\",\t \t \n \"b\": 1}");
+ assertThat(trimmed).isEqualTo("{\"a\":\"o\\nf\",\"b\":1}");
+ }
+
+ @Test
+ void trim_escapedTabNewLine() {
+ final String trimmed = JsonTrim.trim("{\"a\": \"o\\t\\nf\",\t \t \n \"b\": 1}");
+ assertThat(trimmed).isEqualTo("{\"a\":\"o\\t\\nf\",\"b\":1}");
+ }
+
+ @Test
+ void trim_leadingEscapedNewLine() {
+ final String trimmed = JsonTrim.trim("{\"a\": \"\\no\\t\\nf\\n\",\t \t \n \"b\": 1}");
+ assertThat(trimmed).isEqualTo("{\"a\":\"\\no\\t\\nf\\n\",\"b\":1}");
+ }
+
+ @Test
+ void trim_trailingEscapedNewLine() {
+ final String trimmed = JsonTrim.trim("{\"a\": \"o\\t\\nf\\n\",\t \t \n \"b\": 1}");
+ assertThat(trimmed).isEqualTo("{\"a\":\"o\\t\\nf\\n\",\"b\":1}");
+ }
+
+ @Test
+ void trim_trailingEscapedSlash() {
+ final String trimmed = JsonTrim.trim("{\"a\": \"o\\t\\nf\\\\\",\t \t \n \"b\": 1}");
+ assertThat(trimmed).isEqualTo("{\"a\":\"o\\t\\nf\\\\\",\"b\":1}");
+ }
+
+ @Test
+ void trim_object_embeddedEscaped() {
+ final String trimmed = JsonTrim.trim("{\"name\": \"one\nfoo\nbar\\bazz\tboo\",\t \t \n \"along\": 1}");
+ assertThat(trimmed).isEqualTo("{\"name\":\"one\nfoo\nbar\\bazz\tboo\",\"along\":1}");
+ }
+
+ @Test
+ void trim_escaped() {
+ final String trimmed = JsonTrim.trim(" \t \n {\"a\": \n \"\\t1\\t2\\n3\\\\\",\t \n \"b\": \"\\t1\\t2\\n3\\\\\" , \t \n \"c\": \"\\t1\\t2\\n3\\\\\" \t \n }");
+ assertThat(trimmed).isEqualTo("{\"a\":\"\\t1\\t2\\n3\\\\\",\"b\":\"\\t1\\t2\\n3\\\\\",\"c\":\"\\t1\\t2\\n3\\\\\"}");
+ }
}
diff --git a/ebean-test/src/test/java/org/tests/basic/TestLoadBeanCache.java b/ebean-test/src/test/java/org/tests/basic/TestLoadBeanCache.java
index 47eb98793..a72f07264 100644
--- a/ebean-test/src/test/java/org/tests/basic/TestLoadBeanCache.java
+++ b/ebean-test/src/test/java/org/tests/basic/TestLoadBeanCache.java
@@ -13,13 +13,12 @@ import java.util.List;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.*;
-public class TestLoadBeanCache extends BaseTestCase {
+class TestLoadBeanCache extends BaseTestCase {
@Test
- public void testLoad() {
+ void testLoad() {
ResetBasicData.reset();
@@ -35,32 +34,29 @@ public class TestLoadBeanCache extends BaseTestCase {
// this will hit the cache
Country nz = DB.find(Country.class, "NZ");
- assertTrue(loadedNz == nz);
+ assertSame(loadedNz, nz);
}
-
+
@Test
- public void testLoadWithFindMap() {
+ void testLoadWithFindMap() {
ResetBasicData.reset();
-
+
List ids = DB.find(Customer.class).findIds();
- assertEquals(ids.size(), 4);
+ assertThat(ids).isNotEmpty();
DB.getDefault().pluginApi().cacheManager().clearAll();
-
+
// hit database
LoggedSql.start();
DB.find(Customer.class).where().idIn(ids).findMap();
List sql = LoggedSql.stop();
assertThat(sql).hasSize(1);
-
+
// hit beanCache
LoggedSql.start();
DB.find(Customer.class).where().idIn(ids).findMap();
sql = LoggedSql.stop();
assertThat(sql).hasSize(0);
-
}
-
-
}
diff --git a/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java b/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java
index 54f26782e..c67e63c4a 100644
--- a/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java
+++ b/ebean-test/src/test/java/org/tests/basic/event/TestPreInsertValidation.java
@@ -5,13 +5,15 @@ import io.ebean.BaseTestCase;
import io.ebean.DB;
import org.junit.jupiter.api.Test;
import org.tests.model.basic.TWithPreInsert;
+import org.tests.model.basic.TWithPreInsertChild;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertNotNull;
-public class TestPreInsertValidation extends BaseTestCase {
+class TestPreInsertValidation extends BaseTestCase {
@Test
- public void test() {
+ void test() {
TWithPreInsert e = new TWithPreInsert();
e.setTitle("Mister");
@@ -22,15 +24,45 @@ public class TestPreInsertValidation extends BaseTestCase {
// the save worked and name set in preInsert
assertNotNull(e.getId());
assertNotNull(e.getName());
+ assertThat(e.requestCascadeState()).isEqualTo(2);
TWithPreInsert e1 = DB.find(TWithPreInsert.class, e.getId());
e1.setTitle("Missus");
DB.save(e1);
+
+ assertThat(e1.requestCascadeState()).isEqualTo(12);
}
@Test
- public void testStatelessUpdate() {
+ void test_cascade() {
+
+ TWithPreInsert e = new TWithPreInsert();
+ e.setTitle("ParentCascading");
+ e.children().add(new TWithPreInsertChild("Child0"));
+ // the perInsert should populate the
+ // name with should not be null
+ DB.save(e);
+
+ // the save worked and name set in preInsert
+ assertNotNull(e.getId());
+ assertNotNull(e.getName());
+ assertThat(e.requestCascadeState()).isEqualTo(2);
+ assertThat(e.children().get(0).requestCascadeState()).isEqualTo(1);
+
+ TWithPreInsert e1 = DB.find(TWithPreInsert.class, e.getId());
+ assert e1 != null;
+
+ e1.setTitle("ParentCascading-changed");
+ e1.children().get(0).setName("Child0-changed");
+ DB.save(e1);
+
+ assertThat(e1.requestCascadeState()).isEqualTo(12);
+ assertThat(e1.children().get(0).requestCascadeState()).isEqualTo(11);
+ }
+
+ @Test
+ void testStatelessUpdate() {
TWithPreInsert e = new TWithPreInsert();
e.setName("BeanForUpdateTest");
diff --git a/ebean-test/src/test/java/org/tests/json/TestJsonSourceDefault.java b/ebean-test/src/test/java/org/tests/json/TestJsonSourceDefault.java
new file mode 100644
index 000000000..9a2d5d6ca
--- /dev/null
+++ b/ebean-test/src/test/java/org/tests/json/TestJsonSourceDefault.java
@@ -0,0 +1,63 @@
+package org.tests.json;
+
+import io.ebean.Database;
+import io.ebean.DatabaseFactory;
+import io.ebean.ValuePair;
+import io.ebean.annotation.ForPlatform;
+import io.ebean.annotation.MutationDetection;
+import io.ebean.annotation.Platform;
+import io.ebean.config.DatabaseConfig;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.tests.model.json.EBasicJsonList;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class TestJsonSourceDefault {
+
+ @Test
+ @ForPlatform(Platform.H2)
+ @Disabled
+ void testDirtyValues_diffSource() {
+ DatabaseConfig config = new DatabaseConfig();
+ config.getDataSourceConfig()
+ .setUsername("sa")
+ .setPassword("")
+ .setUrl("jdbc:h2:mem:testJsonSourceDirtyValues");
+
+ config.setName("jsonSource");
+ config.setDefaultServer(false);
+ config.setRegister(false);
+ config.setDdlGenerate(true);
+ config.setDdlRun(true);
+ config.setDdlExtra(false);
+ config.addClass(EBasicJsonList.class);
+ config.setJsonMutationDetection(MutationDetection.SOURCE);
+ Database db = DatabaseFactory.create(config);
+ try {
+ assertThat(db).isNotNull();
+
+ EBasicJsonList bean = new EBasicJsonList();
+ bean.getTags().add("aa");
+ bean.getTags().add("bb");
+
+ db.save(bean);
+ bean = db.find(EBasicJsonList.class, bean.getId());
+
+ bean.getTags().add("cc");
+ final Map dirtyValues = db.beanState(bean).dirtyValues();
+ assertThat(dirtyValues).containsOnlyKeys("tags");
+
+ final ValuePair diff = dirtyValues.get("tags");
+ assertThat(diff.getOldValue()).isInstanceOf(List.class).asList().containsExactly("aa", "bb");
+ assertThat(diff.getNewValue()).isInstanceOf(List.class).asList().containsExactly("aa", "bb", "cc");
+ } finally {
+ if (db != null) {
+ db.shutdown();
+ }
+ }
+ }
+}
diff --git a/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java b/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java
index 69328ce15..0a4b1a0fb 100644
--- a/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java
+++ b/ebean-test/src/test/java/org/tests/model/array/TestDbArray_basic.java
@@ -1,9 +1,6 @@
package org.tests.model.array;
-import io.ebean.BaseTestCase;
-import io.ebean.DB;
-import io.ebean.Query;
-import io.ebean.SqlRow;
+import io.ebean.*;
import io.ebean.annotation.ForPlatform;
import io.ebean.annotation.IgnorePlatform;
import io.ebean.annotation.Platform;
@@ -272,4 +269,123 @@ public class TestDbArray_basic extends BaseTestCase {
assertThat(found.getUids()).hasSameElementsAs(uids);
assertThat(found.getStatuses()).hasSameElementsAs(statuses);
}
+
+ @Test
+ @ForPlatform(Platform.POSTGRES)
+ public void asDto_withArray() {
+ DB.find(EArrayBean.class).delete();
+ bean.setName("array in dto test");
+
+ List phNumbers = bean.getPhoneNumbers();
+ phNumbers.add("4321");
+ phNumbers.add("9823");
+ List doubs = bean.getDoubs();
+ doubs.add(1.23);
+ doubs.add(4.56);
+ DB.save(bean);
+ // Data is saved correctly
+
+ LoggedSql.start();
+ DtoQuery query = DB.find(EArrayBean.class)
+ // Interestingly writing `select("id,name,phone_numbers,doubs")`
+ // generates `select t0.id, t0.name, t0.id, t0.doubs`
+ // surprisingly changing unknown property to id
+ .select("id,name,phoneNumbers,doubs")
+ .asDto(EArrayBeanDto.class)
+ // Shouldn't be necessary
+ // But without it I see error
+ // Unable to map DB column phone_numbers to a property with a setter method on class org.tests.model.array.TestDbArray_basic$EArrayBeanDto
+ .setRelaxedMode();
+
+ List dtos = query.findList();
+
+ List sql = LoggedSql.stop();
+ assertSql(sql.get(0)).contains("select t0.id, t0.name, t0.phone_numbers, t0.doubs");
+
+ for (EArrayBeanDto dto : dtos) {
+ assertThat(dto.id).isNotNull();
+ assertThat(dto.name).isNotNull();
+ // Failure: null
+ assertThat(dto.phoneNumbers).isNotNull();
+ // Failure: null
+ assertThat(dto.doubs).isNotNull();
+ }
+ }
+
+ @Test
+ @ForPlatform(Platform.POSTGRES)
+ public void sqlUpdate_withArray() {
+ DB.find(EArrayBean.class).delete();
+ bean.setName("array in sql update test");
+ DB.save(bean);
+ // Data is saved correctly
+ List phNumbers = new ArrayList<>();
+ phNumbers.add("4321");
+ phNumbers.add("9823");
+
+ LoggedSql.start();
+
+ // Positional param works
+ SqlUpdate update1 = DB.sqlUpdate("UPDATE earray_bean SET phone_numbers = ?")
+ .setParameter(1, phNumbers);
+ update1.execute();
+ System.out.println("done");
+
+ // Named param fails with
+ // javax.persistence.PersistenceException:
+ // ERROR: syntax error at or near "$2"
+ SqlUpdate update2 = DB.sqlUpdate("UPDATE earray_bean SET phone_numbers = :pns")
+ .setArrayParameter("pns", phNumbers);
+ update2.execute();
+
+ found = DB.find(EArrayBean.class, bean.getId());
+ System.out.println(found);
+ assertEquals("array in sql update test", found.getName());
+ assertThat(found.getPhoneNumbers()).containsExactly("4321", "9823");
+ }
+
+ public static class EArrayBeanDto {
+
+ Integer id;
+ List phoneNumbers;
+ List doubs;
+ String name;
+
+ @Override
+ public String toString() {
+ return "id:" + id + " name:" + name + " phoneNumbers:" + phoneNumbers + " doubs:" + doubs;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List getPhoneNumbers() {
+ return phoneNumbers;
+ }
+
+ public void setPhoneNumbers(List phoneNumbers) {
+ this.phoneNumbers = phoneNumbers;
+ }
+
+ public List getDoubs() {
+ return doubs;
+ }
+
+ public void setDoubs(List doubs) {
+ this.doubs = doubs;
+ }
+ }
}
diff --git a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java
index f93378240..21398bc7a 100644
--- a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java
+++ b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java
@@ -2,10 +2,15 @@ package org.tests.model.basic;
import javax.persistence.Entity;
import javax.persistence.Id;
+import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+
+import static javax.persistence.CascadeType.PERSIST;
@Entity
-public class TWithPreInsert {
+public class TWithPreInsert implements TWithPreInsertCommon {
@Id
private Integer id;
@@ -15,6 +20,14 @@ public class TWithPreInsert {
private String title;
+ @OneToMany(cascade = PERSIST)
+ private List children = new ArrayList<>();
+
+ /**
+ * For testing what happened in persist controller.
+ */
+ transient int requestCascadeState;
+
public Integer getId() {
return id;
}
@@ -39,4 +52,15 @@ public class TWithPreInsert {
this.title = title;
}
+ public List children() {
+ return children;
+ }
+
+ public int requestCascadeState() {
+ return requestCascadeState;
+ }
+
+ public void requestCascadeState(int requestCascadeState) {
+ this.requestCascadeState = requestCascadeState;
+ }
}
diff --git a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertChild.java b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertChild.java
new file mode 100644
index 000000000..39a1d8dff
--- /dev/null
+++ b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertChild.java
@@ -0,0 +1,58 @@
+package org.tests.model.basic;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.validation.constraints.NotNull;
+
+@Entity
+public class TWithPreInsertChild implements TWithPreInsertCommon {
+
+ @Id
+ private Integer id;
+
+ @NotNull
+ private String name;
+
+ private String title;
+
+ /**
+ * For testing what happened in persist controller.
+ */
+ transient int requestCascadeState;
+
+ public TWithPreInsertChild(String name) {
+ this.name = name;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public int requestCascadeState() {
+ return requestCascadeState;
+ }
+
+ public void requestCascadeState(int requestCascadeState) {
+ this.requestCascadeState = requestCascadeState;
+ }
+}
diff --git a/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertCommon.java b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertCommon.java
new file mode 100644
index 000000000..dc61e28ba
--- /dev/null
+++ b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertCommon.java
@@ -0,0 +1,14 @@
+package org.tests.model.basic;
+
+public interface TWithPreInsertCommon {
+
+ String getName();
+
+ void setName(String name);
+
+ String getTitle();
+
+ void setTitle(String title);
+
+ void requestCascadeState(int requestCascadeState);
+}
diff --git a/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java b/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java
index 41b6fe141..03143d385 100644
--- a/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java
+++ b/ebean-test/src/test/java/org/tests/model/basic/event/TWithPreInsertPersistAdapter.java
@@ -2,36 +2,33 @@ package org.tests.model.basic.event;
import io.ebean.event.BeanPersistAdapter;
import io.ebean.event.BeanPersistRequest;
-import org.tests.model.basic.TWithPreInsert;
+import org.tests.model.basic.TWithPreInsertCommon;
public class TWithPreInsertPersistAdapter extends BeanPersistAdapter {
@Override
public boolean isRegisterFor(Class> cls) {
- return TWithPreInsert.class.equals(cls);
+ return TWithPreInsertCommon.class.isAssignableFrom(cls);
}
@Override
public boolean preInsert(BeanPersistRequest> request) {
-
- TWithPreInsert e = (TWithPreInsert) request.bean();
- if (e.getName() == null) {
- e.setName("set on preInsert");
+ TWithPreInsertCommon bean = (TWithPreInsertCommon) request.bean();
+ if (bean.getName() == null) {
+ bean.setName("set on preInsert");
}
+ bean.requestCascadeState(request.isCascade() ? 1 : 2);
return true;
}
@Override
public boolean preUpdate(BeanPersistRequest> request) {
-
- TWithPreInsert b = (TWithPreInsert) request.bean();
- System.out.println("preUpdate - title is: " + b.getTitle());
- if (b.getTitle() == null) {
- b.setTitle("set on preUpdate");
+ TWithPreInsertCommon bean = (TWithPreInsertCommon) request.bean();
+ System.out.println("preUpdate - title is: " + bean.getTitle());
+ if (bean.getTitle() == null) {
+ bean.setTitle("set on preUpdate");
}
- // request.getEbeanServer().refresh(b);
- // System.out.println("title is Mister:"+b.getTitle());
-
+ bean.requestCascadeState(request.isCascade() ? 11 : 12);
return super.preUpdate(request);
}
diff --git a/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java b/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java
index 78952eb7a..2cedcc84d 100644
--- a/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java
+++ b/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java
@@ -6,18 +6,19 @@ import io.ebean.Transaction;
import io.ebean.test.LoggedSql;
import org.junit.jupiter.api.Test;
+import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
-public class TestIdClassScalar extends BaseTestCase {
+class TestIdClassScalar extends BaseTestCase {
- private BUser user = new BUser("Fiona");
- private BSite site = new BSite("avaje.io");
+ private final BUser user = new BUser("Fiona");
+ private final BSite site = new BSite("avaje.io");
@Test
- public void testBEmbId_equalsHashcode() {
+ void testBEmbId_equalsHashcode() {
BEmbId a = new BEmbId(UUID.randomUUID(), UUID.randomUUID());
BEmbId b = new BEmbId(a.getSiteId(), a.getUserId());
@@ -35,13 +36,11 @@ public class TestIdClassScalar extends BaseTestCase {
assertThat(a).isNotEqualTo(d);
assertThat(a.hashCode()).isNotEqualTo(d.hashCode());
-
assertThat(a.hashCode()).isEqualTo(a.otherHash());
-
}
@Test
- public void fetchMany() {
+ void fetchMany() {
UUID siteId = UUID.randomUUID();
UUID userId = UUID.randomUUID();
@@ -59,7 +58,7 @@ public class TestIdClassScalar extends BaseTestCase {
}
@Test
- public void insertBatch() {
+ void insertBatch() {
UUID siteId = UUID.randomUUID();
UUID userId = UUID.randomUUID();
@@ -81,11 +80,9 @@ public class TestIdClassScalar extends BaseTestCase {
}
@Test
- public void test() {
-
+ void test() {
DB.save(user);
DB.save(site);
-
insertUpdateBridgeD(user, site);
insertUpdateBridgeE(user, site);
}
@@ -94,7 +91,6 @@ public class TestIdClassScalar extends BaseTestCase {
* Test where matching by db column naming convention.
*/
private void insertUpdateBridgeD(BUser user, BSite site) {
-
LoggedSql.start();
BSiteUserD access = new BSiteUserD(BAccessLevel.ONE, site.id, user.id);
@@ -139,7 +135,6 @@ public class TestIdClassScalar extends BaseTestCase {
* Test where matching by db column naming convention.
*/
private void insertUpdateBridgeE(BUser user, BSite site) {
-
LoggedSql.start();
BSiteUserE access = new BSiteUserE(BAccessLevel.ONE, site, user);
@@ -181,4 +176,47 @@ public class TestIdClassScalar extends BaseTestCase {
assertSql(sql.get(1)).contains("update bsite_user_e set access_level=? where site_id=? and user_id=?");
}
+
+ @Test
+ void idClass_existsQuery() {
+ BUser user = new BUser("JunkUser2");
+ BSite site = new BSite("JunkSite2");
+ BSiteUserE access = new BSiteUserE(BAccessLevel.ONE, site, user);
+
+ DB.save(user);
+ DB.save(site);
+ DB.save(access);
+
+ boolean exists = DB.find(BSiteUserE.class)
+ .where().eq("user.id", user.id)
+ .exists();
+
+ assertThat(exists).isTrue();
+ assertThat(DB.find(BSiteUserE.class).where().eq("user.id", user.id).findCount()).isEqualTo(1);
+
+ DB.delete(access);
+ DB.deleteAll(Arrays.asList(user, site));
+ }
+
+ @Test
+ void idClass_existsQuery_scalarImportedProperties() {
+ BUser user = new BUser("JunkUser3");
+ BSite site = new BSite("JunkSite3");
+ DB.save(user);
+ DB.save(site);
+
+ BSiteUserD access = new BSiteUserD(BAccessLevel.ONE, site.id, user.id);
+ DB.save(access);
+
+ boolean exists = DB.find(BSiteUserD.class)
+ .where().eq("userId", user.id)
+ .exists();
+
+ assertThat(exists).isTrue();
+ assertThat(DB.find(BSiteUserD.class).where().eq("userId", user.id).findCount()).isEqualTo(1);
+
+ DB.delete(access);
+ DB.deleteAll(Arrays.asList(user, site));
+ }
+
}
diff --git a/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java b/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java
index 3f3f8342d..fa99f45da 100644
--- a/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java
+++ b/ebean-test/src/test/java/org/tests/model/elementcollection/TestElementCollectionBasicSet.java
@@ -10,11 +10,10 @@ import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
-public class TestElementCollectionBasicSet extends BaseTestCase {
+class TestElementCollectionBasicSet extends BaseTestCase {
@Test
- public void test() {
-
+ void test() {
LoggedSql.start();
EcsPerson person = new EcsPerson("Fiona021");
@@ -172,8 +171,7 @@ public class TestElementCollectionBasicSet extends BaseTestCase {
}
@Test
- public void json() {
-
+ void json() {
EcsPerson person = new EcsPerson("Fiona021");
person.getPhoneNumbers().add("021 1234");
person.getPhoneNumbers().add("021 4321");
diff --git a/ebean-test/src/test/resources/ebean.properties b/ebean-test/src/test/resources/ebean.properties
index fc154b2c8..402facaab 100644
--- a/ebean-test/src/test/resources/ebean.properties
+++ b/ebean-test/src/test/resources/ebean.properties
@@ -25,7 +25,7 @@ ebean.packages=org.tests,org.etest
datasource.default=h2
#datasource.h2.capturestacktrace=true
-ebean.dumpMetricsOnShutdown=true
+#ebean.dumpMetricsOnShutdown=true
ebean.dumpMetricsOptions=sql,hash,loc
#ebean.queryPlan.thresholdMicros=1000
ebean.queryPlan.enable=true
@@ -182,7 +182,7 @@ datasource.nuodb.url=jdbc:com.nuodb://localhost/testdb
#datasource.nuodb.driver=com.nuodb.jdbc.Driver
datasource.db2.username=unit
-datasource.db2.password=unit
+datasource.db2.password=test
datasource.db2.url=jdbc:db2://127.0.0.1:50000/unit
#datasource.db2.driver=com.ibm.db2.jcc.DB2Driver
diff --git a/ebean-test/testconfig/ebean-mariadb-10.3.properties b/ebean-test/testconfig/ebean-mariadb-10.3.properties
index c7ef279e4..082b4dbce 100644
--- a/ebean-test/testconfig/ebean-mariadb-10.3.properties
+++ b/ebean-test/testconfig/ebean-mariadb-10.3.properties
@@ -4,5 +4,5 @@ ebean.test.dbName=test_ebean
ebean.test.dbPassword=unit
ebean.test.mariadb.version=10.3
ebean.test.mariadb.containerName=ut_mariadb-10-3
-ebean.test.sqlserver.port = 7306
+ebean.test.mariadb.port=14308
datasource.default=mariadb-103
diff --git a/ebean-test/testconfig/ebean-mariadb.properties b/ebean-test/testconfig/ebean-mariadb.properties
index 165032895..a579e32bf 100644
--- a/ebean-test/testconfig/ebean-mariadb.properties
+++ b/ebean-test/testconfig/ebean-mariadb.properties
@@ -2,4 +2,5 @@ ebean.test.platform=mariadb
ebean.test.dbName=test_ebean
ebean.test.mariadb.version=10.6
ebean.test.mariadb.containerName=ut_mariadb-10-6
+ebean.test.mariadb.port=14307
datasource.default=mariadb-106
diff --git a/ebean-test/testconfig/ebean-mysql.properties b/ebean-test/testconfig/ebean-mysql.properties
index dfd960fd2..9539946a9 100644
--- a/ebean-test/testconfig/ebean-mysql.properties
+++ b/ebean-test/testconfig/ebean-mysql.properties
@@ -2,5 +2,5 @@
ebean.test.platform=mysql
ebean.test.dbName=test_ebean
# note: do not conflict with mariadb port
-ebean.test.sqlserver.port = 13306
+#ebean.test.mysql.port=4306
datasource.default=mysql-docker
diff --git a/ebean-test/testconfig/ebean-sqlserver17.properties b/ebean-test/testconfig/ebean-sqlserver17.properties
index 6da4dacc3..92efeb165 100644
--- a/ebean-test/testconfig/ebean-sqlserver17.properties
+++ b/ebean-test/testconfig/ebean-sqlserver17.properties
@@ -1,7 +1,10 @@
ebean.test.platform=sqlserver
ebean.test.dbName=test_ebean
ebean.test.sqlserver.version=2017-latest
-ebean.test.sqlserver.containerName=ut_sqlserver2017
-ebean.test.sqlserver.port=1434
+ebean.test.sqlserver.containerName=local_sqlserver2017
+ebean.test.sqlserver.collation=LATIN1_GENERAL_100_CS_AS_SC
+ebean.test.sqlserver.port=9435
+ebean.test.sqlserver.url=jdbc:sqlserver://localhost:9435;databaseName=test_ebean;sendTimeAsDateTime=false
+
datasource.default=sqlserver2017
-ebean.sqlserver2017.databasePlatformName=sqlserver17
\ No newline at end of file
+ebean.sqlserver2017.databasePlatformName=sqlserver17
diff --git a/ebean-test/testconfig/ebean-sqlserver19.properties b/ebean-test/testconfig/ebean-sqlserver19.properties
new file mode 100644
index 000000000..5c8accf32
--- /dev/null
+++ b/ebean-test/testconfig/ebean-sqlserver19.properties
@@ -0,0 +1,13 @@
+ebean.test.platform=sqlserver
+ebean.test.dbName=test_ebean
+ebean.test.sqlserver.version=2019-latest
+ebean.test.sqlserver.containerName=local_sqlserver2019
+ebean.test.sqlserver.collation=LATIN1_GENERAL_100_CS_AS_SC_UTF8
+ebean.test.sqlserver.port=9434
+ebean.test.sqlserver.url=jdbc:sqlserver://localhost:9434;databaseName=test_ebean;sendTimeAsDateTime=false
+datasource.default=sqlserver2019
+ebean.sqlserver2019.databasePlatformName=sqlserver17
+
+## A case sensitive collation example:
+#ebean.test.sqlserver.collation=LATIN1_GENERAL_100_CI_AS_SC_UTF8
+#ebean.sqlserver2019.caseSensitiveCollation=false
diff --git a/ebean/pom.xml b/ebean/pom.xml
index f9d693733..2c3dacdf5 100644
--- a/ebean/pom.xml
+++ b/ebean/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
ebean composite
@@ -22,20 +22,20 @@
io.ebean
ebean-api
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-core
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
io.ebean
ebean-querybean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
diff --git a/ebean/pom.xml.releaseBackup b/ebean/pom.xml.releaseBackup
new file mode 100644
index 000000000..bf039e209
--- /dev/null
+++ b/ebean/pom.xml.releaseBackup
@@ -0,0 +1,58 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ ebean composite
+ Composite of common runtime dependencies
+ ebean
+
+
+
+
+ io.ebean
+ ebean-datasource
+ ${ebean-datasource.version}
+
+
+
+ io.ebean
+ ebean-api
+ 12.13.2-SNAPSHOT
+
+
+
+ io.ebean
+ ebean-core
+ 12.13.2-SNAPSHOT
+
+
+
+
+ io.ebean
+ ebean-querybean
+ 12.13.2-SNAPSHOT
+
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
diff --git a/kotlin-querybean-generator/pom.xml b/kotlin-querybean-generator/pom.xml
index 93758d10a..e897804e2 100644
--- a/kotlin-querybean-generator/pom.xml
+++ b/kotlin-querybean-generator/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
kotlin querybean generator
@@ -12,7 +12,7 @@
kotlin-querybean-generator
- 1.5.30-M1
+ 1.6.0
@@ -29,7 +29,7 @@
io.ebean
ebean-querybean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
@@ -43,7 +43,7 @@
io.ebean
ebean-core
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
@@ -64,7 +64,7 @@
io.ebean
ebean-ddl-generator
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
test
diff --git a/kotlin-querybean-generator/pom.xml.releaseBackup b/kotlin-querybean-generator/pom.xml.releaseBackup
new file mode 100644
index 000000000..0be3286f4
--- /dev/null
+++ b/kotlin-querybean-generator/pom.xml.releaseBackup
@@ -0,0 +1,186 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ kotlin querybean generator
+ Generates Kotlin querybeans
+ kotlin-querybean-generator
+
+
+ 1.6.0
+
+
+
+
+
+
+
+ io.avaje
+ junit
+ 1.0
+ test
+
+
+
+ io.ebean
+ ebean-querybean
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ io.ebean
+ ebean-datasource
+ ${ebean-datasource.version}
+ test
+
+
+
+ io.ebean
+ ebean-core
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+ ${kotlin.version}
+ provided
+
+
+
+ org.jetbrains.kotlin
+ kotlin-test
+ ${kotlin.version}
+ test
+
+
+
+ io.ebean
+ ebean-ddl-generator
+ 12.13.2-SNAPSHOT
+ test
+
+
+
+ javax.validation
+ validation-api
+ 2.0.1.Final
+ test
+
+
+
+
+
+
+ src/test/kotlin
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-plugin
+ ${kotlin.version}
+
+
+ test-compile
+ test-compile
+
+ test-compile
+
+
+
+ test-kapt
+
+ test-kapt
+
+
+
+ src/test/kotlin
+
+
+
+ io.ebean
+ kotlin-querybean-generator
+ 12.8.2
+
+
+
+
+
+ compile
+ compile
+
+ compile
+
+
+
+ src/main/java
+ target/generated-sources/kapt/test
+ target/generated-sources/kaptKotlin/test
+
+
+
+
+
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+ default-testCompile
+ none
+
+
+ java-test-compile
+ test-compile
+
+ testCompile
+
+
+
+ compile
+ compile
+
+ compile
+
+
+
+
+ 1.8
+ 1.8
+
+ -proc:none
+
+
+
+
+ io.ebean
+ ebean-maven-plugin
+ ${ebean-maven-plugin.version}
+
+
+ test
+ process-test-classes
+
+ debug=1
+
+
+ testEnhance
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index eb2bf22f6..c4461a29e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
io.ebean
ebean-parent
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
pom
ebean parent
@@ -108,9 +108,26 @@
ebean-querybean
ebean-postgis
ebean-redis
-
+
+
+
+
+ release
+
+
+ default
+
+ true
+
+
+ ebean-kotlin
+ tests
+
+
+
+
foconis-release
diff --git a/pom.xml.releaseBackup b/pom.xml.releaseBackup
new file mode 100644
index 000000000..ba0c11c58
--- /dev/null
+++ b/pom.xml.releaseBackup
@@ -0,0 +1,114 @@
+
+
+ 4.0.0
+
+ org.avaje
+ java8-oss
+ 3.2
+
+
+ io.ebean
+ ebean-parent
+ 12.13.2-SNAPSHOT
+ pom
+
+ ebean parent
+ Parent for ebean modules
+ https://ebean.io/
+
+
+ scm:git:git@github.com:ebean-orm/ebean.git
+ HEAD
+
+
+
+
+ The Apache Software License, Version 2.0
+ http://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
+
+
+
+ rbygrave
+ Rob Bygrave
+ robin.bygrave@gmail.com
+
+
+
+
+ false
+ 2.12.1
+ 1.2
+ 1.1
+ 12.12.1
+ 4.2
+ 7.3
+ 12.13.0
+ 12.13.0
+
+
+
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.30
+ provided
+
+
+
+ ch.qos.logback
+ logback-classic
+ 1.2.3
+ test
+
+
+
+ com.h2database
+ h2
+ 1.4.199
+ test
+
+
+
+
+
+ ebean
+ ebean-api
+ ebean-bom
+ ebean-core-type
+ ebean-core
+ ebean-ddl-generator
+ ebean-autotune
+ ebean-externalmapping-api
+ ebean-externalmapping-xml
+ ebean-test
+ querybean-generator
+ kotlin-querybean-generator
+ ebean-querybean
+ ebean-postgis
+ ebean-redis
+
+
+
+
+
+
+ release
+
+
+ default
+
+ true
+
+
+ ebean-kotlin
+ tests
+
+
+
+
+
+
diff --git a/querybean-generator/pom.xml b/querybean-generator/pom.xml
index 49017b306..ef25adaa8 100644
--- a/querybean-generator/pom.xml
+++ b/querybean-generator/pom.xml
@@ -4,7 +4,7 @@
ebean-parent
io.ebean
- 12.13.1-FOC6-SNAPSHOT
+ 12.13.3-SNAPSHOT
querybean generator
diff --git a/querybean-generator/pom.xml.releaseBackup b/querybean-generator/pom.xml.releaseBackup
new file mode 100644
index 000000000..d61f1d143
--- /dev/null
+++ b/querybean-generator/pom.xml.releaseBackup
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 12.13.2-SNAPSHOT
+
+
+ querybean generator
+ Querybean generator
+ querybean-generator
+
+
+
+
+ io.avaje
+ junit
+ 1.0
+ test
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.2
+
+ 1.8
+ 1.8
+
+ -proc:none
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.24
+ true
+
+
+ io.avaje.tile:moditech-module:1.0
+
+
+
+
+
+
+
diff --git a/release.properties b/release.properties
new file mode 100644
index 000000000..e846a5665
--- /dev/null
+++ b/release.properties
@@ -0,0 +1,83 @@
+#release configuration
+#Fri Dec 17 17:24:24 NZDT 2021
+projectVersionPolicyId=default
+project.scm.io.ebean\:ebean-core-type.tag=HEAD
+scm.branchCommitComment=@{prefix} prepare branch @{releaseLabel}
+project.rel.io.ebean\:ebean-ddl-generator=12.13.2
+project.dev.io.ebean\:ebean-core=12.13.3-SNAPSHOT
+project.scm.io.ebean\:ebean-api.tag=HEAD
+project.scm.io.ebean\:ebean-redis.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.scm.io.ebean\:ebean-querybean.tag=HEAD
+project.scm.io.ebean\:ebean-api.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.dev.io.ebean\:ebean-api=12.13.3-SNAPSHOT
+project.rel.io.ebean\:ebean=12.13.2
+project.dev.io.ebean\:ebean-core-type=12.13.3-SNAPSHOT
+project.scm.io.ebean\:ebean-ddl-generator.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+exec.activateProfiles=release
+project.dev.io.ebean\:ebean-test=12.13.3-SNAPSHOT
+project.scm.io.ebean\:kotlin-querybean-generator.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.scm.io.ebean\:ebean-querybean.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.scm.io.ebean\:ebean-bom.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.scm.io.ebean\:ebean-core.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.rel.io.ebean\:ebean-core-type=12.13.2
+project.rel.io.ebean\:kotlin-querybean-generator=12.13.2
+project.dev.io.ebean\:querybean-generator=12.13.3-SNAPSHOT
+project.scm.io.ebean\:ebean-autotune.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+scm.commentPrefix=[maven-release-plugin]
+releaseStrategyId=default
+project.rel.io.ebean\:ebean-querybean=12.13.2
+project.scm.io.ebean\:ebean-externalmapping-api.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.scm.io.ebean\:querybean-generator.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.dev.io.ebean\:kotlin-querybean-generator=12.13.3-SNAPSHOT
+project.scm.io.ebean\:ebean-core-type.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+completedPhase=generate-release-poms
+project.rel.io.ebean\:ebean-redis=12.13.2
+project.scm.io.ebean\:ebean-test.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.scm.io.ebean\:ebean-postgis.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.dev.io.ebean\:ebean-autotune=12.13.3-SNAPSHOT
+project.rel.io.ebean\:ebean-api=12.13.2
+project.scm.io.ebean\:ebean-postgis.tag=HEAD
+project.scm.io.ebean\:querybean-generator.tag=HEAD
+project.rel.io.ebean\:querybean-generator=12.13.2
+scm.tag=ebean-parent-12.13.2
+project.rel.io.ebean\:ebean-externalmapping-xml=12.13.2
+project.scm.io.ebean\:ebean-ddl-generator.tag=HEAD
+project.rel.io.ebean\:ebean-externalmapping-api=12.13.2
+project.scm.io.ebean\:ebean-externalmapping-xml.tag=HEAD
+preparationGoals=clean verify
+exec.pomFileName=pom.xml
+project.dev.io.ebean\:ebean-externalmapping-api=12.13.3-SNAPSHOT
+project.dev.io.ebean\:ebean=12.13.3-SNAPSHOT
+project.scm.io.ebean\:ebean.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.dev.io.ebean\:ebean-parent=12.13.3-SNAPSHOT
+project.dev.io.ebean\:ebean-externalmapping-xml=12.13.3-SNAPSHOT
+project.rel.io.ebean\:ebean-core=12.13.2
+project.dev.io.ebean\:ebean-redis=12.13.3-SNAPSHOT
+project.dev.io.ebean\:ebean-postgis=12.13.3-SNAPSHOT
+project.scm.io.ebean\:ebean-redis.tag=HEAD
+project.scm.io.ebean\:ebean-parent.tag=HEAD
+pushChanges=true
+project.scm.io.ebean\:ebean-externalmapping-xml.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+project.rel.io.ebean\:ebean-test=12.13.2
+project.scm.io.ebean\:kotlin-querybean-generator.tag=HEAD
+project.scm.io.ebean\:ebean-bom.tag=HEAD
+project.scm.io.ebean\:ebean-autotune.tag=HEAD
+project.scm.io.ebean\:ebean.tag=HEAD
+project.scm.io.ebean\:ebean-core.tag=HEAD
+project.rel.io.ebean\:ebean-autotune=12.13.2
+scm.rollbackCommitComment=@{prefix} rollback the release of @{releaseLabel}
+remoteTagging=true
+project.dev.io.ebean\:ebean-bom=12.13.3-SNAPSHOT
+project.dev.io.ebean\:ebean-querybean=12.13.3-SNAPSHOT
+project.rel.io.ebean\:ebean-bom=12.13.2
+project.scm.io.ebean\:ebean-parent.developerConnection=scm\:git\:git@github.com\:ebean-orm/ebean.git
+scm.url=scm\:git\:git@github.com\:ebean-orm/ebean.git
+scm.developmentCommitComment=@{prefix} prepare for next development iteration
+project.scm.io.ebean\:ebean-externalmapping-api.tag=HEAD
+scm.tagNameFormat=@{project.artifactId}-@{project.version}
+project.scm.io.ebean\:ebean-test.tag=HEAD
+project.dev.io.ebean\:ebean-ddl-generator=12.13.3-SNAPSHOT
+exec.snapshotReleasePluginAllowed=false
+scm.releaseCommitComment=@{prefix} prepare release @{releaseLabel}
+project.rel.io.ebean\:ebean-postgis=12.13.2
+project.rel.io.ebean\:ebean-parent=12.13.2
diff --git a/tests/pom.xml b/tests/pom.xml
index 9edd759f2..b3592f647 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -5,6 +5,7 @@
org.avaje
java8-oss
2.3
+
io.ebean
@@ -19,11 +20,25 @@
true
-
-
-
-
- test-kotlin
-
+
+
+ jdk16plus
+
+ [16,20]
+
+
+ test-java16
+
+
+
+ jdk15less
+
+ [8,15]
+
+
+ test-kotlin
+
+
+
diff --git a/tests/test-java16/pom.xml b/tests/test-java16/pom.xml
index 4a416d12e..0f4927da5 100644
--- a/tests/test-java16/pom.xml
+++ b/tests/test-java16/pom.xml
@@ -20,7 +20,7 @@
io.ebean
ebean
- 12.13.0-SNAPSHOT
+ 12.13.2-SNAPSHOT
@@ -32,7 +32,7 @@
io.ebean
ebean-test
- 12.13.0-SNAPSHOT
+ 12.13.2-SNAPSHOT
test
@@ -58,7 +58,7 @@
io.ebean
querybean-generator
- 12.13.0-SNAPSHOT
+ 12.13.2-SNAPSHOT
diff --git a/tests/test-kotlin/pom.xml b/tests/test-kotlin/pom.xml
index 1321332b8..3ab10cdf5 100644
--- a/tests/test-kotlin/pom.xml
+++ b/tests/test-kotlin/pom.xml
@@ -7,9 +7,10 @@
org.avaje
java11-oss
2.3
+
- kotlin test
+ test-kotlin
Kotlin specific tests
test-kotlin
1.0
@@ -19,7 +20,7 @@
11
12.13.0
- 1.5.31
+ 1.6.0
2.12.1
true
@@ -35,14 +36,14 @@
io.ebean
ebean-test
- 12.13.0-SNAPSHOT
+ 12.13.2-SNAPSHOT
test
io.ebean
ebean-core
- 12.13.0-SNAPSHOT
+ 12.13.2-SNAPSHOT
test