Compare commits

..
Author SHA1 Message Date
Rob Bygrave 385867b9f5 [maven-release-plugin] prepare release ebean-parent-13.3.1 2022-04-20 12:09:09 +12:00
Rob Bygrave 4b30c51ff4 Bump ebean-agent 2022-04-20 12:05:14 +12:00
Rob Bygrave 0969e1427b ebean-api module-info, requires static jackson databind (as optional) 2022-04-20 11:01:10 +12:00
Rob Bygrave b2349bb044 Fix test InitDataSourceTest to use public API 2022-04-20 10:50:39 +12:00
Rob Bygrave c766756efe Improve test TestHistoryOneToOne 2022-04-20 10:02:11 +12:00
Rob BygraveandGitHub 0e6c6965f0 Merge pull request #2654 from FOCONIS/file-dirty-detection
Fix: Setting file with same content should not make bean dirty
2022-04-19 22:30:15 +12:00
Rob Bygrave 7a17cd0797 Tidy DefaultDbSqlContext, remove excess space from sql left join, tidy whitespace 2022-04-19 15:44:08 +12:00
Rob Bygrave 56acac9f08 git push origin masterMerge branch 'tobias--failing_parameter' 2022-04-19 15:03:11 +12:00
Rob Bygrave 756e3e4a1c #2651 - @OneToOne with @History, add fix and update tests
Effectively Ebean internally needs to keep a count on the number of times AS OF predicates are added (to joins + top level table). This change moves keeping that count for all joins to DbSqlContext.
2022-04-19 15:02:50 +12:00
Roland Praml 669d004d1b Fix: Setting file with same content should not make bean dirty
(cherry picked from commit 62c4acd36a)
2022-04-14 15:12:45 +02:00
Tobias 67fc7cdb48 Test case for lazy @OneToOne beans with @History
Ebean produces an invalid query when trying to lazy load @OneToOne
from a historical bean. This test asserts working behaviour.
2022-04-14 10:17:45 +02:00
Rob Bygrave 0e548ec1c5 Tidy test module poms 2022-04-13 10:40:55 +12:00
Rob BygraveandGitHub 493e2d7463 Merge pull request #2646 from FOCONIS/sort-inherit
Produce deterministic DDL if @Inheritance is used
2022-04-13 10:29:57 +12:00
Rob BygraveandGitHub ea30c1d43b Merge pull request #2645 from FOCONIS/sort-beancache
NPE executing query with beanCache and order by & clear
2022-04-13 10:23:28 +12:00
Roland Praml 8c800e992d Fix beanCache order by & clear did not work
(cherry picked from commit 4dee827fda)
2022-04-12 13:51:49 +02:00
Rob Bygrave d348794d92 Bump test modules to 13.3.1-SNAPSHOT after release 2022-04-12 21:47:00 +12:00
Rob Bygrave 526e476ba1 [maven-release-plugin] prepare for next development iteration 2022-04-12 21:23:12 +12:00
Rob Bygrave bdc936b63b [maven-release-plugin] prepare release ebean-parent-13.3.0 2022-04-12 21:23:05 +12:00
Roland Praml 3179aa23ea Sort DeployInheritInfo, so that DDL is deterministic
(cherry picked from commit 6412e060e6)
2022-04-12 09:43:16 +02:00
Rob BygraveandGitHub 2aba1835f1 ebean-test - Fix AutoConfigureForTesting to skip configuration for non-default DatabaseConfig (#2644)
#2644 - ebean-test - Fix AutoConfigureForTesting to skip configuration for non-default DatabaseConfig
2022-04-12 17:36:25 +12:00
Rob Bygrave 4b8eadad1c Bump to 13.3.0-SNAPSHOT 2022-04-11 14:00:45 +12:00
Rob Bygrave 0a43b64f71 #2641 - Add a simple integration test for toString() implementation 2022-04-11 13:52:30 +12:00
Rob Bygrave 21c2232d96 #2641 - Bump ebean-agent for toString() implementation 2022-04-11 13:42:56 +12:00
Rob Bygrave 119b2d4638 #2643 - Bump dependencies h2database -> 2.1.212 ebean-test-docker -> 4.6 2022-04-11 12:50:46 +12:00
Rob BygraveandGitHub 5cc2685732 Merge pull request #2642 from ebean-orm/feature/2641-ToStringBuilder
#2641 -  Provide a decent default toString() implementation for entity beans
2022-04-11 12:49:02 +12:00
Rob Bygrave 6d6e417c94 #2641 - toString() - add tests for max beans and max content 2022-04-11 12:27:09 +12:00
Rob Bygrave be2466003d #2641 - toString() - addCollection() firstElement change 2022-04-08 22:30:00 +12:00
Rob Bygrave 183b601be8 #2641 - toString() - Change BeanCollection toString() implementations, suppress unloaded BeanCollections 2022-04-08 18:53:57 +12:00
Rob Bygrave 5a7e8456e1 #2641 - Provide a decent default toString() implementation for entity beans 2022-04-08 17:35:27 +12:00
Rob Bygrave 6e3db70d20 #2640 - ebean-redis - bump jedis dependency to 4.2.1 from 4.2.0 2022-04-08 09:10:12 +12:00
Rob Bygrave 2be34a8eb8 Bump test modules to 13.2.1-SNAPSHOT after release 2022-04-07 18:46:44 +12:00
Rob Bygrave 1c749e55c6 Fix javadoc in DB 2022-04-07 18:45:19 +12:00
Rob Bygrave 73dd4a5648 [maven-release-plugin] prepare for next development iteration 2022-04-07 18:13:48 +12:00
87 changed files with 1030 additions and 434 deletions
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-clickhouse</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-clickhouse</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-cockroach</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-db2</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-db2</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-h2</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-hana</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-hana</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-mariadb</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mariadb</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-mysql</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mysql</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-nuodb</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-nuodb</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-oracle</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-oracle</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-postgres</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-sqlite</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlite</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-sqlserver</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlserver</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean-yugabyte</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean (all platforms)</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -35,18 +35,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-all</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>composites</artifactId>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean api</name>
+19 -65
View File
@@ -22,10 +22,9 @@ import java.util.concurrent.Callable;
* DB additionally provides a convenient way to use the 'default' Database.
* <p>
* <h3>Default database</h3>
* <p>
* One of the Database instances can be registered as the "default database"
* and can be obtained using <code>DB.getDefault()</code>
* </p>
*
* <pre>{@code
*
* Database database = DB.getDefault();
@@ -36,7 +35,7 @@ import java.util.concurrent.Callable;
* <p>
* Multiple database instances can be registered with DB and we can obtain them
* using <code>DB.byName()</code>
* </p>
*
* <pre>{@code
*
* Database hrDatabase = DB.byName("hr");
@@ -47,7 +46,6 @@ import java.util.concurrent.Callable;
* <p>
* DB has methods like {@link #find(Class)} and {@link #save(Object)} which are
* just convenience for using the default database.
* </p>
*
* <pre>{@code
*
@@ -117,15 +115,12 @@ public final class DB {
* build the WHERE and HAVING clauses. Alternatively you can use the
* ExpressionFactory directly to create expressions to add to the query where
* clause.
* </p>
* <p>
* Alternatively you can use the {@link Expr} as a shortcut to the
* ExpressionFactory of the 'Default' database.
* </p>
* <p>
* You generally need to the an ExpressionFactory (or {@link Expr}) to build
* an expression that uses OR like Expression e = Expr.or(..., ...);
* </p>
*/
public static ExpressionFactory expressionFactory() {
return getDefault().expressionFactory();
@@ -136,12 +131,10 @@ public final class DB {
* <p>
* This will only work when a IdGenerator is on this bean type such as a DB
* sequence or UUID.
* </p>
* <p>
* For DB's supporting getGeneratedKeys and sequences such as Oracle10 you do
* not need to use this method generally. It is made available for more
* complex cases where it is useful to get an ID prior to some processing.
* </p>
*/
public static Object nextId(Class<?> beanType) {
return getDefault().nextId(beanType);
@@ -151,17 +144,14 @@ public final class DB {
* Start a transaction with 'REQUIRED' semantics.
* <p>
* With REQUIRED semantics if an active transaction already exists that transaction will be used.
* </p>
* <p>
* The transaction is stored in a ThreadLocal variable and typically you only
* need to use the returned Transaction <em>IF</em> you wish to do things like
* use batch mode, change the transaction isolation level, use savepoints or
* log comments to the transaction log.
* </p>
* <p>
* Example of using a transaction to span multiple calls to find(), save()
* etc.
* </p>
* Example of using a transaction to span multiple calls to find(), save() etc.
*
* <pre>{@code
*
* try (Transaction transaction = DB.beginTransaction()) {
@@ -179,7 +169,6 @@ public final class DB {
* With Database we can pass the transaction to the various find(), save() and execute()
* methods. This gives us the ability to create the transactions externally from Ebean
* and use the transaction explicitly via the various methods available on Database.
* </p>
*/
public static Transaction beginTransaction() {
return getDefault().beginTransaction();
@@ -191,7 +180,6 @@ public final class DB {
* You will want to do this if you want multiple Transactions in a single
* thread or generally use transactions outside of the TransactionThreadLocal
* management.
* </p>
*/
public static Transaction createTransaction() {
return getDefault().createTransaction();
@@ -211,7 +199,6 @@ public final class DB {
* <p>
* Note that this provides an try finally alternative to using {@link #executeCall(TxScope, Callable)} or
* {@link #execute(TxScope, Runnable)}.
* </p>
* <p>
* <h3>REQUIRES_NEW example:</h3>
* <pre>{@code
@@ -270,7 +257,7 @@ public final class DB {
/**
* Register a TransactionCallback on the currently active transaction.
* <p/>
* <p>
* If there is no currently active transaction then a PersistenceException is thrown.
*
* @param transactionCallback the transaction callback to be registered with the current transaction
@@ -299,14 +286,12 @@ public final class DB {
* rollback the transaction.
* <p>
* It is preferable to use <em>try with resources</em> rather than this.
* </p>
* <p>
* Useful to put in a finally block to ensure the transaction is ended, rather
* than a rollbackTransaction() in each catch block.
* </p>
* <p>
* Code example:
* </p>
*
* <pre>{@code
* DB.beginTransaction();
* try {
@@ -337,7 +322,6 @@ public final class DB {
* <p>
* When null is passed in for b, then the 'OldValues' of a is used for the
* difference comparison.
* </p>
*/
public static Map<String, ValuePair> diff(Object a, Object b) {
return getDefault().diff(a, b);
@@ -348,18 +332,15 @@ public final class DB {
* <p>
* If there is no current transaction one will be created and committed for
* you automatically.
* </p>
* <p>
* Save can cascade along relationships. For this to happen you need to
* specify a cascade of CascadeType.ALL or CascadeType.PERSIST on the
* OneToMany, OneToOne or ManyToMany annotation.
* </p>
* <p>
* When a save cascades via a OneToMany or ManyToMany Ebean will automatically
* set the 'parent' object to the 'detail' object. In the example below in
* saving the order and cascade saving the order details the 'parent' order
* will be set against each order detail when it is saved.
* </p>
*/
public static void save(Object bean) throws OptimisticLockException {
getDefault().save(bean);
@@ -410,11 +391,9 @@ public final class DB {
* <b>Stateless updates:</b> Note that the bean does not have to be previously fetched to call
* update().You can create a new instance and set some of its properties programmatically for via
* JSON/XML marshalling etc. This is described as a 'stateless update'.
* </p>
* <p>
* <b>Optimistic Locking: </b> Note that if the version property is not set when update() is
* called then no optimistic locking is performed (internally ConcurrencyMode.NONE is used).
* </p>
* <p>
* <pre>{@code
*
@@ -531,20 +510,16 @@ public final class DB {
* Delete the bean.
* <p>
* This will return true if the bean was deleted successfully or JDBC batch is being used.
* </p>
* <p>
* If there is no current transaction one will be created and committed for
* you automatically.
* </p>
* <p>
* If the bean is configured with <code>@SoftDelete</code> then this will perform a soft
* delete rather than a hard/permanent delete.
* </p>
* <p>
* If the Bean does not have a version property (or loaded version property) and
* the bean does not exist then this returns false indicating that nothing was
* deleted. Note that, if JDBC batch mode is used then this always returns true.
* </p>
*/
public static boolean delete(Object bean) throws OptimisticLockException {
return getDefault().delete(bean);
@@ -604,7 +579,6 @@ public final class DB {
* <p>
* Note that this resets OneToMany and ManyToMany properties so that if they
* are accessed a lazy load will refresh the many property.
* </p>
*/
public static void refresh(Object bean) {
getDefault().refresh(bean);
@@ -612,6 +586,7 @@ public final class DB {
/**
* Refresh a 'many' property of a bean.
*
* <pre>{@code
*
* Order order = ...;
@@ -632,7 +607,7 @@ public final class DB {
* Get a reference object.
* <p>
* This is sometimes described as a proxy (with lazy loading).
* </p>
*
* <pre>{@code
*
* Product product = DB.getReference(Product.class, 1);
@@ -668,7 +643,7 @@ public final class DB {
* <p>
* Note that the sorting uses a Comparator and Collections.sort(); and does
* not invoke a DB query.
* </p>
*
* <pre>{@code
*
* // find orders and their customers
@@ -703,9 +678,8 @@ public final class DB {
*
* }</pre>
* <p>
* If you want more control over the query then you can use createQuery() and
* Query.findOne();
* </p>
* If you want more control over the query then you can use createQuery() and Query.findOne();
*
* <pre>{@code
*
* // ... additionally fetching customer, customer shipping address,
@@ -745,15 +719,12 @@ public final class DB {
}
/**
* Look to execute a native sql query that does not returns beans but instead
* returns SqlRow or direct access to ResultSet (see {@link SqlQuery#findList(RowMapper)}.
*
* Look to execute a native sql query that does not return beans but instead
* returns SqlRow or uses {@link RowMapper}.
* <p>
* Refer to {@link DtoQuery} for native sql queries returning DTO beans.
* </p>
* <p>
* Refer to {@link #findNative(Class, String)} for native sql queries returning entity beans.
* </p>
*/
public static SqlQuery sqlQuery(String sql) {
return getDefault().sqlQuery(sql);
@@ -764,11 +735,9 @@ public final class DB {
* <p>
* Use this to execute a Insert Update or Delete statement. The statement will
* be native to the database and contain database table and column names.
* </p>
*
* <p>
* See {@link SqlUpdate} for example usage.
* </p>
*
* @return The SqlUpdate instance to set parameters and execute
*/
@@ -792,10 +761,9 @@ public final class DB {
* <p>
* The orm update differs from the sql update in that it you can use the bean
* name and bean property names rather than table and column names.
* </p>
* <p>
* An example:
* </p>
*
* <pre>{@code
*
* // The bean name and properties - "topic","postCount" and "id"
@@ -828,7 +796,6 @@ public final class DB {
* Create a named query.
* <p>
* For RawSql the named query is expected to be in ebean.xml.
* </p>
*
* @param beanType The type of entity bean
* @param namedQuery The name of the query
@@ -844,15 +811,12 @@ public final class DB {
* <p>
* You can use the methods on the Query object to specify fetch paths,
* predicates, order by, limits etc.
* </p>
* <p>
* You then use findList(), findSet(), findMap() and findOne() to execute
* the query and return the collection or bean.
* </p>
* <p>
* Note that a query executed by {@link Query#findList()} etc will execute against
* the same database from which is was created.
* </p>
*
* @param beanType the class of entity to be fetched
* @return A ORM Query for this beanType
@@ -904,7 +868,6 @@ public final class DB {
* This is actually the same as {@link #createQuery(Class)}. The reason it
* exists is that people used to JPA will probably be looking for a
* createQuery method (the same as entityManager).
* </p>
*
* @param beanType the type of entity bean to find
* @return A ORM Query object for this beanType
@@ -917,7 +880,7 @@ public final class DB {
* Create a query using native SQL.
* <p>
* The native SQL can contain named parameters or positioned parameters.
* </p>
*
* <pre>{@code
*
* String sql = "select c.id, c.name from customer c where c.name like ? order by c.name";
@@ -942,7 +905,6 @@ public final class DB {
* <p>
* DTO beans are just normal bean like classes with public constructor(s) and setters.
* They do not need to be registered with Ebean before use.
* </p>
*
* @param dtoType The type of the DTO bean the rows will be mapped into.
* @param sql The SQL query to execute.
@@ -979,10 +941,8 @@ public final class DB {
* going back to the database.
* <p>
* This produces and returns a new list with the sort and filters applied.
* </p>
* <p>
* Refer to {@link Filter} for an example of its use.
* </p>
*/
public static <T> Filter<T> filter(Class<T> beanType) {
return getDefault().filter(beanType);
@@ -993,7 +953,7 @@ public final class DB {
* <p>
* The scope can control the transaction type, isolation and rollback
* semantics.
* </p>
*
* <pre>{@code
*
* // set specific transactional scope settings
@@ -1017,7 +977,7 @@ public final class DB {
* <p>
* The default scope runs with REQUIRED and by default will rollback on any
* exception (checked or runtime).
* </p>
*
* <pre>{@code
*
* DB.execute(() -> {
@@ -1042,7 +1002,7 @@ public final class DB {
* <p>
* The scope can control the transaction type, isolation and rollback
* semantics.
* </p>
*
* <pre>{@code
*
* // set specific transactional scope settings
@@ -1066,11 +1026,10 @@ public final class DB {
* <p>
* The default scope runs with REQUIRED and by default will rollback on any
* exception (checked or runtime).
* </p>
* <p>
* This is basically the same as TxRunnable except that it returns an Object
* (and you specify the return type via generics).
* </p>
*
* <pre>{@code
*
* DB.executeCall(() -> {
@@ -1099,23 +1058,19 @@ public final class DB {
* <p>
* If you use DB.execute(UpdateSql) then the table modification information
* is automatically deduced and you do not need to call this method yourself.
* </p>
* <p>
* This information is used to invalidate objects out of the cache and
* potentially text indexes. This information is also automatically broadcast
* across the cluster.
* </p>
* <p>
* If there is a transaction then this information is placed into the current
* transactions event information. When the transaction is committed this
* information is registered (with the transaction manager). If this
* transaction is rolled back then none of the transaction event information
* registers including the information you put in via this method.
* </p>
* <p>
* If there is NO current transaction when you call this method then this
* information is registered immediately (with the transaction manager).
* </p>
*
* @param tableName the name of the table that was modified
* @param inserts true if rows where inserted into the table
@@ -1130,7 +1085,6 @@ public final class DB {
* Return the BeanState for a given entity bean.
* <p>
* This will return null if the bean is not an enhanced entity bean.
* </p>
*/
public static BeanState beanState(Object bean) {
return getDefault().beanState(bean);
@@ -18,7 +18,7 @@ import java.util.Set;
* <em>java.util.Collection</em>. The reason being that java.util.Map is not a
* Collection. I realise this makes this name confusing so I apologise for that.
*/
public interface BeanCollection<E> extends Serializable {
public interface BeanCollection<E> extends Serializable, ToStringAware {
enum ModifyListenMode {
/**
@@ -11,7 +11,7 @@ import java.io.Serializable;
* general application consumption.
* </p>
*/
public interface EntityBean extends Serializable {
public interface EntityBean extends Serializable, ToStringAware {
/**
* Return all the property names in defined order.
@@ -109,4 +109,8 @@ public interface EntityBean extends Serializable {
throw new NotEnhancedException();
}
@Override
default void toString(ToStringBuilder builder) {
throw new NotEnhancedException();
}
}
@@ -6,6 +6,11 @@ import io.ebean.ValuePair;
import javax.persistence.EntityNotFoundException;
import javax.persistence.PersistenceException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.math.BigDecimal;
import java.net.URL;
@@ -910,9 +915,38 @@ public final class EntityBeanIntercept implements Serializable {
// use the string format to determine if dirty
return !obj1.toString().equals(obj2.toString());
}
if (obj1 instanceof File && obj2 instanceof File) {
File file1 = (File) obj1;
File file2 = (File) obj2;
if (file1.exists() && file2.exists() && file1.length() == file2.length()) {
return notEqualContent(file1, file2);
}
}
return !obj1.equals(obj2);
}
private static boolean notEqualContent(File file1, File file2) {
try (InputStream is1 = new FileInputStream(file1); InputStream is2 = new FileInputStream(file2)) {
byte[] buf1 = new byte[16384];
byte[] buf2 = new byte[16384];
int len1;
int len2;
while ((len1 = is1.read(buf1)) != -1 && (len2 = is2.read(buf2)) != -1) {
if (len1 != len2) {
return true;
}
if (!Arrays.equals(buf1, buf2)) {
// it does not matter, if we compare more than len1/len2 as the remainig
// bytes in the buffers are either 0 or equals from the prev. loop.
return true;
}
}
return false;
} catch (IOException e) {
return true; // handle them as "not equals"
}
}
/**
* Called when a BeanCollection is initialised automatically.
*/
@@ -0,0 +1,12 @@
package io.ebean.bean;
/**
* A type that can participate in building toString content with ToStringBuilder.
*/
public interface ToStringAware {
/**
* Append to the ToStringBuilder.
*/
void toString(ToStringBuilder builder);
}
@@ -0,0 +1,163 @@
package io.ebean.bean;
import java.util.Collection;
import java.util.IdentityHashMap;
/**
* Helps build toString content taking into account recursion.
* <p>
* That is, it detects and handles the case where there are relationships that recurse
* and would otherwise become an infinite loop (e.g. bidirectional parent child).
*/
public final class ToStringBuilder {
/**
* The max number of objects that we allow before stopping content being appended.
*/
private static final int MAX = 100;
/**
* Max length of content in string form added for any given value.
*/
private static final int TRIM_LENGTH = 500;
/**
* The max total content after which we stop content being appended.
*/
private static final int MAX_TOTAL_CONTENT = 2000;
private final IdentityHashMap<Object, Integer> id = new IdentityHashMap<>();
private final StringBuilder sb = new StringBuilder(50);
private boolean first = true;
private int counter;
@Override
public String toString() {
return sb.toString();
}
/**
* Set of an object being added.
*/
public void start(Object bean) {
if (counter == 0) {
id.putIfAbsent(bean, 0);
}
if (counter <= MAX) {
sb.append(bean.getClass().getSimpleName()).append("@").append(counter).append("(");
}
}
/**
* Add a property as name value pair.
*/
public void add(String name, Object value) {
if (value != null && counter <= MAX) {
if (value instanceof BeanCollection) {
if (((BeanCollection<?>)value).isReference()) {
// suppress unloaded bean collections
return;
}
}
key(name);
value(value);
}
}
/**
* Add raw content.
*/
public void addRaw(String content) {
sb.append(content);
}
/**
* End of an object.
*/
public void end() {
if (counter <= MAX) {
sb.append(")");
}
}
private void key(String name) {
if (counter > MAX) {
return;
}
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(name).append(":");
}
private void value(Object value) {
if (counter > MAX) {
return;
}
if (value instanceof ToStringAware) {
if (value instanceof BeanCollection) {
((ToStringAware) value).toString(this);
} else if (push(value)) {
((ToStringAware) value).toString(this);
}
} else if (value instanceof Collection) {
addCollection((Collection<?>) value);
} else {
String content = String.valueOf(value);
if (content.length() > TRIM_LENGTH) {
content = content.substring(0, TRIM_LENGTH) + " <trimmed>";
}
sb.append(content);
if (sb.length() >= MAX_TOTAL_CONTENT) {
sb.append(" ...");
counter += MAX;
}
}
}
/**
* Add a collection of values.
*/
public void addCollection(Collection<?> c) {
if (c == null || c.isEmpty()) {
sb.append("[]");
return;
}
boolean firstElement = true;
sb.append("[");
for (Object o : c) {
if (firstElement) {
firstElement = false;
} else {
sb.append(", ");
}
value(o);
if (counter > MAX) {
return;
}
}
sb.append("]");
}
private boolean push(Object bean) {
if (counter > MAX) {
return false;
}
if (counter == MAX) {
sb.append(" ...");
counter++;
return false;
}
Integer idx = id.putIfAbsent(bean, counter++);
if (idx != null) {
--counter;
sb.append(bean.getClass().getSimpleName()).append("@").append(idx);
return false;
}
first = true;
return true;
}
}
@@ -1,9 +1,6 @@
package io.ebean.common;
import io.ebean.bean.BeanCollection;
import io.ebean.bean.BeanCollectionAdd;
import io.ebean.bean.BeanCollectionLoader;
import io.ebean.bean.EntityBean;
import io.ebean.bean.*;
import java.io.Serializable;
import java.util.ArrayList;
@@ -47,6 +44,11 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
super(loader, ownerBean, propertyName);
}
@Override
public void toString(ToStringBuilder builder) {
builder.addCollection(list);
}
@Override
public void reset(EntityBean ownerBean, String propertyName) {
this.ownerBean = ownerBean;
@@ -191,18 +193,11 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
@Override
public String toString() {
StringBuilder sb = new StringBuilder(50);
sb.append("BeanList ");
if (isReadOnly()) {
sb.append("readOnly ");
}
if (list == null) {
sb.append("deferred ");
return "BeanList<deferred>";
} else {
sb.append("size[").append(list.size()).append("] ");
sb.append("list").append(list);
return list.toString();
}
return sb.toString();
}
/**
@@ -3,6 +3,7 @@ package io.ebean.common;
import io.ebean.bean.BeanCollection;
import io.ebean.bean.BeanCollectionLoader;
import io.ebean.bean.EntityBean;
import io.ebean.bean.ToStringBuilder;
import java.util.Collection;
import java.util.Collections;
@@ -40,6 +41,19 @@ public final class BeanMap<K, E> extends AbstractBeanCollection<E> implements Ma
super(ebeanServer, ownerBean, propertyName);
}
@Override
public void toString(ToStringBuilder builder) {
if (map == null || map.isEmpty()) {
builder.addRaw("{}");
} else {
builder.addRaw("{");
for (Entry<K, E> entry : map.entrySet()) {
builder.add(String.valueOf(entry.getKey()), entry.getValue());
}
builder.addRaw("}");
}
}
@Override
public void reset(EntityBean ownerBean, String propertyName) {
this.ownerBean = ownerBean;
@@ -183,27 +197,20 @@ public final class BeanMap<K, E> extends AbstractBeanCollection<E> implements Ma
@Override
public String toString() {
StringBuilder sb = new StringBuilder(50);
sb.append("BeanMap ");
if (isReadOnly()) {
sb.append("readOnly ");
}
if (map == null) {
sb.append("deferred ");
return "BeanMap<deferred>";
} else {
sb.append("size[").append(map.size()).append("]");
sb.append(" map").append(map);
return map.toString();
}
return sb.toString();
}
/**
* Equal if obj is a Map and equal in a Map sense.
* Equal if object is a Map and equal in a Map sense.
*/
@Override
public boolean equals(Object obj) {
public boolean equals(Object object) {
init();
return map.equals(obj);
return map.equals(object);
}
@Override
@@ -1,9 +1,6 @@
package io.ebean.common;
import io.ebean.bean.BeanCollection;
import io.ebean.bean.BeanCollectionAdd;
import io.ebean.bean.BeanCollectionLoader;
import io.ebean.bean.EntityBean;
import io.ebean.bean.*;
import java.io.Serializable;
import java.util.Collection;
@@ -41,6 +38,11 @@ public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E
super(loader, ownerBean, propertyName);
}
@Override
public void toString(ToStringBuilder builder) {
builder.addCollection(set);
}
@Override
public void reset(EntityBean ownerBean, String propertyName) {
this.ownerBean = ownerBean;
@@ -169,18 +171,11 @@ public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E
@Override
public String toString() {
StringBuilder sb = new StringBuilder(50);
sb.append("BeanSet ");
if (isReadOnly()) {
sb.append("readOnly ");
}
if (set == null) {
sb.append("deferred ");
return "BeanSet<deferred>";
} else {
sb.append("size[").append(set.size()).append("]");
sb.append(" set").append(set);
return set.toString();
}
return sb.toString();
}
/**
+1
View File
@@ -19,6 +19,7 @@ module io.ebean.api {
requires static io.ebean.types;
requires static com.fasterxml.jackson.core;
requires static com.fasterxml.jackson.databind;
requires static javax.servlet.api;
exports io.ebean;
@@ -0,0 +1,223 @@
package io.ebean.bean;
import io.ebean.common.BeanList;
import io.ebean.common.BeanMap;
import io.ebean.common.BeanSet;
import org.junit.jupiter.api.Test;
import java.util.*;
import static org.assertj.core.api.Assertions.assertThat;
class ToStringBuilderTest {
@Test
void basic() {
ToStringBuilder builder = new ToStringBuilder();
builder.start(new Object());
builder.end();
assertThat(builder.toString()).isEqualTo("Object@0()");
}
@Test
void fields() {
ToStringBuilder builder = new ToStringBuilder();
builder.start(new Object());
builder.add("a", 1);
builder.add("b", "B");
builder.end();
assertThat(builder.toString()).isEqualTo("Object@0(a:1, b:B)");
}
@Test
void max100Beans_expect_noMoreContentAfterMax100() {
String loop100 = addLoopForMaxBeans(100);
String loop101 = addLoopForMaxBeans(101);
String loop900 = addLoopForMaxBeans(900);
assertThat(loop100).isEqualTo(loop101);
assertThat(loop101).isEqualTo(loop900);
}
private String addLoopForMaxBeans(int loopMax) {
ToStringBuilder builder = new ToStringBuilder();
builder.start(new Object());
for (int i = 0; i <= loopMax; i++) {
addForMax(builder, i);
}
builder.end();
return builder.toString();
}
private void addForMax(ToStringBuilder builder, int i) {
builder.add("c", new B(i));
}
@Test
void maxContent_expect_noMoreContentAfterMax2000() {
String loop23 = addContentLoop(23);
String loop24 = addContentLoop(24);
String loop25 = addContentLoop(25);
assertThat(loop23).isEqualTo(loop24);
assertThat(loop23).isEqualTo(loop25);
}
private String addContentLoop(int loopMax) {
ToStringBuilder builder = new ToStringBuilder();
builder.start(new Object());
for (int i = 0; i <= loopMax; i++) {
addForMaxContent(builder, i);
}
builder.end();
return builder.toString();
}
private void addForMaxContent(ToStringBuilder builder, int i) {
builder.add("someContentThatAddsUp", new Recurse(i, "SomeContentThatAddsUp_SomeContentThatAddsUp!!"));
}
@Test
void add_referenceBeanCollection_expect_nothingAdded() {
ToStringBuilder builder = new ToStringBuilder();
builder.add("ref", new BeanList<>(null));
assertThat(builder.toString()).isEqualTo("");
}
@Test
void addCollection_some() {
ToStringBuilder builder = new ToStringBuilder();
builder.addCollection( new BeanList<>(List.of("A","B")));
assertThat(builder.toString()).isEqualTo("[A, B]");
}
@Test
void addCollection_null() {
ToStringBuilder builder = new ToStringBuilder();
builder.addCollection(null);
assertThat(builder.toString()).isEqualTo("[]");
}
@Test
void addCollection_empty() {
ToStringBuilder builder = new ToStringBuilder();
builder.addCollection(Collections.emptyList());
assertThat(builder.toString()).isEqualTo("[]");
}
@Test
void flatBean() {
Recurse instance0 = new Recurse(42, "java");
assertThat(instance0.toString()).isEqualTo("Recurse@0(id:42, nm:java)");
}
@Test
void recursive_expect_reference() {
Recurse instance0 = new Recurse(42, "java");
instance0.other = instance0;
assertThat(instance0.toString()).isEqualTo("Recurse@0(id:42, nm:java, other:Recurse@0)");
}
@Test
void notRecursive() {
Recurse instance0 = new Recurse(42, "java");
instance0.other = new Recurse(43, "jvm");
assertThat(instance0.toString()).isEqualTo("Recurse@0(id:42, nm:java, other:Recurse@1(id:43, nm:jvm))");
}
@Test
void beanList_null_empty() {
assertThat(toStringFor(new BeanList<String>(null))).isEqualTo("[]");
assertThat(toStringFor(new BeanList<String>(Collections.emptyList()))).isEqualTo("[]");
}
@Test
void beanSet_null_empty() {
assertThat(toStringFor(new BeanSet<String>(null))).isEqualTo("[]");
assertThat(toStringFor(new BeanSet<String>(Collections.emptySet()))).isEqualTo("[]");
}
@Test
void beanMap_null_empty() {
assertThat(toStringFor(new BeanMap<String, String>(null))).isEqualTo("{}");
assertThat(toStringFor(new BeanMap<String, String>(Collections.emptyMap()))).isEqualTo("{}");
}
@Test
void beanList_some() {
BeanList<Recurse> list = new BeanList<>(List.of(new Recurse(1, "a"), new Recurse(2, "b")));
assertThat(toStringFor(list)).isEqualTo("[Recurse@1(id:1, nm:a), Recurse@2(id:2, nm:b)]");
}
@Test
void beanSet_some() {
BeanSet<Recurse> list = new BeanSet<>(new LinkedHashSet<>(List.of(new Recurse(1, "a"), new Recurse(2, "b"))));
assertThat(toStringFor(list)).isEqualTo("[Recurse@1(id:1, nm:a), Recurse@2(id:2, nm:b)]");
}
@Test
void beanMap_some() {
Map<String, Recurse> under = new LinkedHashMap<>();
under.put("a", new Recurse(1, "a"));
under.put("b", new Recurse(2, "b"));
BeanMap<String, Recurse> list = new BeanMap<>(under);
assertThat(toStringFor(list)).isEqualTo("{a:Recurse@1(id:1, nm:a), b:Recurse@2(id:2, nm:b)}");
}
private String toStringFor(ToStringAware aware) {
ToStringBuilder builder = new ToStringBuilder();
aware.toString(builder);
return builder.toString();
}
static final class Recurse implements ToStringAware {
final int id;
final String nm;
Recurse other;
Recurse(int id, String nm) {
this.id = id;
this.nm = nm;
}
public String toString() {
ToStringBuilder builder = new ToStringBuilder();
toString(builder);
return builder.toString();
}
@Override
public void toString(ToStringBuilder builder) {
builder.start(this);
builder.add("id", id);
builder.add("nm", nm);
builder.add("other", other);
builder.end();
}
}
static final class B implements ToStringAware {
final int id;
B(int id) {
this.id = id;
}
public String toString() {
ToStringBuilder builder = new ToStringBuilder();
toString(builder);
return builder.toString();
}
@Override
public void toString(ToStringBuilder builder) {
builder.start(this);
builder.add("b", id);
builder.end();
}
}
}
@@ -1,4 +1,4 @@
package io.ebean.xtest.config;
package io.ebean.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.ebean.annotation.MutationDetection;
@@ -17,11 +17,10 @@ import java.util.Properties;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
public class DatabaseConfigTest {
class DatabaseConfigTest {
@Test
public void testLoadFromEbeanProperties() {
void testLoadFromEbeanProperties() {
DatabaseConfig config = new DatabaseConfig();
config.loadFromProperties();
@@ -30,8 +29,7 @@ public class DatabaseConfigTest {
}
@Test
public void evalPropertiesInput() {
void evalPropertiesInput() {
String home = System.getProperty("user.home");
String fileSeparator = System.getProperty("file.separator");
@@ -46,8 +44,7 @@ public class DatabaseConfigTest {
}
@Test
public void testLoadWithProperties() {
void testLoadWithProperties() {
DatabaseConfig config = new DatabaseConfig();
config.setPersistBatch(PersistBatch.NONE);
config.setPersistBatchOnCascade(PersistBatch.NONE);
@@ -154,8 +151,7 @@ public class DatabaseConfigTest {
}
@Test
public void test_defaults() {
void test_defaults() {
DatabaseConfig config = new DatabaseConfig();
assertTrue(config.isIdGeneratorAutomatic());
assertTrue(config.isDefaultServer());
@@ -186,8 +182,7 @@ public class DatabaseConfigTest {
}
@Test
public void test_putServiceObject() {
void test_putServiceObject() {
ObjectMapper objectMapper = new ObjectMapper();
DatabaseConfig config = new DatabaseConfig();
+5 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<!-- <parent>-->
<!-- <groupId>org.avaje</groupId>-->
@@ -14,7 +14,7 @@
<scm>
<developerConnection>scm:git:git@github.com:ebean-orm/ebean.git</developerConnection>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
<name>ebean autotune</name>
@@ -26,7 +26,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>provided</scope>
</dependency>
@@ -55,7 +55,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
@@ -70,7 +70,7 @@
<extensions>true</extensions>
<configuration>
<tiles>
<tile>io.ebean.tile:enhancement:13.1.0</tile>
<tile>io.ebean.tile:enhancement:13.3.0</tile>
</tiles>
</configuration>
</plugin>
+15 -15
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean bom</name>
@@ -71,88 +71,88 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core-type</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-ddl-generator</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-externalmapping-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-externalmapping-xml</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-autotune</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>querybean-generator</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>kotlin-querybean-generator</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-test</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-postgis</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-redis</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
+2 -2
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-core-type</artifactId>
@@ -16,7 +16,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
+8 -8
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-core</artifactId>
@@ -15,7 +15,7 @@
<scm>
<developerConnection>scm:git:git@github.com:ebean-orm/ebean.git</developerConnection>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
<dependencies>
@@ -41,19 +41,19 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core-type</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-externalmapping-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -144,21 +144,21 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlserver</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
@@ -391,6 +391,11 @@ public interface SpiQuery<T> extends Query<T>, SpiQueryFetch, TxnProfileEventCod
*/
void incrementAsOfTableCount();
/**
* Increment the counter of tables used in 'As Of' query.
*/
void incrementAsOfTableCount(int asOfTableCount);
/**
* Return the table alias used for the base table.
*/
@@ -524,7 +524,7 @@ public final class OrmQueryRequest<T> extends BeanRequest implements SpiOrmQuery
}
if (result instanceof BeanList) {
OrderBy<T> orderBy = query.getOrderBy();
if (orderBy != null) {
if (orderBy != null && !orderBy.isEmpty()) {
// in memory sort after merging the cache hits with the DB hits
beanDescriptor.sort(((BeanList<T>) result).getActualList(), orderBy.toStringFormat());
}
@@ -543,7 +543,7 @@ public final class OrmQueryRequest<T> extends BeanRequest implements SpiOrmQuery
@Override
public List<T> beanCacheHits() {
OrderBy<T> orderBy = query.getOrderBy();
if (orderBy != null) {
if (orderBy != null && !orderBy.isEmpty()) {
beanDescriptor.sort(cacheBeans, orderBy.toStringFormat());
}
return cacheBeans;
@@ -552,7 +552,7 @@ public final class OrmQueryRequest<T> extends BeanRequest implements SpiOrmQuery
@Override
public <K> Map<K, T> beanCacheHitsAsMap() {
OrderBy<T> orderBy = query.getOrderBy();
if (orderBy != null) {
if (orderBy != null && !orderBy.isEmpty()) {
beanDescriptor.sort(cacheBeans, orderBy.toStringFormat());
}
return cacheBeansToMap();
@@ -119,6 +119,11 @@ public interface DbSqlContext {
*/
boolean isIncludeSoftDelete();
/**
* Return the count of history table AS OF predicates added via joins.
*/
int asOfTableCount();
/**
* Return true if the query is a 'asDraft' query.
*/
@@ -7,12 +7,14 @@ import javax.persistence.DiscriminatorType;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
/**
* Represents a node in the Inheritance tree.
* Holds information regarding Super Subclass support.
*/
public final class DeployInheritInfo {
public final class DeployInheritInfo implements Comparable<DeployInheritInfo> {
/**
* the default discriminator column according to the JPA 1.0 spec.
@@ -27,7 +29,7 @@ public final class DeployInheritInfo {
private String columnDefn;
private final Class<?> type;
private Class<?> parent;
private final ArrayList<DeployInheritInfo> children = new ArrayList<>();
private final Set<DeployInheritInfo> children = new TreeSet<>();
/**
* Create for a given type.
@@ -74,7 +76,7 @@ public final class DeployInheritInfo {
/**
* Return the child nodes.
*/
public List<DeployInheritInfo> children() {
public Set<DeployInheritInfo> children() {
return children;
}
@@ -251,7 +253,22 @@ public final class DeployInheritInfo {
@Override
public String toString() {
return "InheritInfo[" + type.getName() + "]" + " root[" + parent.getName() + "]" + " disValue[" + discriminatorStringValue + "]";
String root = parent == null ? null : parent.getName();
String name = type == null ? null : type.getName();
return "InheritInfo[" + name + "]" + " root[" + root + "]" + " disValue[" + discriminatorStringValue + "]";
}
@Override
public int compareTo(DeployInheritInfo o) {
if (o == this || o.discriminatorStringValue == null && discriminatorStringValue == null) {
return 0;
} else if (o.discriminatorStringValue == null) {
return 1;
} else if (discriminatorStringValue == null) {
return -1;
} else {
return discriminatorStringValue.compareTo(o.discriminatorStringValue);
}
}
}
@@ -647,6 +647,7 @@ final class CQueryBuilder {
if (query.isAsOfBaseTable() && !historySupport.isStandardsBased()) {
appendAndOrWhere();
sb.append(historySupport.getAsOfPredicate(request.baseTableAlias()));
query.incrementAsOfTableCount();
}
}
@@ -18,45 +18,27 @@ final class DefaultDbSqlContext implements DbSqlContext {
private static final String tableAliasManyPlaceHolder = "${mta}";
private final String columnAliasPrefix;
private final ArrayStack<String> tableAliasStack = new ArrayStack<>();
private final ArrayStack<String> joinStack = new ArrayStack<>();
private final ArrayStack<String> prefixStack = new ArrayStack<>();
private final String fromForUpdate;
private boolean useColumnAlias;
private int columnIndex;
private int asOfTableCount;
private StringBuilder sb = new StringBuilder(STRING_BUILDER_INITIAL_CAPACITY);
/**
* A Set used to make sure formula joins are only added once to a query.
*/
private HashSet<String> formulaJoins;
private HashSet<String> tableJoins;
private final SqlTreeAlias alias;
private String currentPrefix;
private List<BeanProperty> encryptedProps;
private List<SqlTreeJoin> extraJoins;
private final CQueryDraftSupport draftSupport;
private final CQueryHistorySupport historySupport;
private final boolean historyQuery;
/**
* Construct for SELECT clause (with column alias settings).
*/
DefaultDbSqlContext(SqlTreeAlias alias, String columnAliasPrefix, CQueryHistorySupport historySupport,
CQueryDraftSupport draftSupport, String fromForUpdate) {
this.alias = alias;
@@ -116,7 +98,6 @@ final class DefaultDbSqlContext implements DbSqlContext {
if (encryptedProps == null) {
return null;
}
return encryptedProps.toArray(new BeanProperty[0]);
}
@@ -178,6 +159,7 @@ final class DefaultDbSqlContext implements DbSqlContext {
}
if (addAsOfOnClause) {
sb.append(" and ").append(historySupport.getAsOfPredicate(a2));
asOfTableCount++;
}
if (extraWhere != null && !extraWhere.isEmpty()) {
sb.append(" and ");
@@ -195,6 +177,11 @@ final class DefaultDbSqlContext implements DbSqlContext {
}
}
@Override
public int asOfTableCount() {
return asOfTableCount;
}
@Override
public boolean isDraftQuery() {
return draftSupport != null;
@@ -236,7 +223,7 @@ final class DefaultDbSqlContext implements DbSqlContext {
@Override
public void appendFormulaJoin(String sqlFormulaJoin, SqlJoinType joinType, String manyWhere) {
// replace ${ta} place holder with the real table alias...
// replace ${ta} placeholder with the real table alias...
String tableAlias = manyWhere == null ? tableAliasStack.peek() : getTableAliasManyWhere(manyWhere);
String converted = sqlFormulaJoin.replace(tableAliasPlaceHolder, tableAlias);
if (formulaJoins == null) {
@@ -250,9 +237,9 @@ final class DefaultDbSqlContext implements DbSqlContext {
formulaJoins.add(converted);
sb.append(" ");
if (joinType == SqlJoinType.OUTER) {
if ("join".equals(sqlFormulaJoin.substring(0, 4).toLowerCase())) {
if ("join".equalsIgnoreCase(sqlFormulaJoin.substring(0, 4))) {
// prepend left as we are in the 'many' part
append(" left ");
sb.append("left ");
}
}
sb.append(converted);
@@ -127,6 +127,7 @@ public final class SqlTreeBuilder {
groupBy = buildGroupByClause();
distinctOn = buildDistinctOn();
encryptedProps = ctx.getEncryptedProps();
query.incrementAsOfTableCount(ctx.asOfTableCount());
}
boolean includeJoins = alias != null && alias.isIncludeJoins();
@@ -302,20 +302,7 @@ class SqlTreeNodeBean implements SqlTreeNode {
@Override
public void addAsOfTableAlias(SpiQuery<?> query) {
// if history on this bean type add it's alias
// for each alias we add an effect date predicate
if (desc.isHistorySupport()) {
query.incrementAsOfTableCount();
}
if (lazyLoadParent != null && lazyLoadParent.isManyToManyWithHistory()) {
query.incrementAsOfTableCount();
}
if (intersectionAsOfTableAlias) {
query.incrementAsOfTableCount();
}
for (SqlTreeNode child : children) {
child.addAsOfTableAlias(query);
}
// do nothing for non-root, handled by DbSqlContext for joins
}
@Override
@@ -58,13 +58,6 @@ final class SqlTreeNodeRoot extends SqlTreeNodeBean {
public void addAsOfTableAlias(SpiQuery<?> query) {
if (desc.isHistorySupport()) {
query.setAsOfBaseTable();
query.incrementAsOfTableCount();
}
if (lazyLoadParent != null && lazyLoadParent.isManyToManyWithHistory()) {
query.incrementAsOfTableCount();
}
for (SqlTreeNode aChildren : children) {
aChildren.addAsOfTableAlias(query);
}
}
@@ -316,6 +316,11 @@ public final class DefaultOrmQuery<T> extends AbstractQuery implements SpiQuery<
asOfTableCount++;
}
@Override
public void incrementAsOfTableCount(int increment) {
asOfTableCount += increment;
}
@Override
public int getAsOfTableCount() {
return asOfTableCount;
@@ -1 +1 @@
ebean-version: 129
ebean-version: 133
@@ -3,7 +3,7 @@ package io.ebeaninternal.server.core;
import io.ebean.config.DatabaseConfig;
import io.ebean.datasource.DataSourceAlert;
import io.ebean.datasource.DataSourceConfig;
import io.ebean.datasource.pool.ConnectionPool;
import io.ebean.datasource.DataSourcePool;
import org.junit.jupiter.api.Test;
import javax.sql.DataSource;
@@ -137,7 +137,7 @@ public class InitDataSourceTest {
config.getDataSourceConfig().setUrl("jdbc:h2:mem:dsTestOnline");
config.getDataSourceConfig().setDriver("org.h2.Driver");
InitDataSource.init(config);
ConnectionPool pool = (ConnectionPool) config.getDataSource();
DataSourcePool pool = (DataSourcePool) config.getDataSource();
assertThat(pool.isDataSourceUp()).isTrue();
pool.shutdown();
}
@@ -174,7 +174,7 @@ public class InitDataSourceTest {
config.getDataSourceConfig().setAlert(alert);
config.setDatabasePlatformName("h2");
InitDataSource.init(config);
ConnectionPool pool = (ConnectionPool) config.getDataSource();
DataSourcePool pool = (DataSourcePool) config.getDataSource();
assertThat(pool).isNotNull();
// make some additional tests with the pool
assertThat(pool.isDataSourceUp()).isFalse();
+4 -4
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean ddl generation</name>
@@ -28,14 +28,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core-type</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>provided</scope>
</dependency>
@@ -58,7 +58,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-all</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean external mapping api</name>
+7 -7
View File
@@ -4,12 +4,12 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<scm>
<developerConnection>scm:git:git@github.com:ebean-orm/ebean.git</developerConnection>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
<name>ebean external mapping xml</name>
@@ -28,7 +28,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-externalmapping-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -61,21 +61,21 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-ddl-generator</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
@@ -98,7 +98,7 @@
<configuration>
<tiles>
<!-- other tiles ... -->
<tile>io.ebean.tile:enhancement:13.1.0</tile>
<tile>io.ebean.tile:enhancement:13.3.0</tile>
</tiles>
</configuration>
</plugin>
+5 -6
View File
@@ -2,19 +2,18 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0-SNAPSHOT</version>
<version>13.3.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ebean-kotlin</artifactId>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<ebean-maven-plugin.version>12.14.1</ebean-maven-plugin.version>
<kotlin.version>1.6.0</kotlin.version>
</properties>
@@ -29,7 +28,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0-SNAPSHOT</version>
<version>13.3.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
@@ -51,7 +50,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-test</artifactId>
<version>13.2.0-SNAPSHOT</version>
<version>13.3.1-SNAPSHOT</version>
<scope>test</scope>
</dependency>
@@ -93,7 +92,7 @@
<extensions>true</extensions>
<configuration>
<tiles>
<tile>io.ebean.tile:enhancement:13.1.0</tile>
<tile>io.ebean.tile:enhancement:13.3.0</tile>
</tiles>
</configuration>
</plugin>
+5 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean postgis</name>
@@ -22,14 +22,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<!-- provided scope -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>provided</scope>
</dependency>
@@ -73,7 +73,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-test</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
@@ -104,7 +104,7 @@
<extensions>true</extensions>
<configuration>
<tiles>
<tile>io.ebean.tile:enhancement:13.1.0</tile>
<tile>io.ebean.tile:enhancement:13.3.0</tile>
</tiles>
</configuration>
</plugin>
+6 -6
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean querybean</name>
@@ -17,7 +17,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>provided</scope>
</dependency>
@@ -63,21 +63,21 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-ddl-generator</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>querybean-generator</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-test</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
@@ -107,7 +107,7 @@
<extensions>true</extensions>
<configuration>
<tiles>
<tile>io.ebean.tile:enhancement:13.1.0</tile>
<tile>io.ebean.tile:enhancement:13.3.0</tile>
</tiles>
</configuration>
</plugin>
@@ -270,6 +270,12 @@ public class QCustomerTest {
assertThat(foo).hasSize(1);
}
Customer customer = DB.find(Customer.class, cust.getId());
assert customer != null;
String customerToString = customer.toString();
assertThat(customerToString).contains("Customer@0(id:");
assertThat(customerToString).contains(", status:GOOD, inactive:false, name:usingConnection, version:1, whenCreated:");
}
@Test
+8 -8
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-redis</artifactId>
@@ -16,41 +16,41 @@
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.2.0</version>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>querybean-generator</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-test</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
@@ -80,7 +80,7 @@
<extensions>true</extensions>
<configuration>
<tiles>
<tile>io.ebean.tile:enhancement:13.1.0</tile>
<tile>io.ebean.tile:enhancement:13.3.0</tile>
</tiles>
</configuration>
</plugin>
+7 -7
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>ebean test</name>
@@ -29,20 +29,20 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-ddl-generator</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -62,7 +62,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-test-docker</artifactId>
<version>4.5</version>
<version>${ebean-test-docker.version}</version>
</dependency>
<dependency>
@@ -106,7 +106,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-all</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
@@ -266,7 +266,7 @@
<extensions>true</extensions>
<configuration>
<tiles>
<tile>io.ebean.tile:enhancement:13.1.0</tile>
<tile>io.ebean.tile:enhancement:13.3.0</tile>
</tiles>
</configuration>
</plugin>
@@ -29,16 +29,17 @@ public class AutoConfigureForTesting implements AutoConfigure {
@Override
public void preConfigure(DatabaseConfig config) {
if (!config.isDefaultServer()) {
log.info("skip automatic testing config on non-default server name:{} register:{}", config.getName(), config.isRegister());
return;
}
Properties properties = config.getProperties();
if (isExtraServer(config, properties)) {
setupExtraDataSourceIfNecessary(config);
return;
}
String testPlatform = properties.getProperty("ebean.test.platform");
log.debug("automatic testing config - with ebean.test.platform:{} environment db:{} name:{}", testPlatform, environmentDb, config.getName());
log.debug("automatic testing config - with ebean.test.platform:{} name:{} environmentDb:{}", testPlatform, config.getName(), environmentDb);
if (RunOnceMarker.isRun()) {
setupPlatform(environmentDb, config);
}
@@ -46,8 +47,10 @@ public class AutoConfigureForTesting implements AutoConfigure {
@Override
public void postConfigure(DatabaseConfig config) {
if (!config.isDefaultServer()) {
return;
}
setupProviders(config);
if (org.h2.engine.Constants.VERSION_MAJOR == 1) {
// This code may be removed later, when droppinv H2 1.xxx compatibility
System.err.println("Running tests in H2 1.xxx compatibility mode");
@@ -68,6 +68,8 @@ public abstract class BaseTestCase {
DB_CLOCK_DELTA = 100;
}
try {
String propsFile = System.getProperty("props.file");
System.out.println("BaseTestCase: -Dprops.file=" + propsFile); // help debug CI
// First try, if we get the default server. If this fails, all tests will fail.
DB.getDefault();
} catch (Throwable e) {
@@ -192,6 +192,6 @@ public class TestElementCollectionBasicMap extends BaseTestCase {
final EcmPerson fromJson = DB.json().toBean(EcmPerson.class, asJson);
assertThat(fromJson.getName()).isEqualTo("Fiona021");
assertThat(fromJson.getPhoneNumbers()).hasSize(2);
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("BeanMap size[2] map{home=021 1234, work=021 4321}");
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("{home=021 1234, work=021 4321}");
}
}
@@ -183,6 +183,6 @@ class TestElementCollectionBasicSet extends BaseTestCase {
final EcsPerson fromJson = DB.json().toBean(EcsPerson.class, asJson);
assertThat(fromJson.getName()).isEqualTo("Fiona021");
assertThat(fromJson.getPhoneNumbers()).hasSize(2);
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("BeanSet size[2] set[021 1234, 021 4321]");
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("[021 1234, 021 4321]");
}
}
@@ -190,6 +190,6 @@ public class TestElementCollectionEmbeddedList extends BaseTestCase {
final EcblPerson fromJson = DB.json().toBean(EcblPerson.class, asJson);
assertThat(fromJson.getName()).isEqualTo("Fiona64021");
assertThat(fromJson.getPhoneNumbers()).hasSize(2);
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("BeanList size[2] list[64-021-1234, 64-021-4321]");
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("[64-021-1234, 64-021-4321]");
}
}
@@ -181,6 +181,6 @@ public class TestElementCollectionEmbeddedMap extends BaseTestCase {
final EcbmPerson fromJson = DB.json().toBean(EcbmPerson.class, asJson);
assertThat(fromJson.getName()).isEqualTo("Fiona64021");
assertThat(fromJson.getPhoneNumbers()).hasSize(2);
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("BeanMap size[2] map{home=64-021-1234, work=64-021-4321}");
assertThat(fromJson.getPhoneNumbers().toString()).isEqualTo("{home=64-021-1234, work=64-021-4321}");
}
}
@@ -45,6 +45,6 @@ public class TestElementCollectionEnumSet extends BaseTestCase {
final EcEnumPerson fromJson = DB.json().toBean(EcEnumPerson.class, asJson);
assertThat(fromJson.getName()).isEqualTo("Enum Person");
assertThat(fromJson.getTags()).hasSize(2);
assertThat(fromJson.getTags().toString()).isEqualTo("BeanSet size[2] set[BLUE, RED]");
assertThat(fromJson.getTags().toString()).isEqualTo("[BLUE, RED]");
}
}
@@ -0,0 +1,29 @@
package org.tests.model.history;
import io.ebean.annotation.History;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.OneToOne;
import org.tests.model.draftable.BaseDomain;
@History
@Entity
public class HistoryOneToOne extends BaseDomain {
final String name;
@OneToOne(cascade = CascadeType.REFRESH)
HistorylessOneToOne historylessOneToOne;
public HistoryOneToOne(String name) {
this.name = name;
}
public HistorylessOneToOne less() {
return historylessOneToOne;
}
public String getName() {
return name;
}
}
@@ -0,0 +1,35 @@
package org.tests.model.history;
import org.tests.model.draftable.BaseDomain;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.OneToOne;
@Entity
public class HistorylessOneToOne extends BaseDomain {
private final String name;
/**
* This @OneToOne(mappedBy=...) side should really be FetchType.LAZY
*/
@OneToOne(mappedBy = "historylessOneToOne", cascade = CascadeType.ALL, orphanRemoval = true)//, fetch = FetchType.LAZY)
HistoryOneToOne historyOneToOne;
public HistorylessOneToOne(final String name) {
this.name = name;
}
public HistoryOneToOne getHistoryOneToOne() {
return historyOneToOne;
}
public void setHistoryOneToOne(final HistoryOneToOne historyOneToOne) {
this.historyOneToOne = historyOneToOne;
}
public String getName() {
return name;
}
}
@@ -0,0 +1,90 @@
package org.tests.model.history;
import io.ebean.DB;
import io.ebean.annotation.Platform;
import io.ebean.xtest.BaseTestCase;
import io.ebean.xtest.IgnorePlatform;
import org.junit.jupiter.api.Test;
import java.sql.Timestamp;
import static org.assertj.core.api.Assertions.assertThat;
class TestHistoryOneToOne extends BaseTestCase {
private Long expectedLessId;
private Long expectedHistoryId;
@IgnorePlatform({Platform.ORACLE, Platform.COCKROACH})
@Test
void test() throws InterruptedException {
HistorylessOneToOne historylessOneToOne = new HistorylessOneToOne("less");
historylessOneToOne.setHistoryOneToOne(new HistoryOneToOne("one"));
DB.save(historylessOneToOne);
Thread.sleep(20);
expectedLessId = historylessOneToOne.getId();
expectedHistoryId = historylessOneToOne.getHistoryOneToOne().getId();
findViaHistory();
findViaLess();
findViaLess_fetch();
findViaHistory_fetch();
}
private void findViaLess() {
HistorylessOneToOne lessFetched = DB.find(HistorylessOneToOne.class)
.asOf(new Timestamp(System.currentTimeMillis()))
.findOne();
expected_findViaLess(lessFetched);
}
private void findViaLess_fetch() {
HistorylessOneToOne lessFetched = DB.find(HistorylessOneToOne.class)
.asOf(new Timestamp(System.currentTimeMillis()))
.fetch("historyOneToOne")
.findOne();
expected_findViaLess(lessFetched);
}
private void expected_findViaLess(HistorylessOneToOne lessFetched) {
assert lessFetched != null;
assertThat(lessFetched.getId()).isEqualTo(expectedLessId);
HistoryOneToOne history1 = lessFetched.getHistoryOneToOne();
assertThat(history1.getId()).isEqualTo(expectedHistoryId);
assertThat(history1.less().getId()).isEqualTo(expectedLessId);
assertThat(history1.less().getName()).isEqualTo("less");
assertThat(history1.getName()).isEqualTo("one");
}
private void findViaHistory_fetch() {
HistoryOneToOne oneFetched = DB.find(HistoryOneToOne.class)
.asOf(new Timestamp(System.currentTimeMillis()))
.fetch("historylessOneToOne")
.findOne();
expected_viaHistory(oneFetched);
}
private void findViaHistory() {
HistoryOneToOne oneFetched = DB.find(HistoryOneToOne.class)
.asOf(new Timestamp(System.currentTimeMillis()))
.findOne();
expected_viaHistory(oneFetched);
}
private void expected_viaHistory(HistoryOneToOne oneFetched) {
assert oneFetched != null;
assertThat(oneFetched.getId()).isEqualTo(expectedHistoryId);
assertThat(oneFetched.less().getId()).isEqualTo(expectedLessId);
assertThat(oneFetched.less().getName()).isEqualTo("less");
assertThat(oneFetched.getName()).isEqualTo("one");
}
}
@@ -68,7 +68,7 @@ public class TestQueryJoinOnFormula extends BaseTestCase {
List<String> sql = LoggedSql.stop();
assertEquals(1, sql.size());
assertSql(sql.get(0)).contains("join (select order_id, count(*) as total_items,");
assertSql(sql.get(0)).contains("select count(*) from ( select t0.id from o_order t0 left join (select order_id,");
assertSql(sql.get(0)).contains("select count(*) from ( select t0.id from o_order t0 left join (select order_id,");
}
@Test
@@ -83,7 +83,7 @@ public class TestQueryJoinOnFormula extends BaseTestCase {
shipQuery.findList();
assertSql(shipQuery.getGeneratedSql()).isEqualTo("select t0.id "
+ "from or_order_ship t0 "
+ "left join o_order t1 on t1.id = t0.order_id "
+ "left join o_order t1 on t1.id = t0.order_id "
+ "left join (select order_id, count(*) as total_items, sum(order_qty*unit_price) as total_amount from o_order_detail group by order_id) z_bt1 on z_bt1.order_id = t1.id "
+ "order by z_bt1.total_amount");
}
@@ -100,7 +100,7 @@ public class TestQueryJoinOnFormula extends BaseTestCase {
shipQuery.findList();
assertSql(shipQuery.getGeneratedSql()).isEqualTo("select t0.id "
+ "from or_order_ship t0 "
+ "left join o_order t1 on t1.id = t0.order_id "
+ "left join o_order t1 on t1.id = t0.order_id "
+ "left join (select order_id, count(*) as total_items, sum(order_qty*unit_price) as total_amount from o_order_detail group by order_id) z_bt1 on z_bt1.order_id = t1.id "
+ "where z_bt1.total_amount is not null");
}
@@ -124,7 +124,7 @@ public class TestQueryJoinOnFormula extends BaseTestCase {
"from or_order_ship t0 " +
"join o_order u1 on u1.id = t0.order_id " +
"join or_order_ship u2 on u2.order_id = u1.id " +
"join o_order u3 on u3.id = u2.order_id " +
"join o_order u3 on u3.id = u2.order_id " +
"left join (select order_id, count(*) as total_items, sum(order_qty*unit_price) as total_amount from o_order_detail group by order_id) z_bu3 on z_bu3.order_id = u3.id " +
"where z_bu3.total_amount is not null");
}
@@ -141,7 +141,7 @@ public class TestQueryJoinOnFormula extends BaseTestCase {
shipQuery.findList();
assertSql(shipQuery.getGeneratedSql()).isEqualTo("select t0.id, t1.id, z_bt1.total_amount "
+ "from or_order_ship t0 "
+ "left join o_order t1 on t1.id = t0.order_id "
+ "left join o_order t1 on t1.id = t0.order_id "
+ "left join (select order_id, count(*) as total_items, sum(order_qty*unit_price) as total_amount from o_order_detail group by order_id) z_bt1 on z_bt1.order_id = t1.id "
+ "order by z_bt1.total_amount");
@@ -158,7 +158,7 @@ public class TestQueryJoinOnFormula extends BaseTestCase {
shipQuery.findList();
assertSql(shipQuery.getGeneratedSql()).isEqualTo("select t0.id, t1.id, z_bt1.total_amount "
+ "from or_order_ship t0 "
+ "left join o_order t1 on t1.id = t0.order_id "
+ "left join o_order t1 on t1.id = t0.order_id "
+ "left join (select order_id, count(*) as total_items, sum(order_qty*unit_price) as total_amount from o_order_detail group by order_id) z_bt1 on z_bt1.order_id = t1.id "
+ "where z_bt1.total_amount is not null");
@@ -179,7 +179,7 @@ public class TestQueryJoinOnFormula extends BaseTestCase {
List<String> sql = LoggedSql.stop();
assertEquals(1, sql.size());
assertSql(sql.get(0)).contains("select count(*) from ( select t0.id from o_order t0 left join (select order_id,");
assertSql(sql.get(0)).contains("select count(*) from ( select t0.id from o_order t0 left join (select order_id,");
}
@Test
@@ -6,6 +6,7 @@ import io.ebean.OrderBy;
import io.ebean.Query;
import org.junit.jupiter.api.Test;
import org.tests.model.basic.Order;
import org.tests.model.basic.OrderDetail;
import org.tests.model.basic.ResetBasicData;
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -37,5 +38,18 @@ public class TestOrderByClear extends BaseTestCase {
assertTrue(sql.contains("order by t0.ship_date"));
}
@Test
public void testWithCache() {
ResetBasicData.reset();
Query<OrderDetail> query = DB.find(OrderDetail.class).where().idIn(1,2,3).query();
query.setUseCache(true);
query.findList();
query.order().asc("cretime").findList(); // hit cache
query.order().clear();
query.findList(); // hit cache again
}
}
@@ -12,6 +12,7 @@ import java.io.PrintStream;
import java.net.URL;
import static org.junit.jupiter.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
public class TestFileType extends BaseTestCase {
@@ -184,6 +185,31 @@ public class TestFileType extends BaseTestCase {
DB.delete(bean3);
}
@Test
void test_FileDirty() throws Exception {
SomeFileBean bean0 = new SomeFileBean();
bean0.setName("afile");
bean0.setContent(file);
DB.save(bean0);
SomeFileBean bean1 = DB.find(SomeFileBean.class)
.select("name, file")
.setId(bean0.getId())
.findOne();
assertThat(bean1.getContent())
.isNotEqualTo(file) // not same file object, but same content
.hasSameBinaryContentAs(file);
assertFalse(DB.beanState(bean1).isDirty());
bean1.setContent(file);
assertFalse(DB.beanState(bean1).isDirty());
bean1.setContent(file2);
assertTrue(DB.beanState(bean1).isDirty());
}
private File getFile(String resource) {
URL url = getClass().getResource(resource);
return new File(url.getFile());
@@ -72,11 +72,12 @@
<appender-ref ref="STDOUT"/>
</root>
<logger name="org.tests" level="INFO"/>
<logger name="io.ebean" level="INFO"/>
<logger name="io.avaje.config" level="TRACE"/>
<logger name="io.ebean.docker" level="TRACE"/>
<logger name="io.ebean.test" level="TRACE"/>
<!-- <logger name="io.ebean.DDL" level="DEBUG"/>-->
<!-- <logger name="io.ebean.SQL" level="TRACE"/>-->
+4 -4
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>kotlin querybean generator</name>
@@ -29,7 +29,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
@@ -43,7 +43,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
@@ -64,7 +64,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-ddl-generator</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<scope>test</scope>
</dependency>
+15 -15
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-all</artifactId>
@@ -14,72 +14,72 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-clickhouse</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-db2</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-hana</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-hsqldb</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mysql</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mariadb</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-nuodb</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-oracle</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlanywhere</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlite</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlserver</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-clickhouse</artifactId>
@@ -14,12 +14,12 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-db2</artifactId>
@@ -14,12 +14,12 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-h2</artifactId>
@@ -14,7 +14,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<!-- Provided scope so that the H2HistoryTrigger can live in Ebean core
@@ -36,6 +36,6 @@
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-hana</artifactId>
@@ -14,12 +14,12 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-hsqldb</artifactId>
@@ -14,12 +14,12 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+4 -4
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-mariadb</artifactId>
@@ -14,18 +14,18 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mysql</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-mysql</artifactId>
@@ -14,7 +14,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -27,6 +27,6 @@
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-nuodb</artifactId>
@@ -14,12 +14,12 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-oracle</artifactId>
@@ -14,7 +14,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -27,6 +27,6 @@
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>platforms</artifactId>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-postgres</artifactId>
@@ -14,7 +14,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -27,6 +27,6 @@
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-sqlanywhere</artifactId>
@@ -14,12 +14,12 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-sqlite</artifactId>
@@ -14,12 +14,12 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+3 -3
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>platforms</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<artifactId>ebean-platform-sqlserver</artifactId>
@@ -14,7 +14,7 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
</dependency>
<dependency>
@@ -27,6 +27,6 @@
</dependencies>
<scm>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
</project>
+6 -6
View File
@@ -9,7 +9,7 @@
<groupId>io.ebean</groupId>
<artifactId>ebean-parent</artifactId>
<version>13.2.0</version>
<version>13.3.1</version>
<packaging>pom</packaging>
<name>ebean parent</name>
@@ -18,7 +18,7 @@
<scm>
<developerConnection>scm:git:git@github.com:ebean-orm/ebean.git</developerConnection>
<tag>ebean-parent-13.2.0</tag>
<tag>ebean-parent-13.3.1</tag>
</scm>
<licenses>
@@ -40,14 +40,14 @@
<properties>
<nexus.staging.autoReleaseAfterClose>false</nexus.staging.autoReleaseAfterClose>
<jackson.version>2.13.2</jackson.version>
<h2database.version>2.1.210</h2database.version>
<h2database.version>2.1.212</h2database.version>
<ebean-ddl-runner.version>1.3</ebean-ddl-runner.version>
<ebean-migration-auto.version>1.2</ebean-migration-auto.version>
<ebean-migration.version>13.0.0</ebean-migration.version>
<ebean-test-docker.version>4.5</ebean-test-docker.version>
<ebean-test-docker.version>4.6</ebean-test-docker.version>
<ebean-datasource.version>7.5</ebean-datasource.version>
<ebean-agent.version>13.2.0</ebean-agent.version>
<ebean-maven-plugin.version>13.2.0</ebean-maven-plugin.version>
<ebean-agent.version>13.3.1</ebean-agent.version>
<ebean-maven-plugin.version>13.3.1</ebean-maven-plugin.version>
<surefire.useModulePath>false</surefire.useModulePath>
</properties>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.2.0</version>
<version>13.3.1</version>
</parent>
<name>querybean generator</name>
+19 -11
View File
@@ -1,11 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- <parent>-->
<!-- <groupId>org.avaje</groupId>-->
<!-- <artifactId>java11-oss</artifactId>-->
<!-- <version>2.3</version>-->
<!-- </parent>-->
<groupId>io.ebean</groupId>
<artifactId>test-java16</artifactId>
@@ -13,26 +9,25 @@
<properties>
<maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>
<maven.deploy.skip>true</maven.deploy.skip>
</properties>
<dependencies>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean</artifactId>
<version>13.2.0-SNAPSHOT</version>
<version>13.3.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.10</version>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-test</artifactId>
<version>13.2.0-SNAPSHOT</version>
<version>13.3.1-SNAPSHOT</version>
<scope>test</scope>
</dependency>
@@ -58,11 +53,24 @@
<path>
<groupId>io.ebean</groupId>
<artifactId>querybean-generator</artifactId>
<version>13.2.0-SNAPSHOT</version>
<version>13.3.1-SNAPSHOT</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>io.repaint.maven</groupId>
<artifactId>tiles-maven-plugin</artifactId>
<version>2.24</version>
<extensions>true</extensions>
<configuration>
<tiles>
<tile>io.ebean.tile:enhancement:13.3.0</tile>
</tiles>
</configuration>
</plugin>
</plugins>
</build>
+4 -5
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>org.avaje</groupId>
<artifactId>java11-oss</artifactId>
<version>3.4</version>
<version>3.7</version>
<relativePath/>
</parent>
@@ -19,10 +19,9 @@
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<ebean-maven-plugin.version>12.14.1</ebean-maven-plugin.version>
<ebean-maven-plugin.version>13.3.0</ebean-maven-plugin.version>
<kotlin.version>1.6.0</kotlin.version>
<jackson.version>2.12.1</jackson.version>
<maven.deploy.skip>true</maven.deploy.skip>
</properties>
<dependencies>
@@ -36,14 +35,14 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-test</artifactId>
<version>13.2.0-SNAPSHOT</version>
<version>13.3.1-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.2.0-SNAPSHOT</version>
<version>13.3.1-SNAPSHOT</version>
<scope>test</scope>
</dependency>