diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0c09fbd01..bf03d3b50 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ jobs: uses: actions/setup-java@v2 with: java-version: ${{ matrix.java_version }} - distribution: 'adopt' + distribution: 'zulu' - name: Maven cache uses: actions/cache@v2 env: diff --git a/.github/workflows/jdk-18-ea.yml b/.github/workflows/jdk-18-ea.yml new file mode 100644 index 000000000..b814c77c9 --- /dev/null +++ b/.github/workflows/jdk-18-ea.yml @@ -0,0 +1,39 @@ + +name: JDK 18-ea + +on: + workflow_dispatch: + schedule: + - cron: '30 6 * * 1,3,5' + +jobs: + build: + + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + java_version: [18-ea] + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.java_version }} + distribution: 'zulu' + - name: Maven cache + uses: actions/cache@v2 + env: + cache-name: maven-cache + with: + path: + ~/.m2 + key: build-${{ env.cache-name }} + - name: Build with Maven + run: mvn package + diff --git a/.github/workflows/mariadb-10.6.yml b/.github/workflows/mariadb-10.6.yml index 797e948ff..cae97ac27 100644 --- a/.github/workflows/mariadb-10.6.yml +++ b/.github/workflows/mariadb-10.6.yml @@ -1,7 +1,10 @@ name: MariaDB 10.6 -on: [workflow_dispatch] +on: + workflow_dispatch: + schedule: + - cron: '10 7 * * 1,4' jobs: build: diff --git a/.github/workflows/multi-jdk-build.yml b/.github/workflows/multi-jdk-build.yml index badab5de6..f44cfac89 100644 --- a/.github/workflows/multi-jdk-build.yml +++ b/.github/workflows/multi-jdk-build.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - java_version: [8, 11, 17] + java_version: [8.0.192, 8, 11.0.3, 11, 17] os: [ubuntu-latest] steps: @@ -25,7 +25,7 @@ jobs: uses: actions/setup-java@v2 with: java-version: ${{ matrix.java_version }} - distribution: 'adopt' + distribution: 'zulu' - name: Maven cache uses: actions/cache@v2 env: diff --git a/.github/workflows/sqlserver-2017-latest.yml b/.github/workflows/sqlserver-2017-latest.yml index 83649d080..6c72d8980 100644 --- a/.github/workflows/sqlserver-2017-latest.yml +++ b/.github/workflows/sqlserver-2017-latest.yml @@ -1,7 +1,10 @@ name: SqlServer 2017 latest -on: [workflow_dispatch] +on: + workflow_dispatch: + schedule: + - cron: '10 7 * * 2,5' jobs: build: diff --git a/README.md b/README.md index 2a6045969..30dc2c06b 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,12 @@ [![Maven Central : ebean](https://maven-badges.herokuapp.com/maven-central/io.ebean/ebean/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.ebean/ebean) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/ebean-orm/ebean/blob/master/LICENSE) [![Multi-JDK Build](https://github.com/ebean-orm/ebean/actions/workflows/multi-jdk-build.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/multi-jdk-build.yml) +[![JDK 18-ea](https://github.com/ebean-orm/ebean/actions/workflows/jdk-18-ea.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/jdk-18-ea.yml) [![Postgres](https://github.com/ebean-orm/ebean/actions/workflows/postgres.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/postgres.yml) [![MySql](https://github.com/ebean-orm/ebean/actions/workflows/mysql.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/mysql.yml) -[![MariaDB 10.6](https://github.com/ebean-orm/ebean/actions/workflows/mariadb-10.6.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/mariadb-10.6.yml) -[![SqlServer 2017 latest](https://github.com/ebean-orm/ebean/actions/workflows/sqlserver-2017-latest.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/sqlserver-2017-latest.yml) +[![MariaDB](https://github.com/ebean-orm/ebean/actions/workflows/mariadb-10.6.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/mariadb-10.6.yml) +[![SqlServer](https://github.com/ebean-orm/ebean/actions/workflows/sqlserver-2017-latest.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/sqlserver-2017-latest.yml) # Sponsors diff --git a/ebean-api/pom.xml b/ebean-api/pom.xml index 1e711bc62..ca0b583c5 100644 --- a/ebean-api/pom.xml +++ b/ebean-api/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ebean api @@ -27,7 +27,7 @@ io.avaje avaje-config - 1.5 + 1.7 @@ -26,7 +26,7 @@ io.ebean ebean-core - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT provided diff --git a/ebean-bom/pom.xml b/ebean-bom/pom.xml index 417420c68..47f0f4ce4 100644 --- a/ebean-bom/pom.xml +++ b/ebean-bom/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ebean bom @@ -71,88 +71,88 @@ io.ebean ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-api - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-core - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-core-type - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-ddl-generator - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-externalmapping-api - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-externalmapping-xml - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-autotune - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-querybean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean querybean-generator - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT provided io.ebean kotlin-querybean-generator - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT provided io.ebean ebean-test - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test io.ebean ebean-postgis - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-redis - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT diff --git a/ebean-core-type/pom.xml b/ebean-core-type/pom.xml index 3d3e11a75..9eb1859c9 100644 --- a/ebean-core-type/pom.xml +++ b/ebean-core-type/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ebean-core-type @@ -16,7 +16,7 @@ io.ebean ebean-api - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT diff --git a/ebean-core/pom.xml b/ebean-core/pom.xml index b250f7a0a..89aa0e6e5 100644 --- a/ebean-core/pom.xml +++ b/ebean-core/pom.xml @@ -3,7 +3,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ebean-core @@ -41,19 +41,19 @@ io.ebean ebean-api - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-core-type - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-externalmapping-api - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT 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 dc14a15ae..2fbf362ee 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 @@ -213,6 +213,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/persist/DefaultPersister.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java index f2c56db74..701b76402 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java @@ -333,6 +333,13 @@ public final class DefaultPersister implements Persister { * Recursively delete the bean. This calls back to the EbeanServer. */ private int deleteRecurse(EntityBean detailBean, Transaction t, DeleteMode deleteMode) { + return deleteRequest(createDeleteCascade(detailBean, t, deleteMode.persistType())); + } + + /** + * Delete without being a cascade. + */ + private int delete(EntityBean detailBean, Transaction t, DeleteMode deleteMode) { return deleteRequest(createDeleteRequest(detailBean, t, deleteMode.persistType())); } @@ -560,7 +567,7 @@ public final class DefaultPersister implements Persister { } } - private void deleteList(List beanList, SpiTransaction t, DeleteMode deleteMode, boolean children) { + private void deleteCascade(List beanList, SpiTransaction t, DeleteMode deleteMode, boolean children) { if (children) { t.depth(-1); t.checkBatchEscalationOnCollection(); @@ -604,7 +611,7 @@ public final class DefaultPersister implements Persister { for (Object id : ids) { EntityBean bean = descriptor.createEntityBean(); descriptor.convertSetId(id, bean); - int rowCount = deleteRecurse(bean, transaction, deleteMode); + int rowCount = delete(bean, transaction, deleteMode); if (rowCount == -1) { total = -1; } else if (total != -1) { @@ -656,7 +663,7 @@ public final class DefaultPersister implements Persister { t.logSummary("-- DeleteById of " + descriptor.name() + " ids[" + idList + "] requires fetch of foreign key values"); } List beanList = server.findList(q, t); - deleteList(beanList, t, deleteMode, false); + deleteCascade(beanList, t, deleteMode, false); return beanList.size(); } else { @@ -994,6 +1001,8 @@ public final class DefaultPersister implements Persister { executeSqlUpdate(sqlDelete, t); } else { + // TODO: Review first checking if many property is loaded and using the loaded beans + // ... and only using findIdsByParentId() when the many property isn't loaded // Delete recurse using the Id values of the children Object parentId = desc.getId(parentBean); List idsByParentId = many.findIdsByParentId(parentId, null, t, excludeDetailIds, deleteMode.isHard()); @@ -1017,7 +1026,7 @@ public final class DefaultPersister implements Persister { for (Object id : childIds) { refList.add(targetDesc.createReference(id, null)); } - deleteList(refList, t, deleteMode, true); + deleteCascade(refList, t, deleteMode, true); } else { // perform delete by statement if possible delete(targetDesc, null, childIds, t, deleteMode); @@ -1157,6 +1166,10 @@ public final class DefaultPersister implements Persister { return createDeleteRequest(bean, t, type, Flags.ZERO); } + private PersistRequestBean createDeleteCascade(EntityBean bean, Transaction t, Type type) { + return createDeleteRequest(bean, t, type, Flags.RECURSE); + } + @SuppressWarnings({"unchecked"}) private PersistRequestBean createDeleteRequest(Object bean, Transaction t, PersistRequest.Type type, int flags) { BeanManager mgr = beanManager(bean.getClass()); @@ -1167,7 +1180,7 @@ public final class DefaultPersister implements Persister { type = Type.DELETE_SOFT; } - PersistRequestBean request = new PersistRequestBean<>(server, (T)bean, null, mgr, (SpiTransaction) t, persistExecute, type, flags); + PersistRequestBean request = new PersistRequestBean<>(server, (T) bean, null, mgr, (SpiTransaction) t, persistExecute, type, flags); request.initForSoftDelete(); return request; } @@ -1186,7 +1199,7 @@ public final class DefaultPersister implements Persister { */ @SuppressWarnings("unchecked") private BeanManager beanManager(Class cls) { - BeanManager mgr = (BeanManager)beanDescriptorManager.beanManager(cls); + BeanManager mgr = (BeanManager) beanDescriptorManager.beanManager(cls); if (mgr == null) { throw new PersistenceException(errNotRegistered(cls)); } 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 941d5745c..401ad2216 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 @@ -346,11 +346,10 @@ public final class DefaultTypeManager implements TypeManager { Type genericType = prop.getGenericType(); boolean hasJacksonAnnotations = objectMapperPresent && checkJacksonAnnotations(prop); - boolean keepSource = prop.getMutationDetection() == 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); } @@ -358,14 +357,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/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-ddl-generator/pom.xml b/ebean-ddl-generator/pom.xml index fc0e83a5f..6d009ead8 100644 --- a/ebean-ddl-generator/pom.xml +++ b/ebean-ddl-generator/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ebean ddl generation @@ -28,14 +28,14 @@ io.ebean ebean-core-type - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT provided io.ebean ebean-core - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT provided diff --git a/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.0__initial.sql b/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.0__initial.sql index 20d677cf5..095b581de 100644 --- a/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.0__initial.sql +++ b/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.0__initial.sql @@ -71,17 +71,17 @@ create table migtest_e_basic ( indextest5 varchar(127), indextest6 varchar(127), user_id integer not null, - constraint ck_migtest_e_basic_status check ( status in ('N','A','I')), - constraint ck_migtest_e_basic_status2 check ( status2 in ('N','A','I')), + constraint ck_mgtst__bsc_stts check ( status in ('N','A','I')), + constraint ck_mgtst__b_z543fg check ( status2 in ('N','A','I')), constraint pk_migtest_e_basic primary key (id) ); --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest2 unique (indextest2); --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest6 unique (indextest6); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4aybzy unique (indextest2); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4ayc02 unique (indextest6); create table migtest_e_enum ( id integer generated by default as identity not null, test_status varchar(1), - constraint ck_migtest_e_enum_test_status check ( test_status in ('N','A','I')), + constraint ck_mgtst__n_773sok check ( test_status in ('N','A','I')), constraint pk_migtest_e_enum primary key (id) ); @@ -129,7 +129,7 @@ create table migtest_e_ref ( name varchar(127) not null, constraint pk_migtest_e_ref primary key (id) ); -alter table migtest_e_ref add constraint uq_migtest_e_ref_name unique (name); +alter table migtest_e_ref add constraint uq_mgtst__rf_nm unique (name); create table migtest_e_softdelete ( id integer generated by default as identity not null, @@ -161,14 +161,14 @@ create table migtest_oto_master ( constraint pk_migtest_oto_master primary key (id) ); -create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); -create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5); -create index ix_migtest_fk_cascade_one_id on migtest_fk_cascade (one_id); -alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade; +create index ix_mgtst__b_eu8csq on migtest_e_basic (indextest1); +create index ix_mgtst__b_eu8csu on migtest_e_basic (indextest5); +create index ix_mgtst_fk_mok1xj on migtest_fk_cascade (one_id); +alter table migtest_fk_cascade add constraint fk_mgtst_fk_65kf6l foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade; -create index ix_migtest_fk_set_null_one_id on migtest_fk_set_null (one_id); -alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete set null; +create index ix_mgtst_fk_c4p3mv on migtest_fk_set_null (one_id); +alter table migtest_fk_set_null add constraint fk_mgtst_fk_wicx8x foreign key (one_id) references migtest_fk_one (id) on delete set null; -create index ix_migtest_e_basic_eref_id on migtest_e_basic (eref_id); -alter table migtest_e_basic add constraint fk_migtest_e_basic_eref_id foreign key (eref_id) references migtest_e_ref (id) on delete restrict; +create index ix_mgtst__bsc_rf_d on migtest_e_basic (eref_id); +alter table migtest_e_basic add constraint fk_mgtst__bsc_rf_d foreign key (eref_id) references migtest_e_ref (id) on delete restrict; diff --git a/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.1.sql b/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.1.sql index 27c612f46..605a24af3 100644 --- a/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.1.sql +++ b/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.1.sql @@ -20,31 +20,31 @@ create table migtest_mtm_m_migtest_mtm_c ( alter table migtest_ckey_detail add column one_key integer; alter table migtest_ckey_detail add column two_key varchar(127); -alter table migtest_ckey_detail add constraint fk_migtest_ckey_detail_parent foreign key (one_key,two_key) references migtest_ckey_parent (one_key,two_key) on delete restrict; +alter table migtest_ckey_detail add constraint fk_mgtst_ck_e1qkb5 foreign key (one_key,two_key) references migtest_ckey_parent (one_key,two_key) on delete restrict; alter table migtest_ckey_parent add column assoc_id integer; -alter table migtest_fk_cascade drop constraint fk_migtest_fk_cascade_one_id; -alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete restrict; -alter table migtest_fk_none add constraint fk_migtest_fk_none_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict; -alter table migtest_fk_none_via_join add constraint fk_migtest_fk_none_via_join_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict; -alter table migtest_fk_set_null drop constraint fk_migtest_fk_set_null_one_id; -alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete restrict; +alter table migtest_fk_cascade drop constraint fk_mgtst_fk_65kf6l; +alter table migtest_fk_cascade add constraint fk_mgtst_fk_65kf6l foreign key (one_id) references migtest_fk_cascade_one (id) on delete restrict; +alter table migtest_fk_none add constraint fk_mgtst_fk_nn_n_d foreign key (one_id) references migtest_fk_one (id) on delete restrict; +alter table migtest_fk_none_via_join add constraint fk_mgtst_fk_9tknzj foreign key (one_id) references migtest_fk_one (id) on delete restrict; +alter table migtest_fk_set_null drop constraint fk_mgtst_fk_wicx8x; +alter table migtest_fk_set_null add constraint fk_mgtst_fk_wicx8x foreign key (one_id) references migtest_fk_one (id) on delete restrict; update migtest_e_basic set status = 'A' where status is null; -alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; +alter table migtest_e_basic drop constraint ck_mgtst__bsc_stts; alter table migtest_e_basic alter column status set default 'A'; alter table migtest_e_basic alter column status set not null; -alter table migtest_e_basic add constraint ck_migtest_e_basic_status check ( status in ('N','A','I','?')); -alter table migtest_e_basic drop constraint ck_migtest_e_basic_status2; +alter table migtest_e_basic add constraint ck_mgtst__bsc_stts check ( status in ('N','A','I','?')); +alter table migtest_e_basic drop constraint ck_mgtst__b_z543fg; alter table migtest_e_basic alter column status2 varchar(127); alter table migtest_e_basic alter column status2 drop default; alter table migtest_e_basic alter column status2 set null; -- rename all collisions; --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_description unique (description); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_vs45xo unique (description); insert into migtest_e_user (id) select distinct user_id from migtest_e_basic; -alter table migtest_e_basic add constraint fk_migtest_e_basic_user_id foreign key (user_id) references migtest_e_user (id) on delete restrict; +alter table migtest_e_basic add constraint fk_mgtst__bsc_sr_d foreign key (user_id) references migtest_e_user (id) on delete restrict; alter table migtest_e_basic alter column user_id set null; alter table migtest_e_basic add column new_string_field varchar(255) default 'foo''bar' not null; alter table migtest_e_basic add column new_boolean_field boolean default true not null; @@ -52,16 +52,16 @@ update migtest_e_basic set new_boolean_field = old_boolean; alter table migtest_e_basic add column new_boolean_field2 boolean default true not null; alter table migtest_e_basic add column progress integer default 0 not null; -alter table migtest_e_basic add constraint ck_migtest_e_basic_progress check ( progress in (0,1,2)); +alter table migtest_e_basic add constraint ck_mgtst__b_l39g41 check ( progress in (0,1,2)); alter table migtest_e_basic add column new_integer integer default 42 not null; -alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest2; -alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest6; --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_status_indextest1 unique (status,indextest1); --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_name unique (name); --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest4 unique (indextest4); --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest5 unique (indextest5); -alter table migtest_e_enum drop constraint ck_migtest_e_enum_test_status; +alter table migtest_e_basic drop constraint uq_mgtst__b_4aybzy; +alter table migtest_e_basic drop constraint uq_mgtst__b_4ayc02; +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_ucfcne unique (status,indextest1); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__bsc_nm unique (name); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4ayc00 unique (indextest4); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4ayc01 unique (indextest5); +alter table migtest_e_enum drop constraint ck_mgtst__n_773sok; comment on column migtest_e_history.test_string is 'Column altered to long now'; alter table migtest_e_history alter column test_string bigint; comment on table migtest_e_history is 'We have history now'; @@ -87,24 +87,24 @@ alter table migtest_e_softdelete add column deleted boolean default false not nu alter table migtest_oto_child add column master_id bigint; -create index ix_migtest_e_basic_indextest3 on migtest_e_basic (indextest3); -create index ix_migtest_e_basic_indextest6 on migtest_e_basic (indextest6); -drop index ix_migtest_e_basic_indextest1; -drop index ix_migtest_e_basic_indextest5; -create index ix_migtest_mtm_c_migtest_mtm_m_migtest_mtm_c on migtest_mtm_c_migtest_mtm_m (migtest_mtm_c_id); -alter table migtest_mtm_c_migtest_mtm_m add constraint fk_migtest_mtm_c_migtest_mtm_m_migtest_mtm_c foreign key (migtest_mtm_c_id) references migtest_mtm_c (id) on delete restrict; +create index ix_mgtst__b_eu8css on migtest_e_basic (indextest3); +create index ix_mgtst__b_eu8csv on migtest_e_basic (indextest6); +drop index ix_mgtst__b_eu8csq; +drop index ix_mgtst__b_eu8csu; +create index ix_mgtst_mt_3ug4ok on migtest_mtm_c_migtest_mtm_m (migtest_mtm_c_id); +alter table migtest_mtm_c_migtest_mtm_m add constraint fk_mgtst_mt_93awga foreign key (migtest_mtm_c_id) references migtest_mtm_c (id) on delete restrict; -create index ix_migtest_mtm_c_migtest_mtm_m_migtest_mtm_m on migtest_mtm_c_migtest_mtm_m (migtest_mtm_m_id); -alter table migtest_mtm_c_migtest_mtm_m add constraint fk_migtest_mtm_c_migtest_mtm_m_migtest_mtm_m foreign key (migtest_mtm_m_id) references migtest_mtm_m (id) on delete restrict; +create index ix_mgtst_mt_3ug4ou on migtest_mtm_c_migtest_mtm_m (migtest_mtm_m_id); +alter table migtest_mtm_c_migtest_mtm_m add constraint fk_mgtst_mt_93awgk foreign key (migtest_mtm_m_id) references migtest_mtm_m (id) on delete restrict; -create index ix_migtest_mtm_m_migtest_mtm_c_migtest_mtm_m on migtest_mtm_m_migtest_mtm_c (migtest_mtm_m_id); -alter table migtest_mtm_m_migtest_mtm_c add constraint fk_migtest_mtm_m_migtest_mtm_c_migtest_mtm_m foreign key (migtest_mtm_m_id) references migtest_mtm_m (id) on delete restrict; +create index ix_mgtst_mt_b7nbcu on migtest_mtm_m_migtest_mtm_c (migtest_mtm_m_id); +alter table migtest_mtm_m_migtest_mtm_c add constraint fk_mgtst_mt_ggi34k foreign key (migtest_mtm_m_id) references migtest_mtm_m (id) on delete restrict; -create index ix_migtest_mtm_m_migtest_mtm_c_migtest_mtm_c on migtest_mtm_m_migtest_mtm_c (migtest_mtm_c_id); -alter table migtest_mtm_m_migtest_mtm_c add constraint fk_migtest_mtm_m_migtest_mtm_c_migtest_mtm_c foreign key (migtest_mtm_c_id) references migtest_mtm_c (id) on delete restrict; +create index ix_mgtst_mt_b7nbck on migtest_mtm_m_migtest_mtm_c (migtest_mtm_c_id); +alter table migtest_mtm_m_migtest_mtm_c add constraint fk_mgtst_mt_ggi34a foreign key (migtest_mtm_c_id) references migtest_mtm_c (id) on delete restrict; -create index ix_migtest_ckey_parent_assoc_id on migtest_ckey_parent (assoc_id); -alter table migtest_ckey_parent add constraint fk_migtest_ckey_parent_assoc_id foreign key (assoc_id) references migtest_ckey_assoc (id) on delete restrict; +create index ix_mgtst_ck_x45o21 on migtest_ckey_parent (assoc_id); +alter table migtest_ckey_parent add constraint fk_mgtst_ck_da00mr foreign key (assoc_id) references migtest_ckey_assoc (id) on delete restrict; -alter table migtest_oto_child add constraint fk_migtest_oto_child_master_id foreign key (master_id) references migtest_oto_master (id) on delete restrict; +alter table migtest_oto_child add constraint fk_mgtst_t__csyl38 foreign key (master_id) references migtest_oto_master (id) on delete restrict; diff --git a/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.3.sql b/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.3.sql index eaf78b733..9489c8d98 100644 --- a/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.3.sql +++ b/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/1.3.sql @@ -5,44 +5,44 @@ create table migtest_e_ref ( name varchar(127) not null, constraint pk_migtest_e_ref primary key (id) ); -alter table migtest_e_ref add constraint uq_migtest_e_ref_name unique (name); +alter table migtest_e_ref add constraint uq_mgtst__rf_nm unique (name); -alter table migtest_ckey_detail drop constraint fk_migtest_ckey_detail_parent; -alter table migtest_fk_cascade drop constraint fk_migtest_fk_cascade_one_id; -alter table migtest_fk_cascade add constraint fk_migtest_fk_cascade_one_id foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade; -alter table migtest_fk_none drop constraint fk_migtest_fk_none_one_id; -alter table migtest_fk_none_via_join drop constraint fk_migtest_fk_none_via_join_one_id; -alter table migtest_fk_set_null drop constraint fk_migtest_fk_set_null_one_id; -alter table migtest_fk_set_null add constraint fk_migtest_fk_set_null_one_id foreign key (one_id) references migtest_fk_one (id) on delete set null; -alter table migtest_e_basic drop constraint ck_migtest_e_basic_status; +alter table migtest_ckey_detail drop constraint fk_mgtst_ck_e1qkb5; +alter table migtest_fk_cascade drop constraint fk_mgtst_fk_65kf6l; +alter table migtest_fk_cascade add constraint fk_mgtst_fk_65kf6l foreign key (one_id) references migtest_fk_cascade_one (id) on delete cascade; +alter table migtest_fk_none drop constraint fk_mgtst_fk_nn_n_d; +alter table migtest_fk_none_via_join drop constraint fk_mgtst_fk_9tknzj; +alter table migtest_fk_set_null drop constraint fk_mgtst_fk_wicx8x; +alter table migtest_fk_set_null add constraint fk_mgtst_fk_wicx8x foreign key (one_id) references migtest_fk_one (id) on delete set null; +alter table migtest_e_basic drop constraint ck_mgtst__bsc_stts; alter table migtest_e_basic alter column status drop default; alter table migtest_e_basic alter column status set null; -alter table migtest_e_basic add constraint ck_migtest_e_basic_status check ( status in ('N','A','I')); +alter table migtest_e_basic add constraint ck_mgtst__bsc_stts check ( status in ('N','A','I')); update migtest_e_basic set status2 = 'N' where status2 is null; -alter table migtest_e_basic drop constraint ck_migtest_e_basic_status2; +alter table migtest_e_basic drop constraint ck_mgtst__b_z543fg; alter table migtest_e_basic alter column status2 varchar(1); alter table migtest_e_basic alter column status2 set default 'N'; alter table migtest_e_basic alter column status2 set not null; -alter table migtest_e_basic add constraint ck_migtest_e_basic_status2 check ( status2 in ('N','A','I')); -alter table migtest_e_basic drop constraint uq_migtest_e_basic_description; +alter table migtest_e_basic add constraint ck_mgtst__b_z543fg check ( status2 in ('N','A','I')); +alter table migtest_e_basic drop constraint uq_mgtst__b_vs45xo; update migtest_e_basic set user_id = 23 where user_id is null; -alter table migtest_e_basic drop constraint fk_migtest_e_basic_user_id; +alter table migtest_e_basic drop constraint fk_mgtst__bsc_sr_d; alter table migtest_e_basic alter column user_id set default 23; alter table migtest_e_basic alter column user_id set not null; alter table migtest_e_basic add column old_boolean boolean default false not null; alter table migtest_e_basic add column old_boolean2 boolean; alter table migtest_e_basic add column eref_id integer; -alter table migtest_e_basic drop constraint uq_migtest_e_basic_status_indextest1; -alter table migtest_e_basic drop constraint uq_migtest_e_basic_name; -alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest4; -alter table migtest_e_basic drop constraint uq_migtest_e_basic_indextest5; --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest2 unique (indextest2); --- NOT SUPPORTED alter table migtest_e_basic add constraint uq_migtest_e_basic_indextest6 unique (indextest6); -alter table migtest_e_enum drop constraint ck_migtest_e_enum_test_status; -alter table migtest_e_enum add constraint ck_migtest_e_enum_test_status check ( test_status in ('N','A','I')); +alter table migtest_e_basic drop constraint uq_mgtst__b_ucfcne; +alter table migtest_e_basic drop constraint uq_mgtst__bsc_nm; +alter table migtest_e_basic drop constraint uq_mgtst__b_4ayc00; +alter table migtest_e_basic drop constraint uq_mgtst__b_4ayc01; +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4aybzy unique (indextest2); +-- NOT SUPPORTED alter table migtest_e_basic add constraint uq_mgtst__b_4ayc02 unique (indextest6); +alter table migtest_e_enum drop constraint ck_mgtst__n_773sok; +alter table migtest_e_enum add constraint ck_mgtst__n_773sok check ( test_status in ('N','A','I')); comment on column migtest_e_history.test_string is ''; comment on table migtest_e_history is ''; alter table migtest_e_history2 alter column test_string drop default; @@ -58,10 +58,10 @@ alter table migtest_e_history6 alter column test_number1 set null; update migtest_e_history6 set test_number2 = 7 where test_number2 is null; alter table migtest_e_history6 alter column test_number2 set default 7; alter table migtest_e_history6 alter column test_number2 set not null; -create index ix_migtest_e_basic_indextest1 on migtest_e_basic (indextest1); -create index ix_migtest_e_basic_indextest5 on migtest_e_basic (indextest5); -drop index ix_migtest_e_basic_indextest3; -drop index ix_migtest_e_basic_indextest6; -create index ix_migtest_e_basic_eref_id on migtest_e_basic (eref_id); -alter table migtest_e_basic add constraint fk_migtest_e_basic_eref_id foreign key (eref_id) references migtest_e_ref (id) on delete restrict; +create index ix_mgtst__b_eu8csq on migtest_e_basic (indextest1); +create index ix_mgtst__b_eu8csu on migtest_e_basic (indextest5); +drop index ix_mgtst__b_eu8css; +drop index ix_mgtst__b_eu8csv; +create index ix_mgtst__bsc_rf_d on migtest_e_basic (eref_id); +alter table migtest_e_basic add constraint fk_mgtst__bsc_rf_d foreign key (eref_id) references migtest_e_ref (id) on delete restrict; diff --git a/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/idx_db2.migrations b/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/idx_db2.migrations index 5c3f38243..ec4208068 100644 --- a/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/idx_db2.migrations +++ b/ebean-ddl-generator/src/test/resources/dbmigration/migrationtest/db2/idx_db2.migrations @@ -1,6 +1,6 @@ --904775387, 1.0__initial.sql -1360307269, 1.1.sql +441570368, 1.0__initial.sql +-94595879, 1.1.sql 578073685, 1.2__dropsFor_1.1.sql --671695671, 1.3.sql +-509420890, 1.3.sql -1475628451, 1.4__dropsFor_1.3.sql diff --git a/ebean-externalmapping-api/pom.xml b/ebean-externalmapping-api/pom.xml index 72278f50b..1f7620729 100644 --- a/ebean-externalmapping-api/pom.xml +++ b/ebean-externalmapping-api/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ebean external mapping api diff --git a/ebean-externalmapping-xml/pom.xml b/ebean-externalmapping-xml/pom.xml index 8155aa728..d9727054a 100644 --- a/ebean-externalmapping-xml/pom.xml +++ b/ebean-externalmapping-xml/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT @@ -33,7 +33,7 @@ io.ebean ebean-externalmapping-api - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT @@ -59,14 +59,14 @@ io.ebean ebean-core - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test io.ebean ebean-ddl-generator - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test diff --git a/ebean-kotlin/pom.xml b/ebean-kotlin/pom.xml new file mode 100644 index 000000000..b9a3e50c4 --- /dev/null +++ b/ebean-kotlin/pom.xml @@ -0,0 +1,104 @@ + + + + ebean-parent + io.ebean + 12.14.1-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.14.1-SNAPSHOT + provided + + + + + org.jetbrains.kotlin + kotlin-test + ${kotlin.version} + test + + + + io.avaje + junit + 1.0 + test + + + + io.ebean + ebean-test + 12.14.1-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 3d1fa16d0..3e6e22ede 100644 --- a/ebean-postgis/pom.xml +++ b/ebean-postgis/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ebean postgis @@ -23,7 +23,7 @@ io.ebean ebean-core - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT provided @@ -74,7 +74,7 @@ io.ebean ebean-test - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test diff --git a/ebean-querybean/pom.xml b/ebean-querybean/pom.xml index 5ed7e1669..e04cb19ea 100644 --- a/ebean-querybean/pom.xml +++ b/ebean-querybean/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ebean querybean @@ -17,7 +17,7 @@ io.ebean ebean-core - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT provided @@ -56,21 +56,21 @@ io.ebean ebean-ddl-generator - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test io.ebean querybean-generator - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test io.ebean ebean-test - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test diff --git a/ebean-redis/pom.xml b/ebean-redis/pom.xml index 7ada5696b..5acd9874b 100644 --- a/ebean-redis/pom.xml +++ b/ebean-redis/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ebean-redis @@ -16,41 +16,41 @@ redis.clients jedis - 3.6.3 + 3.8.0 io.ebean ebean-api - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT provided io.ebean ebean-core - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT provided io.ebean ebean-querybean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test io.ebean querybean-generator - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test io.ebean ebean-test - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test diff --git a/ebean-test/pom.xml b/ebean-test/pom.xml index b015a4544..4a2cdf3be 100644 --- a/ebean-test/pom.xml +++ b/ebean-test/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ebean test @@ -29,14 +29,14 @@ io.ebean ebean-core - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT provided io.ebean ebean-ddl-generator - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT @@ -187,8 +187,8 @@ com.oracle.database.jdbc - ojdbc8 19.12.0.0 @@ -226,7 +226,7 @@ ch.qos.logback logback-classic - 1.2.3 + 1.2.9 test diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/SqlServerSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/SqlServerSetup.java index 2dc68b5d7..09b76323e 100644 --- a/ebean-test/src/main/java/io/ebean/test/config/platform/SqlServerSetup.java +++ b/ebean-test/src/main/java/io/ebean/test/config/platform/SqlServerSetup.java @@ -13,7 +13,7 @@ class SqlServerSetup implements PlatformSetup { config.setDefaultPort(1433); config.setUsernameDefault(); config.setPassword("SqlS3rv#r"); - config.setUrl("jdbc:sqlserver://localhost:${port};databaseName=${databaseName}"); + config.setUrl("jdbc:sqlserver://localhost:${port};databaseName=${databaseName};sendTimeAsDateTime=false"); config.setDriver("com.microsoft.sqlserver.jdbc.SQLServerDriver"); config.datasourceDefaults(); 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/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..8b86b1f87 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,16 @@ 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 org.tests.model.basic.event.TWithPreInsertPersistAdapter; +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 +25,56 @@ 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()); + assert e1 != null; 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"); + TWithPreInsertChild childBean = e1.children().get(0); + childBean.setName("Child0-changed"); + DB.save(e1); + + assertThat(e1.requestCascadeState()).isEqualTo(12); + assertThat(childBean.requestCascadeState()).isEqualTo(11); + + DB.delete(e1); + + assertThat(e1.requestCascadeState()).isEqualTo(22); + + // assert that isCascade() was true for the child bean + assertThat(TWithPreInsertPersistAdapter.cascadeDelete).hasSize(1); + String deleteCascade = TWithPreInsertPersistAdapter.cascadeDelete.get(0); + assertThat(deleteCascade).isEqualTo("class org.tests.model.basic.TWithPreInsertChild:1"); + } + + @Test + void testStatelessUpdate() { TWithPreInsert e = new TWithPreInsert(); e.setName("BeanForUpdateTest"); diff --git a/ebean-test/src/test/java/org/tests/idkeys/TestGeneratedKeys.java b/ebean-test/src/test/java/org/tests/idkeys/TestGeneratedKeys.java index 56245930c..8f57569a0 100644 --- a/ebean-test/src/test/java/org/tests/idkeys/TestGeneratedKeys.java +++ b/ebean-test/src/test/java/org/tests/idkeys/TestGeneratedKeys.java @@ -14,6 +14,8 @@ import org.tests.idkeys.db.GenKeySeqB; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assumptions.assumeTrue; @@ -24,6 +26,7 @@ public class TestGeneratedKeys extends BaseTestCase { @ForPlatform(Platform.H2) // readSequenceValue is H2 specific public void testGenKeySeqA() throws SQLException { assumeTrue(idType() == IdType.SEQUENCE); + SpiEbeanServer server = spiEbeanServer(); try (Transaction tx = server.beginTransaction()) { @@ -69,20 +72,34 @@ public class TestGeneratedKeys extends BaseTestCase { } private long readSequenceValue(Transaction tx, String sequence) throws SQLException { - Statement stm = null; - try { - stm = tx.connection().createStatement(); - ResultSet rs = stm.executeQuery("select currval('" + sequence + "')"); - rs.next(); + String sql; + switch (spiEbeanServer().databasePlatform().getPlatform().base()) { + case H2 : + sql = "select currval('" + sequence + "')"; + break; + case DB2 : + sql = "values previous value for " + sequence; + + break; + case SQLSERVER : + sql = "select current_value from sys.sequences where name = '" + sequence + "'"; + break; + + case MARIADB : + throw new UnsupportedOperationException("reading sequence value outside of the current connection is not supported. " + + "See https://mariadb.com/kb/en/previous-value-for-sequence_name/#description"); + + default : + throw new UnsupportedOperationException("reading sequence value from " + + spiEbeanServer().databasePlatform().getPlatform() + + " is not supported."); + + } + try (Statement stm = tx.connection().createStatement()) { + ResultSet rs = stm.executeQuery(sql); + rs.next(); return rs.getLong(1); - } finally { - if (stm != null) { - try { - stm.close(); - } catch (SQLException e) { - } - } } } @@ -109,5 +126,25 @@ public class TestGeneratedKeys extends BaseTestCase { assertNotNull(al.getId()); } } + + @Test + @ForPlatform({Platform.H2, Platform.MARIADB, Platform.SQLSERVER, Platform.DB2}) + public void testGeneratedKeys() throws SQLException { + assumeTrue(idType() == IdType.SEQUENCE); + + SpiEbeanServer server = spiEbeanServer(); + List idList = new ArrayList<>(52); + + try (Transaction tx = server.beginTransaction()) { + // bigger than increment + for (int i = 1; i < 52; i++) { + GenKeySeqA gks = new GenKeySeqA(); + gks.setDescription("my description " + i); + server.save(gks); + assertFalse(idList.contains(gks.getId())); + idList.add(gks.getId()); + } + } + } } 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/basic/TWithPreInsert.java b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsert.java index f93378240..acfffce20 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.ALL; @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 = ALL) + 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..632c7ade9 --- /dev/null +++ b/ebean-test/src/test/java/org/tests/model/basic/TWithPreInsertCommon.java @@ -0,0 +1,16 @@ +package org.tests.model.basic; + +public interface TWithPreInsertCommon { + + Integer getId(); + + 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..ffc87e00a 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,37 +2,49 @@ 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; + +import java.util.ArrayList; +import java.util.List; public class TWithPreInsertPersistAdapter extends BeanPersistAdapter { + public static List cascadeDelete = new ArrayList<>(); + @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); } + @Override + public boolean preDelete(BeanPersistRequest request) { + TWithPreInsertCommon bean = (TWithPreInsertCommon) request.bean(); + if (request.isCascade()) { + cascadeDelete.add(bean.getClass() + ":" + bean.getId()); + } else { + bean.requestCascadeState(22); + } + return true; + } } diff --git a/ebean-test/src/test/java/org/tests/text/csv/TestCsvReader.java b/ebean-test/src/test/java/org/tests/text/csv/TestCsvReader.java index 313f5017c..5658d3263 100644 --- a/ebean-test/src/test/java/org/tests/text/csv/TestCsvReader.java +++ b/ebean-test/src/test/java/org/tests/text/csv/TestCsvReader.java @@ -10,6 +10,7 @@ import org.tests.model.basic.ResetBasicData; import java.io.File; import java.io.FileReader; import java.net.URL; +import java.util.Locale; public class TestCsvReader extends TransactionalTestCase { @@ -32,7 +33,7 @@ public class TestCsvReader extends TransactionalTestCase { // csvReader.addProperty("id"); csvReader.addProperty("status"); csvReader.addProperty("name"); - csvReader.addDateTime("anniversary", "dd-MMM-yyyy"); + csvReader.addDateTime("anniversary", "dd-MMM-yyyy", Locale.ENGLISH); csvReader.addProperty("billingAddress.line1"); csvReader.addProperty("billingAddress.city"); csvReader.addProperty("billingAddress.country.code"); diff --git a/ebean-test/src/test/java/org/tests/text/csv/TestCsvReaderWithCallback.java b/ebean-test/src/test/java/org/tests/text/csv/TestCsvReaderWithCallback.java index ef6bfd8c7..bd620401e 100644 --- a/ebean-test/src/test/java/org/tests/text/csv/TestCsvReaderWithCallback.java +++ b/ebean-test/src/test/java/org/tests/text/csv/TestCsvReaderWithCallback.java @@ -10,6 +10,7 @@ import org.tests.model.basic.Customer; import java.io.File; import java.io.FileReader; import java.net.URL; +import java.util.Locale; import static org.assertj.core.api.Assertions.assertThat; @@ -32,7 +33,7 @@ public class TestCsvReaderWithCallback extends TransactionalTestCase { // csvReader.addProperty("id"); csvReader.addProperty("status"); csvReader.addProperty("name"); - csvReader.addDateTime("anniversary", "dd-MMM-yyyy"); + csvReader.addDateTime("anniversary", "dd-MMM-yyyy", Locale.ENGLISH); csvReader.addProperty("billingAddress.line1"); csvReader.addProperty("billingAddress.city"); // processor.addReference("billingAddress.country.code"); diff --git a/ebean/pom.xml b/ebean/pom.xml index bf039e209..751a7d829 100644 --- a/ebean/pom.xml +++ b/ebean/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ebean composite @@ -22,20 +22,20 @@ io.ebean ebean-api - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-core - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT io.ebean ebean-querybean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT diff --git a/kotlin-querybean-generator/pom.xml b/kotlin-querybean-generator/pom.xml index 0be3286f4..da44acb28 100644 --- a/kotlin-querybean-generator/pom.xml +++ b/kotlin-querybean-generator/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT kotlin querybean generator @@ -29,7 +29,7 @@ io.ebean ebean-querybean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test @@ -43,7 +43,7 @@ io.ebean ebean-core - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test @@ -64,7 +64,7 @@ io.ebean ebean-ddl-generator - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test @@ -106,7 +106,7 @@ io.ebean kotlin-querybean-generator - 12.8.2 + 12.13.0 diff --git a/pom.xml b/pom.xml index 740ee0b08..9d8573072 100644 --- a/pom.xml +++ b/pom.xml @@ -4,12 +4,12 @@ org.avaje java8-oss - 3.2 + 3.3 io.ebean ebean-parent - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT pom ebean parent @@ -61,7 +61,7 @@ ch.qos.logback logback-classic - 1.2.3 + 1.2.9 test @@ -90,6 +90,7 @@ ebean-querybean ebean-postgis ebean-redis + @@ -103,6 +104,7 @@ true + ebean-kotlin tests diff --git a/querybean-generator/pom.xml b/querybean-generator/pom.xml index d61f1d143..3e50a4758 100644 --- a/querybean-generator/pom.xml +++ b/querybean-generator/pom.xml @@ -4,7 +4,7 @@ ebean-parent io.ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT querybean generator diff --git a/tests/pom.xml b/tests/pom.xml index c6f2cdcc5..b3592f647 100644 --- a/tests/pom.xml +++ b/tests/pom.xml @@ -5,6 +5,7 @@ org.avaje java8-oss 2.3 + io.ebean diff --git a/tests/test-java16/pom.xml b/tests/test-java16/pom.xml index 0f4927da5..302af2a2f 100644 --- a/tests/test-java16/pom.xml +++ b/tests/test-java16/pom.xml @@ -20,19 +20,19 @@ io.ebean ebean - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT ch.qos.logback logback-classic - 1.2.3 + 1.2.9 io.ebean ebean-test - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test @@ -58,7 +58,7 @@ io.ebean querybean-generator - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT diff --git a/tests/test-kotlin/pom.xml b/tests/test-kotlin/pom.xml index 64981379f..5e65046dd 100644 --- a/tests/test-kotlin/pom.xml +++ b/tests/test-kotlin/pom.xml @@ -7,6 +7,7 @@ org.avaje java11-oss 2.3 + test-kotlin @@ -35,21 +36,21 @@ io.ebean ebean-test - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test io.ebean ebean-core - 12.13.2-SNAPSHOT + 12.14.1-SNAPSHOT test ch.qos.logback logback-classic - 1.2.3 + 1.2.9 test