Compare commits

...
Author SHA1 Message Date
Rob Bygrave 462d30bbb7 Version 13.19.0 2023-06-07 17:56:19 +12:00
Rob BygraveandGitHub 5466b889a7 Merge pull request #3098 from ebean-orm/deprecated/BeanFinder-server
Refactor ebean-core internal API - getters -> accessors
2023-06-02 09:06:54 +12:00
Rob Bygrave d27d20dd1c Refactor ebean-core internal API - getters -> accessors 2023-06-02 09:03:29 +12:00
Rob BygraveandGitHub b6edc54cd9 Merge pull request #3097 from ebean-orm/deprecated/BeanFinder-server
Refactor ebean-core internal API - getters -> accessors and  tidy
2023-06-01 22:15:52 +12:00
Rob Bygrave 2929483b0d Refactor ebean-core internal API - getters -> accessors 2023-06-01 22:05:53 +12:00
Rob Bygrave 2ab7c3529a Tidy ebean-core internal API
- Remove unused BeanIdList
2023-06-01 21:27:55 +12:00
Rob BygraveandGitHub f409ea2431 Merge pull request #3096 from ebean-orm/deprecated/BeanFinder-server
Deprecate order() methods on Query, ExpressionList - migrate to orderBy()
2023-06-01 21:22:54 +12:00
Rob Bygrave e71be4e1b1 Deprecate order() methods on Query, ExpressionList - migrate to orderBy()
Unfortunately we have order() and orderBy() methods which do the
same thing. I have decided to deprecate the order() ones in
favour of the orderBy() methods so that ultimately we will end
up with less methods and I think orderBy() is the correct choice.

Apologies for the migration pain here.
2023-06-01 21:21:39 +12:00
Rob BygraveandGitHub 507aec20d9 Merge pull request #3095 from ebean-orm/deprecated/BeanFinder-server
No functional change, Expr internal reuse of factory() method
2023-06-01 20:57:55 +12:00
Rob Bygrave 6a2d0c233a No functional change, Expr internal reuse of factory() method 2023-06-01 20:56:13 +12:00
Rob BygraveandGitHub a1db8794bb Merge pull request #3094 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated Query Bean fetchAll() - migrate to fetch()
2023-06-01 20:48:50 +12:00
Rob Bygrave bac7cd1ee7 Remove deprecated Query Bean fetchAll() - migrate to fetch()
```java

  /**
   * Deprecated in favor of fetch().
   */
  @Deprecated
  public final R fetchAll() {
    return fetch();
  }

```
2023-06-01 20:48:13 +12:00
Rob BygraveandGitHub 7ec0c72522 Merge pull request #3093 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated Query setLoadBeanCache() - migrate to setBeanCacheM…
2023-06-01 20:45:34 +12:00
Rob Bygrave 430926c5a9 Remove deprecated Query setLoadBeanCache() - migrate to setBeanCacheMode()
Typically migrate to `.setBeanCacheMode(CacheMode.PUT)` or `.setBeanCacheMode(CacheMode.OFF)`

```java

  /**
   * Deprecated - migrate to use setBeanCacheMode(CacheMode.PUT) or other CacheMode.
   * <p>
   * When set to true all the beans from this query are loaded into the bean cache.
   */
  @Deprecated
  Query<T> setLoadBeanCache(boolean loadBeanCache);

```
2023-06-01 20:44:31 +12:00
Rob BygraveandGitHub a2389be4aa Merge pull request #3092 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated ExpressionList.setOrderBy() - migrate to orderBy()
2023-06-01 20:34:44 +12:00
Rob Bygrave f21caa0755 Remove deprecated ExpressionList.setOrderBy() - migrate to orderBy()
Migrate to `.orderBy(String orderBy)`

```java

  /**
   * Deprecated migrate to {@link #orderBy(String)}
   */
  @Deprecated
  Query<T> setOrderBy(String orderBy);

```
2023-06-01 20:34:04 +12:00
Rob BygraveandGitHub e42d3dac18 Merge pull request #3091 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated DatabaseConfig.defaultOrderById
2023-06-01 20:11:51 +12:00
Rob Bygrave 4c47a84daf Remove deprecated DatabaseConfig.defaultOrderById
Should no longer be used / set to true.

```java

  /**
   * Deprecated - look to have explicit order by. Sets the default orderById setting for queries.
   */
  @Deprecated
  public void setDefaultOrderById(boolean defaultOrderById) {
    this.defaultOrderById = defaultOrderById;
  }

```
2023-06-01 20:09:14 +12:00
Rob BygraveandGitHub 42aaceaafa Merge pull request #3090 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated methods from ProfileLocation
2023-06-01 20:07:01 +12:00
Rob Bygrave e5f7a28d80 Remove deprecated methods from ProfileLocation
These methods are no longer used.
2023-06-01 20:00:50 +12:00
Rob BygraveandGitHub 074a3bacc7 Merge pull request #3089 from ebean-orm/deprecated/BeanFinder-server
Remove deprecated BeanFinder.server, migrate to BeanFinder.database
2023-06-01 19:56:34 +12:00
Rob Bygrave f52a18989c Remove deprecated BeanFinder.server, migrate to BeanFinder.database 2023-06-01 19:54:39 +12:00
Rob Bygrave f415ee22b8 Update javadoc for ExtendedServer 2023-06-01 19:51:31 +12:00
Rob Bygrave 4878ca47b5 Remove deprecated ExtendedServer query methods - use query.usingTransaction() instead
Removing all the deprecated query methods from ExtendedServer. Migrate to passing
the explicit transaction to the query using query.usingTransaction() instead.
2023-06-01 19:45:17 +12:00
Rob BygraveandGitHub 59a3766a53 Merge pull request #3087 from ebean-orm/deprecated/collectMetricsAsJson
Remove deprecated MetaInfoManager.collectMetricsAsJson() - move to co…
2023-06-01 19:36:04 +12:00
Rob Bygrave 15de44eef8 Remove deprecated MetaInfoManager.collectMetricsAsJson() - move to collectMetrics().asJson()
Removing these deprecated methods:
- collectMetricsAsJson() -> collectMetrics().asJson();
- collectMetricsAsData() -> collectMetrics().asData()

```java
  /**
   * Deprecated migrate to collectMetrics().asJson().
   */
  @Deprecated
  default ServerMetricsAsJson collectMetricsAsJson() {
    return collectMetrics().asJson();
  }

  /**
   * Deprecated migrate to collectMetrics().asData().
   */
  @Deprecated
  default List<MetricData> collectMetricsAsData() {
    return collectMetrics().asData();
  }
```
2023-06-01 19:35:03 +12:00
Rob Bygrave 5ae9942dd5 Remove unused and empty ebean-kotlin module
It never got used, may as well clean up and remove it.
2023-06-01 19:26:17 +12:00
Rob BygraveandGitHub bf375f1065 Merge pull request #3086 from ebean-orm/feature/move-components
Remove unused and empty ebean-kotlin module
2023-06-01 19:22:45 +12:00
Rob Bygrave 510e129ff6 Remove unused and empty ebean-kotlin module
It never got used, may as well clean up and remove it.
2023-06-01 19:22:16 +12:00
Rob BygraveandGitHub 1c32b9b0bc Merge pull request #3085 from ebean-orm/feature/move-components
Moved - ebean-autotune, ebean-csv-reader, ebean-joda-time, ebean-jack…
2023-06-01 19:19:39 +12:00
Rob Bygrave f25a20ff90 Moved - ebean-autotune, ebean-csv-reader, ebean-joda-time, ebean-jackson-jsonnode, ebean-externalmapping-xml
These modules have all been moved to ebean-component git repo.
These are all optional modules and will be released at a
slower cadence.
2023-06-01 19:17:14 +12:00
Rob BygraveandGitHub 0ba6753c8c Merge pull request #3084 from ebean-orm/fix/jakarta-transaction
Fix javax-to-jakarta support for jakarta.transaction
2023-06-01 08:26:54 +12:00
Rob Bygrave 7efef027c0 Fix javax-to-jakarta support for jakarta.transaction 2023-06-01 08:24:14 +12:00
Rob Bygrave 3a84695130 Version 13.18.0 2023-05-31 22:06:30 +12:00
Rob BygraveandGitHub 3f6d6908e2 Merge pull request #3081 from ebean-orm/feature/bump-migration-2
Bump ebean-migration to 13.9.0 - changes API for checkState()
2023-05-31 20:53:24 +12:00
Rob Bygrave 9f4bf6103f Bump ebean-migration to 13.9.0 - changes API for checkState()
Code using ebean-migration checkState() methods needs to change
as those methods now return a new MigrationResource interface type
2023-05-31 20:51:28 +12:00
Rob BygraveandGitHub ad7bb7063d Merge pull request #3079 from ebean-orm/feature/bump-migration
Bump ebean-migration to 13.8.0 and ebean-ddl-runner to 2.3
2023-05-29 16:28:44 +12:00
Rob Bygrave 04b4fea559 Bump ebean-migration to 13.8.0 and ebean-ddl-runner to 2.3 2023-05-29 16:27:54 +12:00
Rob BygraveandGitHub eb824949fe Merge pull request #3078 from ebean-orm/feature/refactor-renameDtoMethodUsingAccessors
Refactor internal dto methods to use accessors
2023-05-26 15:24:40 +12:00
robin.bygrave 34db4d0c1f Refactor internal dto methods to use accessors 2023-05-26 15:09:11 +12:00
Rob BygraveandGitHub 54a3113dbc Merge pull request #3077 from ebean-orm/feature/3062-dtoQuery
Use Statement for truncate table and postgres version query
2023-05-26 15:03:52 +12:00
robin.bygrave 7635630808 Use Statement for truncate table and postgres version query 2023-05-26 15:03:13 +12:00
Rob BygraveandGitHub e4018864ac Merge pull request #3075 from ebean-orm/feature/3062-dtoQuery
#3062 - DtoQuery may match the wrong constructor
2023-05-25 21:58:52 +12:00
robin.bygrave 75e69a0a23 #3062 - DtoQuery may match the wrong constructor
When 2 or more Dto constructors clash by argument count
then we need to ignore those constructors.
2023-05-25 21:57:54 +12:00
Rob BygraveandGitHub 6061f80dcc Merge pull request #3074 from ebean-orm/feature/toString_roundBrackets
Change toString to use (trimmed) with round brackets
2023-05-25 21:15:31 +12:00
robin.bygrave c60525a685 Change toString to use (trimmed) with round brackets
Change from use <> angle brackets as with json logger these are escaped which is a little ugly
2023-05-25 21:14:51 +12:00
Rob BygraveandGitHub eef628531a Merge pull request #3073 from ebean-orm/feature/bump-yugabyte
Bump yugabyte version to 2.18.0.0
2023-05-25 21:04:07 +12:00
robin.bygrave 33d9257a61 Bump yugabyte version to 2.18.0.0 2023-05-25 20:56:10 +12:00
robin.bygrave 7b032351b1 Bump yugabyte version to 2.18.0.0 2023-05-25 20:48:50 +12:00
robin.bygrave 265f865a7d Postgres DDL - Use IF NOT EXISTS with ADD COLUMN
Update generated hashes
2023-05-25 20:30:47 +12:00
Rob BygraveandGitHub 73d30310fd Merge pull request #3072 from ebean-orm/feature/postgres-dll-addColumn-ifNotExists
Postgres DDL - Use IF NOT EXISTS with ADD COLUMN
2023-05-25 20:28:41 +12:00
Rob BygraveandGitHub e26fbbb11f Merge branch 'master' into feature/postgres-dll-addColumn-ifNotExists 2023-05-25 20:25:54 +12:00
Rob BygraveandGitHub a548c16789 Merge pull request #3071 from ebean-orm/feature/postres-ddl-varchar-changeSize
Postgres DDL - Don't use cast when just changing varchar column size
2023-05-25 20:23:04 +12:00
robin.bygrave ecf650c9bc Postgres DDL - Use IF NOT EXISTS with ADD COLUMN 2023-05-25 20:22:18 +12:00
robin.bygrave b27b4e7038 Postgres DDL - Don't use cast when just changing varchar column size 2023-05-25 20:00:36 +12:00
Rob BygraveandGitHub 58d190ef12 Merge pull request #3070 from ebean-orm/dependabot/maven/ebean-test/org.xerial-sqlite-jdbc-3.41.2.2
Bump sqlite-jdbc from 3.36.0.3 to 3.41.2.2 in /ebean-test
2023-05-24 09:28:05 +12:00
dependabot[bot]andGitHub bffc9108f9 Bump sqlite-jdbc from 3.36.0.3 to 3.41.2.2 in /ebean-test
Bumps [sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) from 3.36.0.3 to 3.41.2.2.
- [Release notes](https://github.com/xerial/sqlite-jdbc/releases)
- [Changelog](https://github.com/xerial/sqlite-jdbc/blob/master/CHANGELOG)
- [Commits](https://github.com/xerial/sqlite-jdbc/compare/3.36.0.3...3.41.2.2)

---
updated-dependencies:
- dependency-name: org.xerial:sqlite-jdbc
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-23 20:15:29 +00:00
Rob BygraveandGitHub 114a715432 Merge pull request #3068 from FOCONIS/throw-exceptions
DB.refrence throws EntityNotFoundException instead returning null
2023-05-23 19:29:51 +12:00
Rob BygraveandGitHub 67d98954b2 Merge pull request #3069 from ebean-orm/feature/bump-avaje-config
Bump avaje-config to 3.4
2023-05-23 19:28:47 +12:00
Rob Bygrave 53e7aafb06 Bump avaje-config to 3.4 2023-05-23 19:26:29 +12:00
Roland Praml e207b4720b DB.refrence throws EntityNotFoundException instead returning null 2023-05-23 08:37:52 +02:00
Rob BygraveandGitHub af6da23411 Merge pull request #3067 from ebean-orm/feature/2064-jakarta-transaction
#3064 - JtaTransaction does not use jarkarta prefix for javax.transaction classes
2023-05-23 17:11:38 +12:00
robin.bygrave 21f274fd34 #3064 - JtaTransaction does not use jarkarta prefix for javax.transaction classes 2023-05-23 17:09:53 +12:00
Rob BygraveandGitHub 1b8df12a01 Merge pull request #3066 from ebean-orm/feature/3060-part2
From #3060 - Add missing @Nullable to ExpressionList.findSingleAttribute()
2023-05-23 17:00:14 +12:00
robin.bygrave b210d1a6a7 From #3060 - Add missing @Nullable to ExpressionList.findSingleAttribute() 2023-05-23 16:12:13 +12:00
Rob BygraveandGitHub d53ca87d43 Merge pull request #3057 from FOCONIS/property-value-intercept
Property.value use intercept to trigger lazy load
2023-05-23 13:36:09 +12:00
Rob BygraveandGitHub 635820cab5 Merge pull request #3058 from ebean-orm/feature/BeanProperty-value-to-getValue
No functional change, change use of BeanProperty.value() to BeanProperty.getValue()
2023-05-19 16:09:37 +12:00
Rob BygraveandGitHub aedb0fdcac Merge pull request #3063 from ebean-orm/feature/improve-error-message-no-join-columns
Use DeployBeanProperty toString() removing getFullBeanName()
2023-05-19 16:08:54 +12:00
robin.bygrave 4db1925328 No functional change, change use of BeanProperty.value() to BeanProperty.getValue()
Noting that value() currently calls through to getValue() hence
this is no real change. This is done because value() is also
a public method Property.value() [and this should probably
change to use getValueIntercept() rather than getValue()]
2023-05-17 15:31:52 +12:00
Roland Praml 6f2a444954 Property.value use intercept 2023-05-16 15:28:30 +02:00
Rob BygraveandGitHub 59b6621077 Merge pull request #3055 from ebean-orm/feature/queryPlanCaptureMicros
ENH: Add captureMicros and whenCaptured to MetaQueryPlan
2023-05-16 15:38:05 +12:00
Rob BygraveandGitHub 15a39f62e6 Merge pull request #3056 from ebean-orm/bump/yugabyte
Testing - Bump YugabyteDB version for testing to 2.17.3.0-b152
2023-05-16 15:37:29 +12:00
robin.bygrave 40489706ce Testing - Bump YugabyteDB version for testing to 2.17.3.0-b152 2023-05-16 14:39:46 +12:00
robin.bygrave 742f3b6dc4 ENH: Add captureMicros and whenCaptured to MetaQueryPlan
- captureMicros is the time taken to capture the specific query plan
- whenCaptured is the time when the bind values were taken

The DefaultQueryPlanListener logging will include these in the
output it logs
2023-05-16 13:47:27 +12:00
Rob BygraveandGitHub 753617a616 Merge pull request #3039 from FOCONIS/detailed-error-message
Throw excepction when trying to create unregistered bean
2023-05-10 16:37:18 +12:00
Rob BygraveandGitHub 114da00d98 Merge pull request #3040 from FOCONIS/correct-quotes
FIX: Use correct quotes when logging
2023-05-10 16:36:27 +12:00
Rob BygraveandGitHub 283ab7a1ac Merge pull request #3038 from FOCONIS/fix-javadoc-plugin
FIX build on system without JAVA_HOME set
2023-05-10 16:35:39 +12:00
Rob BygraveandGitHub 096988c19f Merge pull request #3052 from ebean-orm/feature/dep-config
Bump jackson dependency to 2.15.0
2023-05-10 16:34:06 +12:00
Rob Bygrave baf727e8ea Bump jackson dependency to 2.15.0 2023-05-10 16:33:38 +12:00
Rob BygraveandGitHub 2eb6558145 Merge pull request #3051 from ebean-orm/feature/dep-config
Bump avaje-config dependency to 3.2
2023-05-10 16:30:39 +12:00
Rob Bygrave d946504503 Bump avaje-config dependency to 3.2 2023-05-10 16:30:03 +12:00
Rob Bygrave ed94edd96b Bump to next snapshot version 2023-05-10 16:26:03 +12:00
Rob BygraveandGitHub 6441030161 Merge pull request #3030 from ebean-orm/feature/bump-avaje-config
Included ebean-migration as a dependency of ebean, ebean-postgres etc
2023-05-10 16:24:54 +12:00
Rob Bygrave 588527a5b9 Version 13.17.4 2023-05-10 00:34:53 +12:00
Rob Bygrave 06cad500c1 #3031 Improve error message 2023-05-10 00:34:27 +12:00
Rob Bygrave e29b57811b Update README add end 2023-05-10 00:30:07 +12:00
Rob Bygrave e6bf46e8c4 Improve error message for #3031 2023-05-09 23:37:05 +12:00
Rob BygraveandGitHub 646f8cc66b Merge pull request #3050 from ebean-orm/feature/LoadBeanRequest
Fix SqlTreeLoadBean to only register new beans into load context
2023-05-09 23:23:31 +12:00
Rob Bygrave 4c9f0f23f0 Fix SqlTreeLoadBean to only register new beans into load context
Additionally, refactor LoadBeanRequest moving the MarkedAsDeleted logging
2023-05-09 22:49:17 +12:00
Rob Bygrave ecfd831603 #3049 - Support for ebean.test.containers.mirror 2023-05-08 17:22:41 +12:00
Rob BygraveandGitHub b8324905ae Merge pull request #3036 from Ryszard-Trojnacki/postgis
Implemented missing cache functions for Postgis module.
2023-05-08 17:15:14 +12:00
Rob BygraveandGitHub 8cbcd1afad Merge pull request #3049 from ebean-orm/feature/ebean.test.containers.mirror
[ebean-test] Add support for ebean.test.containers.mirror
2023-05-08 17:12:22 +12:00
Rob Bygrave 7970ea39f3 Bump to next snapshot version 2023-05-08 17:11:24 +12:00
robin.bygrave a399d4f2cd [ebean-test] Add support for ebean.test.containers.mirror
Can use this property to specify a mirror to use for test images when running in CI

Currently, we assume that for local builds we actually prefer to not use the mirror (for Arm64 support etc)
2023-05-08 14:35:14 +12:00
Rob Bygrave 5b91e671dd Version 13.17.3 2023-05-01 14:51:33 +12:00
Rob Bygrave 547843fd52 Bump ebean-agent to 13.17.3 (no effective change) 2023-05-01 13:30:39 +12:00
Rob BygraveandGitHub 21e9c5c3d4 Merge pull request #3044 from ebean-orm/feature/markedAsDeleted-v3
Modify MarkedAsDeleted to ignore beans added during load
2023-05-01 13:21:36 +12:00
Rob Bygrave 05ab1ba25e Modify MarkedAsDeleted to ignore beans added during load
Adds the additional queryIds.contains(id) check
2023-05-01 13:11:03 +12:00
Roland Praml 82a6ec6957 Fix also other places 2023-04-26 11:11:12 +02:00
Roland Praml cf1c08c4ac FIX: Use correct quotes when logging 2023-04-26 10:59:41 +02:00
Roland Praml d32df16137 Throw excepction when trying to create unregistered bean 2023-04-26 10:56:14 +02:00
Roland Praml 2bcbc6fa07 FIX also other plugin versions 2023-04-26 10:39:18 +02:00
Roland Praml ba9158ec9c Javadoc POM fixes 2023-04-26 10:22:27 +02:00
Ryszard Trojnacki 40a6693a4c Implemented missing cache functions for Postgis module. 2023-04-21 08:58:44 +02:00
Rob Bygrave e04f33aaf0 Bump to next snapshot version 2023-04-21 16:53:12 +12:00
Rob Bygrave e4162a5b03 Version 13.17.2 2023-04-21 16:14:48 +12:00
Rob BygraveandGitHub 23e6b18262 Merge pull request #3035 from ebean-orm/feature/markedAsDeleted-mutateAfterLoadingFlag
Update MarkedAsDeleted logging to included check for loadingStarted
2023-04-21 02:44:39 +12:00
Rob Bygrave c8852c521e Update MarkedAsDeleted logging to included check for loadingStarted 2023-04-21 02:43:34 +12:00
Rob Bygrave 7351258d99 Bump ebean-agent to 13.17.2 (no functional change) 2023-04-21 00:51:57 +12:00
Rob BygraveandGitHub af9f9585fb Merge pull request #3034 from ebean-orm/feature/3033
#3033 - Fix for ConcurrentModificationException introduced in 13.17.1
2023-04-21 00:50:23 +12:00
Rob Bygrave d7f9dd40a0 #3033 - Fix for ConcurrentModificationException introduced in 13.17.1
java.util.ConcurrentModificationException
	at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493)
	at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1516)
	at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:472)
	at java.base/java.lang.String.valueOf(String.java:2951)
	at io.ebeaninternal.server.core.DefaultBeanLoader.loadBean(DefaultBeanLoader.java:134)
	at io.ebeaninternal.server.core.DefaultServer.loadBean(DefaultServer.java:475)
	at io.ebeaninternal.server.loadcontext.DLoadBeanContext$LoadBuffer.loadBean(DLoadBeanContext.java:217)
	at io.ebean.bean.InterceptReadWrite.loadBeanInternal(InterceptReadWrite.java:742)
	at io.ebean.bean.InterceptReadWrite.loadBean(InterceptReadWrite.java:724)
	at io.ebean.bean.InterceptReadWrite.preGetter(InterceptReadWrite.java:837)
	at ...
2023-04-21 00:49:41 +12:00
Rob Bygrave 1ec389864d Included ebean-migration as a dependency of ebean, ebean-postgres etc
Include ebean-migration as a dependency of all the composites. The thinking here is that we now expect to prefer ebean-migration over flyway or liquibase as the migration runner of choice. Including it means one less thing for folks to worry about in terms of syncing the versions to use etc.
2023-04-18 00:12:44 +12:00
Rob BygraveandGitHub d353b98307 Merge pull request #3029 from ebean-orm/feature/bump-avaje-config
Bump avaje-config to version 3.1
2023-04-18 00:04:14 +12:00
Rob Bygrave 3ddd7b4b2b Bump avaje-config to version 3.1 2023-04-18 00:03:35 +12:00
Rob Bygrave 3960e1deb5 Bump test tile use to 13.17.1 2023-04-17 23:56:20 +12:00
Rob Bygrave 84af78e43c Bump parent pom to 3.10 2023-04-17 23:52:36 +12:00
Rob Bygrave cbdbf6d2e0 Bump to next snapshot version 2023-04-17 23:51:58 +12:00
Rob Bygrave 548bf871a9 Version 13.17.1 2023-04-17 23:31:00 +12:00
Rob BygraveandGitHub b5245544d2 Merge pull request #3028 from ebean-orm/feature/markedAsDeleted-beforeState
Change MarkedAsDeleted to log batch before state
2023-04-17 22:40:29 +12:00
Rob Bygrave a986d0c8cd Change MarkedAsDeleted to log batch before state 2023-04-17 22:18:33 +12:00
Rob BygraveandGitHub 0e02449f67 Merge pull request #3027 from rvowles/docs/update-ebean-test
Update the documentation for test tenants
2023-04-17 17:52:48 +12:00
Richard Vowles 19389fb9d4 Update the documentation for test tenants
The existing docs for test tenants is no
longer correct and additional class level
docs point users in the right direction.
2023-04-17 16:22:06 +12:00
Rob BygraveandGitHub ab1a79281b Merge pull request #3023 from ebean-orm/feature/profileLabel-withQueryType
Add the [+query,+cache,+lazy] query type to the profile label
2023-04-13 19:46:27 +12:00
Rob BygraveandGitHub 073669d312 Merge pull request #3025 from ebean-orm/fix/3024
Fix for #3024 NPE when lazy loading after deserialising an entity bean
2023-04-13 19:46:08 +12:00
Rob Bygrave f66662fdfa Fix for #3024 NPE when lazy loading after deserialising an entity bean 2023-04-13 19:42:14 +12:00
Rob Bygrave 04b0d23932 Update tiles-maven-plugin to version 2.34 2023-04-11 10:34:52 +12:00
Rob Bygrave af613d3096 Add the [+query,+cache,+lazy] query type to the profile label 2023-04-06 21:59:51 +12:00
Rob Bygrave ecd27e145e bump to next snapshot version 2023-04-06 17:07:52 +12:00
Rob Bygrave 5f6b4a7795 Version 13.17.0 2023-04-06 15:34:50 +12:00
Rob Bygrave 3d890f5383 Bump ebean-agent to 13.17.0 2023-04-06 15:06:05 +12:00
Rob Bygrave 31a0d9b6a6 Add test only - add PathStackTest 2023-04-06 15:03:14 +12:00
Rob BygraveandGitHub 95fbdf37c6 Merge pull request #3021 from ebean-orm/feature/3020-forUpdateRefresh
#3020 Query.forUpdate() works like REFRESH
2023-04-06 14:11:43 +12:00
Rob BygraveandGitHub 1d09c0864d Merge pull request #3019 from ebean-orm/refactor/method-names-ObjectGraphOrigin
Refactor rename getters to accessors for ObjectGraphOrigin etc
2023-04-06 14:11:23 +12:00
Rob BygraveandGitHub 02f7815e73 Merge pull request #3018 from ebean-orm/refactor/add-final-remove-public-platformHelpers
Refactor platforms adding final and removing public from sequence, history, encryption helpers
2023-04-06 14:11:02 +12:00
Rob BygraveandGitHub 85b700757d Merge pull request #3010 from ebean-orm/feature/support-dynamicFormulaWithIncludes
Add support for dynamic formula with includes
2023-04-06 14:10:26 +12:00
Rob BygraveandGitHub d5838e3d64 Merge pull request #3009 from ebean-orm/build/13-16
Build 13.17.0
2023-04-06 14:09:53 +12:00
Rob Bygrave 01e9eb81cf For testing PostGIS use ghcr.io/baosystems/postgis:15 docker image
This is a fork of the official PostGIS docker that support multi-architectures
and more specifically ARM
2023-04-04 22:40:02 +12:00
Rob Bygrave 1daad7af06 #3020 Query.forUpdate() works like REFRESH
Query.forUpdate() will load data into beans existing in the persistence context.
In discussion the thinking is that we can think of this as a bug fix.
2023-04-01 13:24:37 +13:00
Rob Bygrave e51d6984fe Refactor rename getters to accessors for BeanCollection, EntityBeanIntercept etc 2023-03-31 10:42:21 +13:00
Rob Bygrave c2777b0e27 Refactor rename getters to accessors for ObjectGraphOrigin etc 2023-03-30 23:58:22 +13:00
Rob Bygrave 505f87c524 Refactor platforms adding final and removing public from sequence, history, encryption helpers
In theory no is customising these classes and probably should have their own copy of them if
they are doing do. Thus making these types final and package protected.
2023-03-30 23:40:53 +13:00
Rob Bygrave 4a372a5dc8 Remove unused import 2023-03-30 13:13:09 +13:00
Rob Bygrave 8e864897bd Bump to next snapshot version 2023-03-30 13:00:55 +13:00
Rob Bygrave 87b12cff93 Version 13.16.0 2023-03-29 22:48:06 +13:00
Rob BygraveandGitHub 14ea5521c4 Merge pull request #3015 from ebean-orm/fix/3012-shutdown-leak
Fix for #3012 Manual server shutdown leads to memory leak
2023-03-29 21:11:07 +13:00
Rob Bygrave e1522df8a5 Fix for #3012 Manual server shutdown leads to memory leak
The issue being that shutdown() // with no args was
not calling ShutdownManager.unregisterDatabase(this)
noting that shutdown(boolean, boolean) did.

This change merges the old shutdownInternal(boolean, boolean)
method into shutdown(boolean, boolean) and simplifies
shutdown() to just call shutdown(boolean, boolean).
2023-03-29 20:59:23 +13:00
Rob Bygrave b4f309c219 Bump ebean-agent to 13.16.0 2023-03-29 20:33:40 +13:00
Rob BygraveandGitHub 181c6a9d4b Merge pull request #3014 from ebean-orm/fix/autotune-key
[autotune] Fix key on CallStack - regression from introduction of StackWalker.StackFrame
2023-03-29 20:00:06 +13:00
Rob BygraveandGitHub 203aa52c2f Merge pull request #3013 from ebean-orm/feature/update-autotune-test
Update tests for Autotune
2023-03-29 19:36:42 +13:00
Rob Bygrave ad3e88c562 Update tests for Autotune 2023-03-29 19:31:46 +13:00
Rob Bygrave adb302059b [autotune] Fix key on CallStack - regression from introduction of StackWalker.StackFrame 2023-03-29 19:30:56 +13:00
Rob Bygrave 2d03421de4 Use DeployBeanProperty toString() removing getFullBeanName() 2023-03-28 18:44:00 +13:00
Rob BygraveandGitHub 9506e6456c Merge pull request #3011 from ebean-orm/feature/improve-error-message-no-join-columns
Improve the error message "No join columns found" to include the relationship
2023-03-27 21:45:46 +13:00
Rob Bygrave 4617ea2c1c Improve the error message "No join columns found" to include the relationship 2023-03-27 21:44:23 +13:00
Rob Bygrave 55d7eb55d2 Add support for dynamic formula with includes
e.g.

DB.find(ChildPerson.class)
  .select("name, coalesce(someBean, parent.someBean) as effectiveBean") // include parent
  .findList();
2023-03-25 15:49:17 +13:00
Rob BygraveandGitHub 7feb193e95 Merge pull request #3007 from ebean-orm/refactor/rename-loadContext-methods
Refactor rename methods in LoadContext
2023-03-25 15:39:40 +13:00
Rob BygraveandGitHub ab8915b374 Merge pull request #3008 from ebean-orm/feature/expressionRequest-refactor
Refactor SpiExpressionRequest
2023-03-25 15:31:09 +13:00
Rob Bygrave 79fd689e9a Add support for raw SQL SubQuery expressions IN,EQ,NE,GT,GE,LT,LE,EXISTS,Not IN, Not EXISTS
For these expressions the SQL SubQuery is not parsed by ebean and
just used as is.
2023-03-24 22:38:52 +13:00
Rob Bygrave a68665a37e Refactor rename methods on SpiExpressionRequest, DeployParser etc 2023-03-24 19:57:21 +13:00
Rob Bygrave 9ff240dc10 Refactor SpiExpressionRequest split parse() into property() and path() to have fast path
property() uses a fast path for the common case that the expression is a bean property path.
This will then fall back to using parse() when that isn't the case.
2023-03-24 19:35:11 +13:00
Rob Bygrave 9982fa3682 Refactor SpiExpressionRequest split append() into append() and parse()
- append() adds to the sql with NO parsing
- parse() adds to the sql with parsing to replace logical bean paths into table alias placeholder + db column
2023-03-24 17:37:34 +13:00
Rob Bygrave f7a11135a5 Refactor rename methods in LoadContext
Rename internal methods only
2023-03-23 22:11:02 +13:00
Rob Bygrave c29a81248a Remove internal asserts on DLoadBeanContext bufferLock 2023-03-23 22:07:59 +13:00
Rob Bygrave ef6d1dbca3 Bump to next snapshot version 2023-03-23 01:12:10 +13:00
Rob Bygrave 60a84b7a38 Version 13.15.2 2023-03-22 23:33:48 +13:00
Rob Bygrave fa3e9e6fc6 Bump ebean-agent to 13.15.2 2023-03-22 23:30:28 +13:00
Rob BygraveandGitHub 8ca44edf9c Merge pull request #3006 from ebean-orm/fix/3005-rawSql-select
Fix for #3005 - Regression, Invalid SQL with RawSql in 13.15.0 due o #2996
2023-03-22 23:25:33 +13:00
Rob Bygrave fcefd94086 Fix for #3005 - Regression, Invalid SQL with RawSql in 13.15.0 due to #2996 2023-03-22 23:18:18 +13:00
Rob Bygrave 70e5d57b7e Bump to next snapshot version 2023-03-21 23:32:21 +13:00
Rob Bygrave cc3b9c9508 Version 13.15.1 2023-03-21 21:17:08 +13:00
Rob Bygrave be49be38d0 Bump ebean-agent to 13.15.1 2023-03-21 20:45:59 +13:00
Rob BygraveandGitHub dca13db945 Merge pull request #3002 from ebean-orm/feature/improveLogging-markedAsDeleted
Improve the logging around MarkedAsDeleted
2023-03-21 20:43:12 +13:00
Rob Bygrave bd318a5d85 Improve the logging around MarkedAsDeleted 2023-03-21 20:30:39 +13:00
Rob BygraveandGitHub 4c2be2986a Merge pull request #3000 from FOCONIS/bugfix-fix-json-import
FIX: DB.json().toBean(target) can update existing lists (#85)
2023-03-18 10:22:18 +13:00
3d7bebd244 FIX: DB.json().toBean(target) can update existing lists (#85)
* FIX: DB.json().toBean(target) can update existing lists

* remove sys.print, typo

---------

Co-authored-by: Roland Praml <roland.praml@foconis.de>
Co-authored-by: Juri Skrobko <juri.skrobko@foconis.de>
2023-03-17 11:04:53 +01:00
Rob Bygrave e23bbf5f94 Revert test sqlserver docker image to 2017-CU28-ubuntu-16.04 2023-03-17 19:18:53 +13:00
Rob Bygrave 27b0c33a4b Adjustments for SqlServer using BIGINT 2023-03-17 18:51:33 +13:00
Rob Bygrave 53ef159d06 Bump Postgres docker image to 15 2023-03-17 18:50:52 +13:00
Rob Bygrave a7d778d98b Merge branch 'master' of github.com:ebean-orm/ebean 2023-03-17 18:14:17 +13:00
Rob Bygrave 19580ff83d Bump SqlServer docker image to 2022-RTM-CU2-ubuntu-20.04 2023-03-17 18:14:02 +13:00
Rob BygraveandGitHub a79a44c513 Merge pull request #2999 from ebean-orm/feature/2998-sqlserver-bigint
#2998 - SQLServer, map java long to BIGINT for bitwise expressions
2023-03-17 18:04:32 +13:00
Rob Bygrave 184b82e1b2 Fix test TestRawSqlQuerySelect for SqlServer
The order by not supported here by SqlServer
2023-03-17 18:03:37 +13:00
Rob Bygrave 04e935acd0 #2998 - SQLServer, map java long to BIGINT for bitwise expressions 2023-03-17 17:54:25 +13:00
Rob Bygrave 142ffe925c Fix test TestRawSqlQuerySelect to support multiple databases 2023-03-16 09:06:09 +13:00
Rob Bygrave 395505ec0d Bump to 13.15.1-SNAPSHOT 2023-03-14 16:57:17 +13:00
Rob Bygrave c21a76fa5b Version 13.15.0 2023-03-14 12:54:53 +13:00
Rob Bygrave a2690fdccd #2995 - Change DatabaseConfig.getClasses() to return a Set
The thinking is that it is safer to make this API change
rather than to return a shallow copy which you won't be
able to detect.
2023-03-14 11:56:01 +13:00
Rob BygraveandGitHub 4039c20462 Merge pull request #2996 from ebean-orm/buchtajz-query_select_bugs
Add support for specifying select clause with RawSql
2023-03-14 11:48:40 +13:00
Rob BygraveandGitHub 6d43028fba Merge pull request #2995 from ebean-orm/feature/config-isLoadModuleInfo
Change such that querybean generated class registration can be used with explicit class registration
2023-03-14 11:48:09 +13:00
Rob Bygrave efcee7e739 Improve test asserts for lazy loading element collection 2023-03-10 21:33:58 +13:00
Rob Bygrave 523fe6ae54 #2946 - Support specify select clause for RawSql 2023-03-10 20:31:54 +13:00
Rob Bygrave 8ec031bfde Merge branch 'query_select_bugs' of github.com:buchtajz/ebean into buchtajz-query_select_bugs 2023-03-10 19:38:26 +13:00
Rob Bygrave cd938fd659 Bump github actions versions on all build.yml 2023-03-10 14:17:38 +13:00
Rob Bygrave 837e296451 Bump github actions versions on build.yml 2023-03-10 14:14:31 +13:00
Rob Bygrave 52b0bd7b7d Bump kotlin version to 1.8.10 2023-03-10 13:57:14 +13:00
Rob Bygrave a8cad4f3d9 Change such that querybean generated class registration can be used will explicit class registration
In DatabaseConfig.isAutoLoadModuleInfo() it only used the querybean generated class registration is classes.isEmpty(). Changing this so that it only uses the loadModuleInfo flag.

This means, unless loadModuleInfo is set to false the classes that register with ebean will be a combination of both the explicitly registered ones plus the classes from the querybean generated EbeanEntityRegister.

In addition, this changes the classes from List to Set.
2023-03-10 11:01:46 +13:00
Rob Bygrave e4cb81cbba Bump to 13.14.2-SNAPSHOT 2023-03-10 00:26:34 +13:00
Rob Bygrave 08cd0aa4b7 Fix the jakarta <-> javax scripts with space after sed -i 2023-03-10 00:22:13 +13:00
Rob Bygrave b565a5843e Version 13.14.1 2023-03-09 21:38:47 +13:00
Rob Bygrave 79c96c9ec1 Improve error message in InterceptReadWrite when lazy loading and no default server registered 2023-03-09 17:14:36 +13:00
Rob BygraveandGitHub b703b683d8 Merge pull request #2994 from ebean-orm/feature/ErrorNoAttributeConverter
Throw IllegalStateException when @Convert on property but there is no…
2023-03-09 16:28:20 +13:00
Rob Bygrave 456eb3aca9 Throw IllegalStateException when @Convert on property but there is no AttributeConverter registered for that type 2023-03-09 16:27:41 +13:00
Rob BygraveandGitHub 54c35300d4 Merge pull request #2992 from ebean-orm/feature/iae-batch-lazy-load
Fix for IndexOutOfBoundsException: The size must be at least 1
2023-03-09 09:59:12 +13:00
Rob Bygrave dfc5963e35 Fix for IndexOutOfBoundsException: The size must be at least 1
Stack trace observed:

java.lang.IndexOutOfBoundsException: The size must be at least 1
    at io.ebeaninternal.server.deploy.id.IdBinderSimple.getIdInValueExpr(IdBinderSimple.java:135)
    at io.ebeaninternal.server.deploy.BeanDescriptor.parentIdInExpr(BeanDescriptor.java:1634)
    at io.ebeaninternal.server.deploy.BeanPropertyAssocManySqlHelp.addWhereParentIdIn(BeanPropertyAssocManySqlHelp.java:121)
    at io.ebeaninternal.server.deploy.BeanPropertyAssocMany.addWhereParentIdIn(BeanPropertyAssocMany.java:342)
    at io.ebeaninternal.api.LoadManyRequest.createQuery(LoadManyRequest.java:90)
    at io.ebeaninternal.server.core.DefaultBeanLoader.loadMany(DefaultBeanLoader.java:39)
    at io.ebeaninternal.server.core.DefaultServer.loadMany(DefaultServer.java:475)
    at io.ebeaninternal.server.loadcontext.DLoadManyContext$LoadBuffer.loadMany(DLoadManyContext.java:215)
    at io.ebean.common.AbstractBeanCollection.lazyLoadCollection(AbstractBeanCollection.java:90)
    at io.ebean.common.BeanList.init(BeanList.java:141)
    at io.ebean.common.BeanList.iterator(BeanList.java:327)
2023-03-09 09:57:41 +13:00
Rob Bygrave 36777d5a3d No effective change - static import for log level 2023-03-09 09:41:20 +13:00
Rob BygraveandGitHub 12b028fc43 Merge pull request #2991 from ebean-orm/feature/bom-add-spring-txn
Add ebean-spring-txn to ebean-bom
2023-03-07 20:33:07 +13:00
Rob Bygrave 72b2f30f2d Add ebean-spring-txn to ebean-bom 2023-03-07 20:23:34 +13:00
Rob Bygrave 1de74ac366 Change ebean-spring-txn to be a submodule and use junit5 2023-03-07 01:13:06 +13:00
Rob Bygrave 07cb243db3 Merge remote-tracking branch 'ebean-spring-txn/master' 2023-03-07 01:00:07 +13:00
Rob Bygrave 9a02618b67 Move into ebean-spring-txn subdirectory 2023-03-07 00:56:28 +13:00
Rob Bygrave 801cb6fa73 Bump to 13.14.0 2023-03-07 00:36:46 +13:00
Rob Bygrave 1c8a416de0 Use ebean-core as provided dependency
- ebean-core as provided dependency
- ebean-h2 as test dependency
2023-03-07 00:21:19 +13:00
Rob BygraveandGitHub c30a8c79a2 Merge pull request #2990 from ebean-orm/feature/move-kotlin-tests
Move tests from kotlin-querbean-generator to the test-kotlin module
2023-03-03 23:38:36 +13:00
Rob Bygrave 35cb4356c5 Move tests from kotlin-querbean-generator to the test-kotlin module 2023-03-03 23:34:51 +13:00
Rob Bygrave a73c985315 Bump to next snapshot version 2023-03-01 12:50:53 +13:00
Rob Bygrave b5fbfbf1b6 Version 13.14.0 2023-03-01 00:08:52 +13:00
Rob BygraveandGitHub 4471607b2d Merge pull request #2989 from ebean-orm/fix/queryBeans-inheritance-parentOnlyHasDiscriminatorValue
[QueryBeans] Generate the query beans as final classes
2023-02-28 23:16:14 +13:00
Rob Bygrave e4c4b0b43d [QueryBeans] Generate the query beans as final classes 2023-02-28 23:15:42 +13:00
Rob BygraveandGitHub d7ffc4bbb5 Merge pull request #2988 from ebean-orm/fix/queryBeans-inheritance-parentOnlyHasDiscriminatorValue
[QueryBeans] Fix for missing inherited properties when parent only has @DiscriminatorValue
2023-02-28 23:06:03 +13:00
Rob Bygrave 0bb2f104a4 [QueryBeans] Fix for missing inherited properties when parent only has @DiscriminatorValue
A parent in the Inheritance hierarchy has @DiscriminatorValue but not the @Inheritance annotation. The bug means the inherited properties are not included on the generated query bean.

The fix is to the querybean-generator to pick up inherited properties for this case.
2023-02-28 23:02:19 +13:00
Rob BygraveandGitHub ac3ca8113d Merge pull request #2987 from ebean-orm/feature/querybeans-refactor-assoc
[QueryBeans] Refactor splitting TQAssocBean into TQAssoc & TQAssocBean
2023-02-28 21:56:35 +13:00
Rob Bygrave 4ec46e3008 [QueryBeans] Refactor splitting TQAssocBean into TQAssoc & TQAssocBean
- Requires ebean-agent to be up-to-date (13.13.2 or greater)
- Split TQAssocBean into 2, one for embeddable beans and the other for the reset
- The eq(), in() etc expressions go to TQAssoc
- Add fetch() methods to TQAssocBean
- No longer generate the fetch() methods as we now have them on TQAssocBean
2023-02-27 17:46:11 +13:00
Rob Bygrave e9ab0f34f3 Next snapshot version 2023-02-27 16:57:38 +13:00
Rob Bygrave 2143ebc21c Bump ebean-agent to 13.13.2 2023-02-27 15:49:41 +13:00
Rob BygraveandGitHub 7dd25344ef Merge pull request #2986 from ebean-orm/feature/querybeans-assoc-supportInterfaceUse
[querybeans] Add support for using interface types with querybean expressions eq() in() etc WHEN entity beans implement an interface
2023-02-27 15:29:07 +13:00
Rob Bygrave c381464316 querybean-generation - cast for varargs use and use wildcard collections 2023-02-27 15:24:59 +13:00
Rob Bygrave a5d5549f2c [querybeans] Add support for using interface types with querybean expressions eq() in() etc WHEN entity beans implement an interface
- For the case where entity beans implement an interface
- Adds these expressions to the "associated" querybeans (not the root querybeans).
- The expressions added use of the interface type
2023-02-27 13:12:52 +13:00
Rob BygraveandGitHub d7d144b908 Merge pull request #2985 from ebean-orm/feature/querybean-assoc-eqIfPresent
For querybean associated beans, add missing eqIfPresent() + in() + notIn() + expressions
2023-02-26 19:28:55 +13:00
Rob Bygrave 25416a3cda For querybean associated beans, add missing eqIfPresent() + in() + notIn() + expressions 2023-02-26 19:24:00 +13:00
Rob Bygrave e6b0306bde Fix test TestStdFunctions for Oracle which only supports 2 parameters with concat() 2023-02-25 01:06:40 +13:00
Rob Bygrave 2d6ca4bb1e Fix build of test-java16 module for JDK 16+ 2023-02-25 00:25:05 +13:00
Rob Bygrave 99d5f4f01c Bump to next version 13.13.2 2023-02-24 23:56:44 +13:00
rob 8ea0936da8 Tighten Javax to Jakarta escaping the periods 2023-02-23 20:43:50 +13:00
Rob BygraveandGitHub f8fc94c694 Merge pull request #2984 from ebean-orm/feature/jakarta-javax-sed-conversion
Javax to Jakarta (+ reverse) conversion via sed
2023-02-23 12:28:40 +13:00
rob bac3fd6874 Javax to Jakarta (+ reverse) conversion via sed 2023-02-23 01:28:50 +13:00
Rob BygraveandGitHub 0659d7604c Merge pull request #2980 from FOCONIS/fix-logger
FIX: do not format log messages, when no parameter was specified
2023-02-22 23:38:08 +13:00
Rob BygraveandGitHub a825e50584 Merge pull request #2983 from ebean-orm/feature/profileLocationWithLineNumbers
ENH: Add profile-line-number-mode with options none | all | auto ... to control adding line numbers to profile locations
2023-02-22 23:35:42 +13:00
Rob BygraveandGitHub 94f24f054e Merge pull request #2982 from ebean-orm/feature/revert-revision
Revert the use of ${revision} in poms to plain old version dur to issues not being able to use mvn --rf --resume-from ... as it complains about the parent pom version
2023-02-22 23:19:15 +13:00
rob 989d82813b Revert the use of ${revision} in poms to plain old version dur to issues not being able to use mvn --rf --resume-from ... as it complains about the parent pom version 2023-02-22 23:17:42 +13:00
rob 2e0dba3741 #2981 - ENH: Add profile-line-number-mode with options none | all | auto ... to control adding line numbers to profile locations 2023-02-22 23:02:42 +13:00
Roland Praml 56360f0fb3 use captureLogger 2023-02-22 09:20:04 +01:00
Roland Praml d84f2eea58 FIX: do not format log messages, when no parameter was specified 2023-02-22 09:07:49 +01:00
rob 34dc4375da Tidy existing given that lineNumber in SpiProfileLocationFactory always comes in as 0
The history behind this is that originally there was a "profileId" concept where that was a int value that could be used as an "id" for a transactional method that we wanted to profile.

That went away and then the idea was that bytecode enhancement would determine the line number and we would use that but that was a bad idea and we ended up with lineNumber always as 0.

These days with StackWalker and DProfileLocation we can do this better that way so yeah. A followup to this is to add to the api a boolean flag as to whether a profile location should be with line numbers (which can change frequently due to refactoring etc)
2023-02-22 15:22:58 +13:00
Rob BygraveandGitHub 9e186698fe Merge pull request #2979 from ebean-orm/feature/ifPresentExpressions
ENH: Add _ifPresent() expressions for GT, GE, LT, LE (follow up from #2768)
2023-02-22 14:11:50 +13:00
rob 0b615a79cc Add _ifPresent() expressions for GT, GE, LT, LE (follow up from #2768) 2023-02-22 14:04:26 +13:00
Rob BygraveandGitHub 6e98486a03 Merge pull request #2978 from ebean-orm/feature/stackWalker
Use StackWalker for ProfileLocation and CallOrigin
2023-02-21 14:35:58 +13:00
rob b0364f3c42 Use StackWalker for ProfileLocation and CallOrigin 2023-02-21 14:21:18 +13:00
buchtajzandGitHub 8c47ba89d1 Merge branch 'ebean-orm:master' into query_select_bugs 2023-02-21 00:04:39 +01:00
Rob BygraveandGitHub 8ed871f116 Merge pull request #2977 from ebean-orm/feature/pom-versioning
Modify poms to use ${revision} for parent pom version
2023-02-20 10:23:59 +13:00
rob f493c7e8cf Modify poms to use ${revision} for dependencies versions and annotation processor versions 2023-02-20 10:19:14 +13:00
rob 0e596fd87f Modify poms to use ${revision} for parent pom version 2023-02-20 10:09:41 +13:00
Rob BygraveandGitHub 37154cf4d4 Merge pull request #2975 from ebean-orm/feature/config-getOptional
Tidy internals, use Config.getOptional() when reading datasource.default / ebean.default.datasource
2023-02-20 09:17:45 +13:00
rob fe241d8cce Tidy internals, use Config.getOptional() when reading datasource.default / ebean.default.datasource 2023-02-20 09:07:45 +13:00
Rob Bygrave efaa771bb4 Modify test-kotlin to use ebean maven plugin 13.13.0 (for jakarta) 2023-02-20 01:15:10 +13:00
Rob Bygrave 4094b1e345 Remove ebean-api optional dependency on javax.transaction as it isn't required here
Note that it is an optional dependency of ebean-core via the JtaTransaction/JtaTransactionManager that are in ebean core
2023-02-20 00:53:14 +13:00
Rob Bygrave 8bb9ec0cfe Bump the maven tiles used in tests to 13.12.0 2023-02-19 23:21:39 +13:00
rob a9575048b4 Change to support Ebean 13.13.0
FYI: Also put the provided slf4j-api back to 1.7.x to see the logs when running tests
2023-02-17 21:02:46 +13:00
rob 86bcfa804b Remove github wf build for jdk 18 EA as that has been replaced by the other EA build 2023-02-15 11:17:12 +13:00
rob b6a3c54e99 Add build badge for DB2 LUW 2023-02-15 11:12:35 +13:00
rob 6753e36327 Bump versions after release 2023-02-15 10:54:18 +13:00
rob e78ac677f6 [maven-release-plugin] prepare for next development iteration 2023-02-15 10:22:46 +13:00
rob 19d2b04175 [maven-release-plugin] prepare release ebean-parent-13.13.0 2023-02-15 10:22:38 +13:00
rob d1844c9b5a Use kotlin-querybean-generator 13.13.0-RC1 for release 2023-02-15 10:18:01 +13:00
rob 93803eade4 Put the test kotlin-querybean-generator version back 1 for release plugin 2023-02-15 10:07:30 +13:00
rob 82fd6dc65f Add badges to README 2023-02-14 23:24:09 +13:00
rob ca6171f697 Ignore TestStdFunctions.concatEq for DB2 2023-02-14 22:39:26 +13:00
rob 5b4ff2627c Bump provided spring dependency to latest in 5.3 to avoid security pings on the older dependency 2023-02-14 22:36:27 +13:00
rob 2aa92d63fd Bump test dependency Jackson 2023-02-14 22:32:04 +13:00
rob 658b5b7e06 Bump version to 13.10.0 2023-02-14 22:29:45 +13:00
rob 4e3cd83e36 #33 - Update internals from using deprecated TransactionSynchronizationAdapter to TransactionSynchronization 2023-02-14 22:29:02 +13:00
rob aa80bc0c10 Bump version to 13.13.0-SNAPSHOT 2023-02-14 20:28:45 +13:00
rob 638cfbca5e Bump ebean-agent to 13.13.0 2023-02-14 20:27:29 +13:00
rob afa9d89cfe #2971 - Bump ebean-datasource to 8.5 - use connection.setSchema() rather than connection Properties 2023-02-14 19:48:03 +13:00
Rob BygraveandGitHub 22a433997e Merge pull request #2970 from ebean-orm/feature/bump-ebean-migration
Bump ebean-migration to 13.7.0 - DB2 uses logical lock due to reorg tables
2023-02-14 19:44:39 +13:00
rob b9d8a9c532 Bump ebean-migration to 13.7.0 - DB2 uses logical lock due to reorg tables 2023-02-14 19:43:41 +13:00
rob 1f0191b9e4 Tidy ebean-test internals, final classes and whitespace 2023-02-14 19:41:45 +13:00
Rob BygraveandGitHub 2d78c5c5e8 Merge pull request #2969 from ebean-orm/feature/registerTestTenantProvider-default-false
#2968 - [ebean-test] - Default ebean.test.registerTestTenantProvider = false ... by default not auto register a test TenantProvider
2023-02-14 19:40:15 +13:00
rob 7c54d21760 #2968 - [ebean-test] - Default ebean.test.registerTestTenantProvider = false ... by default not auto register a test TenantProvider 2023-02-14 19:34:35 +13:00
Rob BygraveandGitHub b9a502ca85 Merge pull request #2957 from FOCONIS/detailed-evict-stats
ENH: add statistics trimmedByGC/LRU/TTL/Idle to ServerCacheStatistics?
2023-02-14 16:29:35 +13:00
rob b622d85292 #2967 - [ebean-joda] Joda JSON ISO8601 format for DateMidnight includes timezone 2023-02-14 15:56:45 +13:00
rob 320ffb4a2d #2966 - DateTimeParseException when ScalarTypeJodaLocalDateTime parsing Json ISO8601 2023-02-14 15:50:13 +13:00
Rob BygraveandGitHub 0292b4b558 Merge pull request #2912 from ebean-orm/wip/spi-txn-logging
Refactoring SpiLogger to better support conditional logging
2023-02-14 15:03:47 +13:00
rob 2c8ae16179 Update to use String format and Object varargs 2023-02-14 14:54:23 +13:00
Rob BygraveandGitHub 381ac58eed Merge pull request #2936 from FOCONIS/mem-leak-streaming-queries
BUG: Memory-leak on streaming queries when LoadBuffers are not aligned
2023-02-14 11:45:29 +13:00
rob af9459e41e Fix build for kotlin-querybean-generator annotation processor version, didn't get bumped after release 2023-02-14 11:42:47 +13:00
rob 5882169641 Merge branch 'feature/StdExpressions' 2023-02-14 11:35:31 +13:00
rob f694f2946a Rename test to StdOperatorsTest 2023-02-14 11:34:00 +13:00
rob 4c0144de61 Fix SqlOperators for sql injection 2023-02-14 11:33:28 +13:00
rob 5e70ea5095 Bump test version after release 2023-02-14 08:24:30 +13:00
rob acb28925f2 [maven-release-plugin] prepare for next development iteration 2023-02-14 08:07:15 +13:00
rob 3d2a68782c [maven-release-plugin] prepare release ebean-parent-13.12.0 2023-02-14 08:07:07 +13:00
rob 8c97d4d0fe Bump version to 13.12.0-SNAPSHOT 2023-02-14 08:02:35 +13:00
rob eb7de343a8 #2963 - [ebean-agent] By default enable @DbArray to be nullable and @Transient field initialisation when generating default constructors 2023-02-14 08:01:48 +13:00
Rob Bygrave 4ca1645f9f #2963 - [ebean-agent] By default enable @DbArray to be nullable and @Transient field initialisation when generating default constructors 2023-02-13 22:08:30 +13:00
Rob Bygrave d1fe79005c bump test versions after release 2023-02-13 15:51:31 +13:00
Rob Bygrave 015ee44de3 [maven-release-plugin] prepare for next development iteration 2023-02-13 13:34:22 +13:00
Rob Bygrave 714bbadbc0 [maven-release-plugin] prepare release ebean-parent-13.11.4 2023-02-13 13:34:14 +13:00
Rob Bygrave 9e811e9aef bump ebean-agent to 13.11.4 2023-02-13 13:25:33 +13:00
Rob Bygrave f97dcb60c0 Improve test only, QCustomerTest using AttributeConverter 2023-02-13 08:08:16 +13:00
Michal Buchtík 1af3d0bcf3 remove unnecessary replace 2023-02-10 12:27:10 +01:00
Michal Buchtík 01a0cee3c2 patch RawSql query builder, fix tests 2023-02-10 12:17:40 +01:00
Michal Buchtík f26feec3d9 Merge remote-tracking branch 'origin/master' into query_select_bugs 2023-02-10 09:33:28 +01:00
Rob Bygrave 65c76cb2c0 Fix test to support SqlServer using sequences 2023-02-10 14:22:11 +13:00
Rob Bygrave 874427dac1 Fix test to also support Postgres ANY 2023-02-10 14:19:35 +13:00
Rob BygraveandGitHub 1176c2e97a Merge pull request #2962 from ebean-orm/feature/2961
#2961 - Followup for #2952 - @OneToMany + orphanRemoval + @SoftDelete + non-BeanCollection collection results in hard deletes
2023-02-10 13:10:01 +13:00
Rob Bygrave 44e0585fb7 #2961 - Followup for #2952 - @OneToMany + orphanRemoval + @SoftDelete + non-BeanCollection collection results in hard deletes
As noted in comments in #2952

In the internals of SaveManyBeans we have:

- BUG: the deleteByParentId is hard delete and does not care for soft delete
- YUK: internally we have 3 ways of performing the orphan removal when we really want 2

This change fixes the BUG and fixes the YUK. It does this by removing the special case at: https://github.com/ebean-orm/ebean/blob/ebean-parent-13.11.3/ebean-core/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java#L347-L350 ... and replacing it with the more common orphan removal code used when we do not have BeanCollection modifications.

The result of this change is that in SaveManyBeans internals we get back to have 2 ways to remove orphans.

- A BeanCollection with modifications: Orphans explicitly deleted using the known elements removed from the collection
- All other cases: Orphans as everything NOT in the collection that is going to be updated
2023-02-10 13:08:44 +13:00
Rob BygraveandGitHub 889c0f12e0 Merge pull request #2960 from ebean-orm/buchtajz-one2many_setArraylist
Fix for @OneToMany orphanRemoval not occurring for #2952 #2953
2023-02-10 13:01:55 +13:00
Rob Bygrave 0135263dbd Style only for SaveManyBeans switching order in if/else 2023-02-09 23:45:27 +13:00
Rob Bygrave 564194042b No effective change, BeanCollectionUtil perform the instanceof Collection before instanceof Map check 2023-02-09 23:44:13 +13:00
Rob Bygrave 244d45674a #2952 #2953 - Fix for @OneToMany orphanRemoval not occurring
orphanRemoval was not occurring when a loaded bean had a collection
replaced by a new BeanCollection (as opposed to a vanilla collection
like java.util.ArrayList).

Json marshalling a collection puts beans into BeanCollection and this
is part of the test that reproduced this issue.
2023-02-09 23:29:13 +13:00
Rob Bygrave 4722f10f5e Bump versions after release 2023-02-07 22:46:08 +13:00
Rob Bygrave 3f5140e7f3 [maven-release-plugin] prepare for next development iteration 2023-02-07 22:10:29 +13:00
Rob Bygrave 43dec17d08 [maven-release-plugin] prepare release ebean-parent-13.11.3 2023-02-07 22:10:16 +13:00
Rob Bygrave f1ee45d7d1 Bump ebean-agent to 13.11.3 2023-02-07 22:06:16 +13:00
Rob Bygrave 3263e7bfc3 #2959 - Improve logging for lazy loading error due to "markAsDeleted" 2023-02-07 22:05:34 +13:00
Rob Bygrave e01f19b3aa Merge branch 'one2many_setArraylist' of github.com:buchtajz/ebean into buchtajz-one2many_setArraylist 2023-02-07 20:09:01 +13:00
Rob Bygrave 20f6a659fe #2959 - Improve logging for lazy loading error due to "markAsDeleted" 2023-02-07 19:59:33 +13:00
Michal Buchtík 09fe923770 Merge remote-tracking branch 'origin/one2many_setArraylist' into one2many_setArraylist 2023-02-05 09:28:11 +01:00
buchtajzandGitHub e6f5e42c2d Merge branch 'ebean-orm:master' into one2many_setArraylist 2023-02-05 09:25:29 +01:00
Roland Praml 010f73fea2 ENH: add statistics trimmedByGC/LRU/TTL/Idle to ServerCacheStatistics? 2023-02-02 14:10:54 +01:00
Rob Bygrave 5150ecba62 #2948 - SoftDelete entities are hard deleted on orphan removal 2023-02-02 23:15:22 +13:00
Rob Bygrave 978b1dbe02 Merge branch 'master' of github.com:ebean-orm/ebean 2023-02-02 23:06:49 +13:00
Rob Bygrave 9813703ce5 Merge branch 'Ichtil-hard_delete_instead_of_soft_delete_2' 2023-02-02 23:03:28 +13:00
Rob Bygrave 09001e80b5 #2948 - SoftDelete entities are hard deleted on orphan removal 2023-02-02 23:02:44 +13:00
Rob BygraveandGitHub 4aa3ca6d95 Merge pull request #2941 from FOCONIS/expressionlist-clear
NEW: ExpressionList has clear() method
2023-02-02 01:13:28 +13:00
Rob BygraveandGitHub 5ec8469ddc Merge pull request #2940 from FOCONIS/fix-bom
FIX: Removed non existent modules from BOM
2023-02-02 00:42:43 +13:00
Michal Buchtík 39099bbcc9 print sql 2023-01-31 23:01:52 +01:00
Michal Buchtík cb2ca0de11 setArrayListDoInsertInsteadUpdate 2023-01-30 23:47:18 +01:00
Jan Klička b25233b0b9 Merge branch 'master' into hard_delete_instead_of_soft_delete_2
# Conflicts:
#	ebean-test/pom.xml
2023-01-27 16:28:03 +01:00
Jan Klička 743f1b10e3 #2948 2023-01-27 16:17:01 +01:00
Michal Buchtík 6055a33dc8 fix changes 2023-01-27 12:11:01 +01:00
Michal Buchtík 230d18e48f failing test for rawSql select .asDto query 2023-01-27 11:39:37 +01:00
Roland Praml 371f50fb4d NEW: ExpressionList has clear() method 2023-01-23 11:33:29 +01:00
Roland Praml a3be2041c8 FIX: Removed non existent modules from BOM 2023-01-23 11:31:45 +01:00
Rob Bygrave 09a831f2d6 Bump versions after release 2023-01-21 22:35:40 +13:00
Rob Bygrave 27d9e03691 [maven-release-plugin] prepare for next development iteration 2023-01-21 20:37:02 +13:00
Rob Bygrave 5a3c6b9dad [maven-release-plugin] prepare release ebean-parent-13.11.2 2023-01-21 20:36:54 +13:00
Rob Bygrave 502eb78ffd Bump ebean-agent to 13.11.2 2023-01-21 20:25:49 +13:00
Roland Praml 61d6cccbcb FIX: Using weak references in load buffer for streaming queries 2023-01-20 16:51:51 +01:00
Rob Bygrave 761ec584b2 #2939 - [yugabyte] Bump testing against Yugabyte to use version 2.16.0.1-b7 2023-01-20 18:01:53 +13:00
Rob Bygrave 144b8c3077 #2939 - [yugabyte] Bump testing against Yugabyte to use version 2.16.0.1-b7 2023-01-20 17:35:27 +13:00
Rob Bygrave 79a1b3a024 Merge branch 'master' of github.com:ebean-orm/ebean 2023-01-20 16:58:41 +13:00
Rob Bygrave 519b75a778 Adjust tests for Postgres - DtoQuery2Test and EaObject 2023-01-20 16:58:26 +13:00
Rob BygraveandGitHub 1659c526d7 Merge pull request #2938 from FOCONIS/scan-cache-annotations-recursively
FIX: Search cache annotations recursively
2023-01-20 09:35:54 +13:00
Rob Bygrave 93fc7b07a0 Add more tests for DtoQuery column -> property mapping 2023-01-20 09:32:38 +13:00
Rob BygraveandGitHub d7e6feebc2 Merge pull request #2935 from ebean-orm/feature/2915-invalid-id-mapping
#2915 - Failing test for - generator param of @GeneratedValue is not ignored when using GenerationType.AUTO on db where this uses identity
2023-01-20 08:34:25 +13:00
Rob Bygrave 2a6c60c89b #2915 - Fix for generator param of @GeneratedValue is not ignored when using GenerationType.AUTO on db where this uses identity 2023-01-20 08:27:09 +13:00
Roland Praml b569ec97ee FIX: Search cache annotations recursively 2023-01-19 16:22:38 +01:00
Roland Praml a3540057b7 BUG: Memory-leak on streaming queries when LoadBuffers are not aligned 2023-01-18 09:24:47 +01:00
Rob Bygrave 6b6cf48ae2 Merge branch 'FOCONIS-fix-order-by-on-prop' 2023-01-18 07:52:58 +13:00
Rob Bygrave f09cba3ab5 #2930 - Add extra test for DbOrderByTrimTest 2023-01-18 07:52:43 +13:00
Rob Bygrave 724183f669 Merge branch 'fix-order-by-on-prop' of github.com:FOCONIS/ebean into FOCONIS-fix-order-by-on-prop 2023-01-18 07:46:41 +13:00
Rob BygraveandGitHub a40212d41e Merge pull request #2934 from ebean-orm/feature/2931-redis-collectionIds
Ebean Redis - Failed to decode cache data for UUID as Id
2023-01-18 07:41:59 +13:00
Rob BygraveandGitHub c9ce02c43d Merge pull request #2933 from FOCONIS/bugfix/drop_table_drop_foreign_keys
Drop table statements potentially not possible due to foreign key constraints
2023-01-18 07:41:38 +13:00
Rob Bygrave 03c9782d63 #2915 - Failing test for - generator param of @GeneratedValue is not ignored when using GenerationType.AUTO on db where this uses identity 2023-01-18 00:07:04 +13:00
Rob Bygrave 130e9451f4 #2931 - Fix for Ebean Redis - Failed to decode cache data for UUID as Id 2023-01-17 23:20:33 +13:00
Rob Bygrave dce6a3e9e1 #2931 - Failing test for Ebean Redis - Failed to decode cache data for UUID as Id 2023-01-17 23:10:08 +13:00
Rob BygraveandGitHub 486044d29b Merge pull request #2932 from parveenyadav-multiply/patch-2
Create UUIDAsIDModel.java
2023-01-17 20:51:45 +13:00
parveenyadav-multiplyandGitHub 934b0f0044 Create UUIDAsIDModel.java 2023-01-16 03:05:01 +05:30
Jonas Pöhler 2633cd6bfe FIX: drop foreign keys before dropping tables 2023-01-13 15:35:54 +01:00
Jonas Pöhler 2c81d0df03 ADD: failing testcase for dropping two or more related, but otherwise unreferenced tables 2023-01-13 15:14:35 +01:00
Roland Praml 9ef59e359b Removed supportsSelect (dead code) 2023-01-13 13:43:41 +01:00
Roland Praml 6561f6f5e7 BUG: @OrderBy on chained properties do not work with distinct (fix) 2023-01-13 13:29:16 +01:00
Roland Praml b2e8e628fa BUG: @OrderBy on chained properties do not work with distinct (testcase) 2023-01-13 13:06:54 +01:00
Rob Bygrave bbb8d85971 Fix test TestBeanCache for postgres compatible asserts 2023-01-10 20:17:50 +13:00
Rob Bygrave 14b94ebe12 Bump to 13.11.2-SNAPSHOT 2023-01-09 11:09:00 +13:00
Rob Bygrave f5f59d90d4 [maven-release-plugin] prepare for next development iteration 2023-01-09 10:45:37 +13:00
Rob Bygrave ac3f4ca369 [maven-release-plugin] prepare release ebean-parent-13.11.1 2023-01-09 10:45:29 +13:00
Rob Bygrave 10133e6040 Bump agent to 13.11.1 2023-01-09 10:40:40 +13:00
Rob BygraveandGitHub 321fb26df3 Merge pull request #2927 from FOCONIS/findset-beancache
NEW: BeanCache for findSet
2023-01-09 10:29:15 +13:00
Rob BygraveandGitHub 28bd018d1f Merge pull request #2926 from FOCONIS/prepare-query
FIX: prepare FindMap query for proper bean cache / DB access
2023-01-09 10:28:09 +13:00
Rob BygraveandGitHub cceb29313b Merge pull request #2928 from ebean-orm/feature/2918-findEach-EmbeddedId-Memory
Fix memory leak with streaming queries with Id Embedded
2023-01-09 10:25:39 +13:00
Rob Bygrave 530bfa982e Fix memory leak with streaming queries with Id Embedded
- The Id Embedded beans do not need the embeddedOwner to be set. They do not need to propagate dirty state back to the owner.
2023-01-05 23:27:22 +13:00
Rob BygraveandGitHub 3cfa636e88 Merge pull request #2925 from FOCONIS/exclude-from-cp-scan
Ignore private/package private classes from CP-scan / FIX: Order of runServerConfigStartup
2023-01-05 20:16:40 +13:00
Roland Praml a2e8f098cf NEW: BeanCache for findSet 2023-01-04 17:11:24 +01:00
Roland Praml 9e42cfd7d7 FIX: prepare FindMap query for proper bean cache access 2023-01-04 16:59:31 +01:00
Roland Praml a3c54d4d20 FIX: Order of runServerConfigStartup 2023-01-04 14:00:16 +01:00
Roland Praml 1d48e2afb3 Ignore private/package private classes from CP-scan 2023-01-04 13:59:51 +01:00
Rob Bygrave d84c9dc1a9 Bump versions in test modules after release 2022-12-08 18:00:24 +13:00
Rob Bygrave 6165bf5a6c Bump versions in test modules after release 2022-12-08 17:06:41 +13:00
Rob Bygrave 712d3ea78f [maven-release-plugin] prepare for next development iteration 2022-12-08 15:31:04 +13:00
Rob Bygrave 96e3c95c29 [maven-release-plugin] prepare release ebean-parent-13.11.0 2022-12-08 15:30:51 +13:00
Rob Bygrave e6e25b979f Bump to 13.11.0-SNAPSHOT 2022-12-08 15:21:16 +13:00
Rob Bygrave 50fd0f6b1a Bump ebean-agent to 13.11.0 2022-12-08 15:19:30 +13:00
Rob Bygrave 0e9b83a1ce #2914 - Refactor ProcessingContext.getPropertyType() internals and whitespace 2022-12-08 11:37:10 +13:00
Rob Bygrave d2f629e7bb #2914 - Query bean generation support for @ElementCollection with validaiton annotations - NPE NullPointerException 2022-12-08 11:10:23 +13:00
Rob Bygrave 9720cd8189 Add SpiTxnLogger as main point to log SQL, SUM and TXN messages on a per transaction basis 2022-12-02 02:34:14 +13:00
Rob Bygrave bc4d9837c6 Modify SpiLogger removing isTrace(), trace() and the 2 uses
- Not bothered to log when changing isolation level
- Not bothering to log at end of query only transaction
2022-12-01 23:45:40 +13:00
Rob Bygrave e290f68b29 Revert "#2908 - Fix tests for Oracle and DB2 with maxRows and forUpdate() 2022-12-01 22:58:30 +13:00
Rob Bygrave a17e62b491 Revert "#2908 - [Oracle] Change OraclePlatform to use AnsiSqlLimiter (noting Oracle does not support FOR UPDATE with FETCH/OFFSET"
This reverts commit 62ed5a9f
2022-12-01 22:51:37 +13:00
Rob Bygrave 928db1f0f6 #2909 - [Hana] Replace HanaSqlLimitSqlLimiter with standard LimitOffsetSqlLimiter 2022-12-01 22:42:42 +13:00
Rob Bygrave c317092dc5 #2907 - Promote Db2SqlLimiter to be AnsiSqlRowsLimiter and move to ebean-api module 2022-12-01 22:40:13 +13:00
Rob Bygrave 95512d4851 #2906 - Tidy LimitOffsetSqlLimiter 2022-12-01 22:27:57 +13:00
Rob Bygrave 62ed5a9f2b #2908 - [Oracle] Change OraclePlatform to use AnsiSqlLimiter (noting Oracle does not support FOR UPDATE with FETCH/OFFSET 2022-12-01 22:24:35 +13:00
Rob Bygrave 37ba0b63e4 #2907 - Promote Db2SqlLimiter to be AnsiSqlRowsLimiter and move to ebean-api module 2022-12-01 22:18:16 +13:00
Rob Bygrave 22a5bd9b9d #2906 - Refactor tidy SqlLimiter implementations 2022-12-01 21:39:00 +13:00
Rob Bygrave 45529958ef #2904 MySql and MariaDB do not support OFFSET without LIMIT, ignore them for these tests 2022-12-01 21:27:44 +13:00
Rob Bygrave 7aa64f47c8 Fix test TestQueryCache for Oracle (not supporting READ_UNCOMMITTED as expected) 2022-12-01 10:46:26 +13:00
Rob BygraveandGitHub 919adf331a Merge pull request #2866 from FOCONIS/fix-formula-match-base-platform
FIX: @Formula / @Where Annotations should also match on base platform
2022-12-01 08:56:13 +13:00
Rob BygraveandGitHub 9f229e3cc2 Merge pull request #2904 from serg1236/bugfix/offset_without_limit
Fixed mandatory LIMIT generation in case of firstRow>0
2022-12-01 08:45:18 +13:00
Serhii Dakhnii 3277fe81a1 Fixed mandatory LIMIT generation in case of firstRow>0 2022-11-30 21:36:08 +02:00
Rob BygraveandGitHub 6c6ec3663a Merge pull request #2896 from ebean-orm/dependabot/maven/ebean-core/org.postgresql-postgresql-42.5.1
Bump postgresql from 42.5.0 to 42.5.1 in /ebean-core
2022-11-24 11:40:45 +13:00
Rob BygraveandGitHub 0461580d1c Merge pull request #2897 from ebean-orm/dependabot/maven/ebean-test/org.postgresql-postgresql-42.5.1
Bump postgresql from 42.5.0 to 42.5.1 in /ebean-test
2022-11-24 11:40:28 +13:00
Rob BygraveandGitHub 75dbb58c85 Merge pull request #2898 from ebean-orm/dependabot/maven/ebean-postgis/org.postgresql-postgresql-42.5.1
Bump postgresql from 42.5.0 to 42.5.1 in /ebean-postgis
2022-11-24 11:40:09 +13:00
Rob BygraveandGitHub 808f69cac1 Merge pull request #2899 from ebean-orm/dependabot/maven/platforms/postgres/org.postgresql-postgresql-42.5.1
Bump postgresql from 42.5.0 to 42.5.1 in /platforms/postgres
2022-11-24 11:39:52 +13:00
Rob BygraveandGitHub 974953a376 Merge pull request #2900 from ebean-orm/dependabot/maven/ebean-core-type/org.postgresql-postgresql-42.4.3
Bump postgresql from 42.4.1 to 42.4.3 in /ebean-core-type
2022-11-24 11:38:55 +13:00
dependabot[bot]andGitHub f85a367e98 Bump postgresql from 42.4.1 to 42.4.3 in /ebean-core-type
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.1 to 42.4.3.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.4.1...REL42.4.3)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-23 22:27:09 +00:00
dependabot[bot]andGitHub 87a3c58d93 Bump postgresql from 42.5.0 to 42.5.1 in /platforms/postgres
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.5.0 to 42.5.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.5.0...REL42.5.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-23 22:24:12 +00:00
dependabot[bot]andGitHub 1d1aea77d0 Bump postgresql from 42.5.0 to 42.5.1 in /ebean-test
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.5.0 to 42.5.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.5.0...REL42.5.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-23 22:21:01 +00:00
dependabot[bot]andGitHub 2a02935cee Bump postgresql from 42.5.0 to 42.5.1 in /ebean-postgis
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.5.0 to 42.5.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.5.0...REL42.5.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-23 22:21:01 +00:00
dependabot[bot]andGitHub fd2e5c0fc7 Bump postgresql from 42.5.0 to 42.5.1 in /ebean-core
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.5.0 to 42.5.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.5.0...REL42.5.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-23 22:21:00 +00:00
Rob Bygrave 6d6b07bf87 Bump avaje-config to version 2.4 2022-11-23 08:35:04 +13:00
Rob Bygrave 2cac3cd0bb Bump test modules to 13.10.3-SNAPSHOT after release 2022-11-22 08:26:56 +13:00
Rob Bygrave d56098dbf0 [maven-release-plugin] prepare for next development iteration 2022-11-22 08:09:45 +13:00
Rob Bygrave 07682c97a7 [maven-release-plugin] prepare release ebean-parent-13.10.2 2022-11-22 08:09:37 +13:00
Rob Bygrave 331a9152aa Bump ebean-datasource to 8.4 and ebean-agent to 13.10.2 2022-11-21 17:49:01 +13:00
Rob Bygrave e87a06a713 #2894 - Lack of setNullParameter() functionality on io.ebean.DtoQuery interface 2022-11-21 17:00:55 +13:00
Rob Bygrave 3b5393dca6 Merge branch 'pen4-oscs_fix_cdsc95oau51t49so8cag' 2022-11-21 14:59:43 +13:00
Rob Bygrave 101c5e52b1 #2893 - Bump jackson-databind to 2.14.0 2022-11-21 14:59:27 +13:00
pen4 5d3bcf4008 update com.fasterxml.jackson.core:jackson-databind 2.13.3 to 2.14.0-rc1 2022-11-19 19:57:18 +08:00
Rob Bygrave dd7605ac3a #2888 - DatabaseFactory.create() fails with java.lang.InstantiationError: io.ebean.bean.EntityBeanIntercept in multi-module gradle setup 2022-11-15 14:50:34 +13:00
Rob Bygrave 47dfbb6157 #2864 - Not advertise services configurable via DatabaseConfig.putServiceObject() that are "internal"
"internal" meaning that in terms of module-path they are not in a properly exported package. For example,
they are in a subpackage of io.ebeaninternal
2022-11-10 13:11:08 +13:00
Rob BygraveandGitHub 013123c1a7 Merge pull request #2864 from FOCONIS/feature/override-service-objects
NEW: Override service objects with DatabaseConfig.putServiceObject
2022-11-10 13:05:22 +13:00
Rob Bygrave cbc463cd10 Merge branch 'FOCONIS-bug/transactional-affects-query-cache' 2022-11-10 12:32:49 +13:00
Rob Bygrave 6e9a8704b4 #2887 - Fix for Setting isolation level disables query cache
Use getInternalConnection() in order to set the queryOnly = false flag
which is done via connection()
2022-11-10 12:32:23 +13:00
Rob Bygrave 4a0f8931a0 Add parameter type for Query.Property with DefaultUpdateQuery and TQRootBean 2022-11-09 23:41:42 +13:00
Rob Bygrave 3c8c52ca7f Simplify to use single type (not use another different type for Query.Property) 2022-11-09 23:30:51 +13:00
Roland Praml 0fd2f34ed0 Possible bug: Setting isolation level disables query cache 2022-11-09 09:46:51 +01:00
Rob Bygrave d29ef8934d Add more operators to StdOperators
- stricter use of UpdateQuery.set()
- Numbers just use their own type - PBaseNumber
- PEnum just uses its own type
- Expr.factory() to expose factory
2022-11-09 17:47:16 +13:00
Rob Bygrave a4c3949cfc Merge branch 'master' into feature/StdExpressions 2022-11-08 21:58:34 +13:00
Rob Bygrave 97bbce321d Make Query.Property parameterised with <BT> "Base Type" as Number, String, Temporal, Boolean or Object
These types then determine which functions are valid for the types. So:
- Number functions
- String/varchar functions
- Temporal Date, DateTime, Time functions
- Boolean functions
- Object being everything else
2022-11-08 21:57:36 +13:00
Rob Bygrave 72f1ab18cc No effective change - rename parameter names only 2022-11-08 14:16:12 +13:00
Rob Bygrave b1bba9da5d #2774 - Tidy InExpression adding check and block for prop != null wrt prop.isDbEncrypted() and prop.isLocalEncrypted() 2022-11-08 11:12:46 +13:00
Rob Bygrave 8966faeb7e #2774 - Postgres ANY / MultiValueSupport with byte[]/binary data
Tidy up MultiValueBind.toArray() only
2022-11-08 09:33:09 +13:00
Rob Bygrave fed4413259 Merge branch 'master' of github.com:ebean-orm/ebean 2022-11-07 22:26:19 +13:00
Rob Bygrave 14dddb4866 #2774 - Postgres ANY / MultiValueSupport with byte[]/binary data
Add Postgres specific support for binding an array of byte[] with ANY(?)
which is used as with client side encryption where the bind values are
implicitly converted to byte[].

Fixes Postgres specific failure running TestEncryptClientSide.java
2022-11-07 22:25:32 +13:00
Rob Bygrave 0b9d199829 #2774 - Postgres ANY / MultiValueSupport with byte[]/binary data
Add Postgres specific support for binding an array of byte[] with ANY(?)
which is used as with client side encryption where the bind values are
implicitly converted to byte[].

Fixes Postgres specific failure running TestEncryptClientSide.java
2022-11-07 17:36:04 +13:00
Rob Bygrave 3da924b943 Add Query.Property.of(), Move StdFunctions to ebean-api 2022-11-07 12:57:39 +13:00
Rob BygraveandGitHub d7d6082038 Merge pull request #2885 from MarcusDunn/patch-1
Added platforms to BOM
2022-11-07 12:31:11 +13:00
Marcus DunnandGitHub c96357377b Added platforms to BOM
fixes #2884 

I'm a complete maven (especially bom) novice - but thought I could take a stab at making the change.
I also see you auto generate these with an action, is there anything needed there?
Feel free to completely disregard if this or the issue itself is way off the mark.
2022-11-04 11:56:48 -07:00
Rob Bygrave 5ad313d290 Rename TQColumn -> Query.Property, fix compile for DefaultOrmQuery use of OrderBy.Property 2022-11-03 17:46:30 +13:00
Rob Bygrave 8565f5f807 Rename TQColumn -> Query.Property and move to api + use with UpdateQuery.set()
- Refactor rename TQColumn to Query.Property and move to ebean-api module
- Add UpdateQuery.set() methods to use Query.Property (as per #2849)
2022-11-03 17:33:11 +13:00
Rob Bygrave 96e79248dc Add StdFunctions, StdExpressions, TQColumn marker interface 2022-11-03 11:16:30 +13:00
Rob Bygrave 2789d0f97c Bump snapshot version in test modules after release 2022-11-03 00:50:30 +13:00
Rob Bygrave 79cd1da9a4 [maven-release-plugin] prepare for next development iteration 2022-11-03 00:27:30 +13:00
Rob Bygrave 759cf18c41 [maven-release-plugin] prepare release ebean-parent-13.10.1 2022-11-03 00:27:22 +13:00
Rob Bygrave 0a61852711 #2847 - Add support for Sub-query EQ, NE, LT, LE, GT, GE expressions 2022-11-03 00:22:48 +13:00
Rob Bygrave 6f5e144a93 Refactor tidy sql generated by InQueryExpression
Remove excess padding and () around the property name
2022-11-02 22:41:06 +13:00
Rob BygraveandGitHub 391b33beae Merge pull request #2880 from FOCONIS/feature/improve-enc-support
ADD encryption support for Between and InRange
2022-11-02 22:26:37 +13:00
Rob BygraveandGitHub 08e1a05bc9 Merge pull request #2872 from FOCONIS/issue-2774/encryption-support-for-in
#2774 Locally encrypted properties can be used in "in" queries
2022-11-02 22:20:41 +13:00
Rob Bygrave f145aaa1e2 Bump ebean-agent to 13.10.1 2022-11-02 22:04:37 +13:00
Roland Praml 245ba9c6b3 ADD encryption support for Between and InRange 2022-11-02 09:52:56 +01:00
Roland Praml 66f4055b8f fix test 2022-11-02 08:24:26 +01:00
Roland Praml 5170b9f329 Merge branch 'master-rob2' into issue-2774/encryption-support-for-in 2022-11-02 08:15:10 +01:00
Roland Praml 3a2b20eb43 Merge remote-tracking branch 'upstream/master' into issue-2774/encryption-support-for-in 2022-11-02 07:53:32 +01:00
Rob Bygrave dd0ed8ea76 #2873 - Query Beans: Support more TQProperty's as target value for inRangeWith() 2022-11-02 17:35:00 +13:00
Rob Bygrave 600aa10453 #2877 - Query Beans: Add lt, le, gt, ge <other property> e.g. whenRegistered.gt(QCustomer.Alias.whenActivated) 2022-11-02 16:32:49 +13:00
Rob Bygrave f6b87ed0b4 #2876 & #2875 - Query Beans subquery exists/notExists + eq(other property), ne(other property) 2022-11-02 16:14:44 +13:00
Rob Bygrave b300db77ff Merge branch 'master' of github.com:ebean-orm/ebean 2022-11-02 15:18:22 +13:00
Rob Bygrave 3f5800da3b #2862 - Ebean 13.9.3 : org.postgresql.util.PSQLException: Cannot rollback when autoCommit is enabled 2022-11-02 15:18:07 +13:00
Roland Praml c5612d50fe #2774 Locally encrypted properties can be used in "in" queries 2022-10-27 14:38:41 +02:00
Rob BygraveandGitHub 30bdfc4755 Merge pull request #2870 from FOCONIS/fix-csvtest-german-locale
FIX: Run CsvReaderTest also in german locale
2022-10-26 17:41:04 +13:00
Rob BygraveandGitHub 8fd24491da Merge pull request #2869 from FOCONIS/fix-fallback-ebean11
FIX: Add fallback for Ebean 11 Jsons
2022-10-26 17:26:08 +13:00
Rob BygraveandGitHub 61deb2517c Merge pull request #2868 from FOCONIS/fix-tojsonnanos
FIX: toJsonNanos for calendar
2022-10-26 17:24:09 +13:00
Rob BygraveandGitHub faa58f0fe4 Merge pull request #2867 from FOCONIS/fix-flush-transaction
FIX: Flush transaction if it is modified in callback
2022-10-26 17:23:05 +13:00
Rob BygraveandGitHub d2bb985016 Merge pull request #2871 from FOCONIS/fix-whitespace
NOCODE: Fix Whitespace
2022-10-26 17:18:09 +13:00
Roland Praml d190cd3a08 NOCODE: Fix Whitespace 2022-10-25 14:19:26 +02:00
Roland Praml c8853cda58 FIX: Run CsvReaderTest also in german locale 2022-10-25 11:52:17 +02:00
Roland Praml e2d75f4c2e FIX: Add fallback for Ebean 11 Jsons 2022-10-25 11:37:49 +02:00
Roland Praml b56fa851e0 FIX: toJsonNanos for calendar 2022-10-25 11:04:26 +02:00
Roland Praml a82ba6d4aa FIX: Flush transaction if it is modified in callback 2022-10-25 10:58:06 +02:00
Roland Praml 359f8b41fe FIX: @Formula / @Where Annotations should also match on base platform
A property annotated with
```java
@Formula(select = "...", platforms = SQLSERVER)
```
should match for SQLSERVER17 and SQLSERVER19
2022-10-25 10:55:23 +02:00
Rob BygraveandGitHub 22e1403f43 Merge pull request #2865 from FOCONIS/fix-typo
FIX: Typo
2022-10-25 21:48:11 +13:00
Roland Praml 9d60ebd19e FIX: Typo 2022-10-25 10:43:10 +02:00
Rob BygraveandGitHub 87a27da2b9 Merge pull request #2863 from FOCONIS/fix-logformat
FIX: LogFormat for SystemLogger
2022-10-25 21:40:11 +13:00
Roland Praml f8c6a3c960 NEW: Ovverride service objects with DatabaseConfig.putServiceObject 2022-10-25 10:28:55 +02:00
Roland Praml f4c747c6af FIX: LogFormat for SystemLogger 2022-10-25 08:52:15 +02:00
Rob BygraveandGitHub 7152cf656b Merge pull request #2859 from FOCONIS/backgroundexecutor-memory-leak
Possible memory leak with BackgroundExecutor using BackgroundExecutorWrapper ThreadLocals (for scheduled tasks)
2022-10-18 22:49:22 +13:00
Noemi Praml c855df8b8d javadoc 2022-10-18 07:59:19 +02:00
Noemi Praml d710925cc7 possible Fix 2022-10-17 15:31:30 +02:00
Rob Bygrave f24f912693 Fix Postgres/Yugabyte test - TestDbArray_basic.asDto_withArray() for nullable DbArray #2855 2022-10-17 11:19:34 +13:00
Rob Bygrave 8f9772e493 Bump to 13.10.1-SNAPSHOT after release 2022-10-17 10:35:06 +13:00
Rob Bygrave 3c298a67ff [maven-release-plugin] prepare for next development iteration 2022-10-14 13:31:18 +13:00
Rob Bygrave 27504a4dae [maven-release-plugin] prepare release ebean-parent-13.10.0 2022-10-14 13:31:10 +13:00
Rob Bygrave 9c64a69b8c Bump to 13.10.0-SNAPSHOT 2022-10-14 13:13:09 +13:00
Rob Bygrave 6c354357ff Update and fix pom versions after merge of older PR 2022-10-14 12:57:45 +13:00
Rob BygraveandGitHub 19bbe6e860 Merge pull request #2828 from ebean-orm/feature/jackson-mapper-module
Extract jackson mapper module
2022-10-14 12:39:43 +13:00
Rob BygraveandGitHub 62adaa7527 Merge pull request #2826 from ebean-orm/feature/json-node-module
Refactor extract ebean-jackson-jsonnode module - support for Jackson JsonNode (into separate module)
2022-10-14 12:39:27 +13:00
Rob Bygrave 9a25fb584c #2855 - @DbArray not allowing null to be persisted, stores empty list instead
Currently, this bug fix needs to be enabled explicitly via ebean.mf with:

allow-nullable-dbarray: true

We will look to enable this bug fix by default shortly noting that some code
will see a behaviour change. We need to publicise it well when we do turn
this on by default.

This bug fix is actually in ebean-agent 13.10.0 and all this change in ebean-core
does is read the new `@DbArray(nullable=false)` attribute [as a new alternative to
using `@NotNull` or `@Column(nullable=false)`]
2022-10-14 11:14:12 +13:00
Rob Bygrave 475f937421 #2858 - Example for entity-field-access 2022-10-14 11:08:49 +13:00
Rob Bygrave 227968ef8e #2857 - @DbArray - slight performance optimisation for empty array 2022-10-14 08:16:43 +13:00
Rob Bygrave 8e02dedf9f #2856 - @DbArray - improve bind logging, non-null arrays auto bind null to [] so improve bind logging to reflect that 2022-10-14 08:14:12 +13:00
Rob Bygrave 5a49041a3b Tidy test UserInterestLiveKey, final with accessors 2022-09-23 13:54:17 +12:00
Rob Bygrave ea341a556d Bump postgresql to 42.5.0 2022-09-23 13:53:45 +12:00
Rob Bygrave 7affd20092 Bump ebean-agent to 13.9.4 2022-09-15 10:31:58 +12:00
Rob Bygrave 9d9960ded2 Bump test-java16 to use io.ebean.tile:enhancement:13.9.4
Plus add a @Transient field in there for the constructor to deal with
2022-09-15 08:41:05 +12:00
Rob Bygrave 62a055ef1f Bump to 13.9.4-SNAPSHOT after release 2022-09-14 11:37:52 +12:00
Rob Bygrave 993607ef4b [maven-release-plugin] prepare for next development iteration 2022-09-14 11:18:25 +12:00
Rob Bygrave 18765b3ac2 [maven-release-plugin] prepare release ebean-parent-13.9.3 2022-09-14 11:18:18 +12:00
Rob Bygrave ea8e195183 Update test-java16 to use updated agent 2022-09-14 11:12:45 +12:00
Rob Bygrave f54c212b67 #2833 - Fix PostgresPlatformProvider plaform sniffing query (Postgres vs Cockroach) 2022-09-14 11:10:10 +12:00
Rob Bygrave 14d11b1c70 Improve tests only - ExtendedServerTest and test-java16 2022-09-11 17:12:02 +12:00
Rob Bygrave 7f5f0f6b8e Extract ebean-jackson-mapper module - fix module-info with requires com.fasterxml.jackson.annotation; 2022-09-08 23:05:16 +12:00
Rob Bygrave 318b22448c Extract ebean-jackson-mapper module - refactor DefaultTypeManager.dbJsonType()
- When detected markerAnnotation (e.g. Jackson annotation) then go directly to createJsonObjectMapperType()
- Simplify for the simple List, Set and Map of Object cases.
2022-09-08 23:01:05 +12:00
Rob Bygrave 610b3f7dc8 Extract ebean-jackson-mapper module - Change checkJacksonAnnotations() to instead use ScalarJsonMapper.markerAnnotation() 2022-09-08 22:38:10 +12:00
Rob Bygrave 7a887d219f Extract ebean-jackson-mapper module - rename DeployBeanObtainJackson -> AnnotatedClassUtil and convert to static method 2022-09-08 22:14:16 +12:00
Rob Bygrave e74e4ba532 Extract ebean-jackson-mapper module - rename ScalarTypeJsonObjectMapper to ScalarJsonJacksonMapper and move 2022-09-08 22:09:10 +12:00
Rob Bygrave d5f753d110 Extract ebean-jackson-mapper module - initial step 2022-09-08 21:39:00 +12:00
Rob Bygrave c53ca6c16e Rename ebean-json-node module to ebean-jackson-jsonnode 2022-09-08 14:53:33 +12:00
Rob Bygrave 5981d313ae Rename ebean-json-node module to ebean-jackson-jsonnode 2022-09-08 14:50:58 +12:00
Rob Bygrave cba3d24df1 Refactor DeployUtil rename methods (change/improve method names) 2022-09-07 22:56:43 +12:00
Rob Bygrave 27beab2980 Refactor internal TypeManager change/improve its method names 2022-09-07 22:53:15 +12:00
Rob Bygrave aeb4b8ed25 Refactor TypeManager - remove unnecessary add() method from interface allowing it to be private 2022-09-07 22:41:56 +12:00
Rob Bygrave edddc935df Update DefaultTypeManager to reuse PostgresHelper.isPostgresCompatible() 2022-09-07 22:38:09 +12:00
Rob Bygrave 5c1b478085 Refactor extract ebean-json-node module - support for Jackson JsonNode (into separate module) 2022-09-07 21:39:36 +12:00
Rob Bygrave 39de9d56db #2825 - DB Migration - create schema migration is repeated unnecessarily 2022-09-07 19:55:43 +12:00
Rob Bygrave e00e490e73 Update use example in README 2022-09-07 14:09:49 +12:00
Rob Bygrave dd95081e63 Update use example in README 2022-09-07 14:03:37 +12:00
Rob Bygrave 03bd31677a Bump to 13.9.1 2022-09-07 13:35:26 +12:00
Rob Bygrave 4619c56b09 #31 - Explicitly add Apache 2 License text (it got missed when ebean changed from LGPL to Apache2) 2022-09-07 13:34:23 +12:00
Rob Bygrave c3dc57f0fb Bump the spring dependency versions used in testing 2022-09-07 13:21:04 +12:00
Rob BygraveandGitHub 50ba20289b Merge pull request #30 from ebean-orm/feature/final-txn-manager
Make SpringJdbcTransactionManager final, SpringJdbcTransaction not public
2022-09-07 12:51:48 +12:00
Rob Bygrave 6b73072982 Make SpringJdbcTransactionManager final, SpringJdbcTransaction not public 2022-09-07 12:48:45 +12:00
Rob Bygrave 6e340bd149 Bump parent and version 2022-09-05 19:40:21 +12:00
Rob BygraveandGitHub 65f551650f Merge pull request #29 from ebean-orm/feature/bump-flush
Use System.Logger and transaction.flush()
2022-09-05 19:38:30 +12:00
Rob Bygrave 3be3741db6 Change to use System.Logger + transaction.flush() 2022-09-05 19:35:52 +12:00
Rob Bygrave 610afd3717 Update tests 2022-09-05 19:33:40 +12:00
Rob Bygrave 94dbd9d6ad Bump to 13.9.3-SNAPSHOT after release 2022-09-05 19:28:41 +12:00
Rob Bygrave 7c23dd06f8 [maven-release-plugin] prepare for next development iteration 2022-09-05 17:44:35 +12:00
Rob Bygrave e813edae01 [maven-release-plugin] prepare release ebean-parent-13.9.2 2022-09-05 17:44:28 +12:00
Rob Bygrave 4218d5bd48 Bump ebean-agent to 13.9.2 (no effective change) 2022-09-05 17:29:36 +12:00
Rob BygraveandGitHub aaf7aa8386 Merge pull request #2822 from FOCONIS/call-reorg-after-drop-not-null
FIX: DB2 migration: call reorg after drop not null
2022-09-05 17:14:21 +12:00
Rob BygraveandGitHub fbe84a7c62 Merge pull request #2824 from ebean-orm/feature/2823-jdbcTransaction_isActive
#2823 - Revert JdbcTransaction.isActive() back to be non-final method
2022-09-05 17:03:29 +12:00
Rob Bygrave cbd213aad3 #2823 - Revert JdbcTransaction.isActive() back to be non-final method 2022-09-05 17:02:45 +12:00
Noemi Praml 13622f6b62 migrations scripts 2022-09-02 13:27:11 +02:00
Noemi Praml 8fe6de376d Fix sqlserver stored procedures - reserved keywords
(cherry picked from commit 09bcf6dbb9)
2022-09-02 12:58:02 +02:00
Noemi Praml 808ba719f4 Fix mariadb, mysql stored procedure usp_ebean_drop_column - reserved keywords
(cherry picked from commit b0df177509)
2022-09-02 11:53:33 +02:00
Noemi Praml 117844b5ee Fix Unittests with drop not null
(cherry picked from commit 98e0e3b9ca)
2022-09-02 10:49:39 +02:00
Noemi Praml fbb73d465c FIX DB2 migration: reorg table must be called after drop not null 2022-09-02 10:49:25 +02:00
Rob BygraveandGitHub a5c3bbb97e Merge pull request #2821 from ebean-orm/feature/minor-dependency-bump
Minor dependency bump for jackson, assertj-core, joda-time, h2database
2022-09-02 10:55:48 +12:00
Rob Bygrave 674150dc75 Minor dependency bump for jackson, assertj-core, joda-time, h2database 2022-09-02 10:50:23 +12:00
Rob Bygrave ad938b2ce2 Bump to 13.9.2-SNAPSHOT after release 2022-09-02 09:34:59 +12:00
Rob Bygrave 5b1ace8607 [maven-release-plugin] prepare for next development iteration 2022-09-02 09:16:08 +12:00
Rob Bygrave 74321277ff [maven-release-plugin] prepare release ebean-parent-13.9.1 2022-09-02 09:16:01 +12:00
Rob Bygrave c60362f6e1 Bump ebean-agent to 13.9.1 - no effective change 2022-09-02 09:10:15 +12:00
Rob BygraveandGitHub c1320e4184 Merge pull request #2815 from ebean-orm/feature/2814-nestedUseSavepoint
#2814 - Change setNestedUseSavepoint() to use 'ScopeTrans' rather than the underlying Transaction
2022-09-02 08:20:53 +12:00
Rob BygraveandGitHub a7ea2cf3ef Merge pull request #2820 from ebean-orm/feature/2818-fix-concurrentModOfTransactionEvent
#2818 - Fix Concurrent modification of listenerNotify TransactionEvent list
2022-09-02 08:19:03 +12:00
Rob BygraveandGitHub f86a0ac973 Merge pull request #2819 from ebean-orm/feature/enh-addRollbackAndContinue
ENH: Add Transaction.rollbackAndContinue()
2022-09-02 08:18:25 +12:00
Rob Bygrave bcc21b1c04 #2818 - Fix Concurrent modification of listenerNotify TransactionEvent list
The issue fixed here is that SavepointTransaction was effectively using the
TransactionEvent of the underlying 'parent' transaction. The fix is for
SavepointTransaction to have its own TransactionEvent.
2022-09-01 22:45:17 +12:00
Rob Bygrave d517dea27f ENH: Add Transaction.rollbackAndContinue() 2022-09-01 22:26:52 +12:00
Rob Bygrave 7df168f232 ENH: Add Transaction.rollbackAndContinue()
Typically useful for handling DuplicateKeyException where we expect
DuplicateKeyException to be thrown and catch it with the intention of
continuing processing using the same transaction.

Note that some databases like Oracle do not require this explicit
rollback() and would work without the rollbackAndContinue(). Postgres
in particular requires the rollback() call on the underlying connection
such that we can continue using that transaction/java.sql.Connection.

Note that in the existing test we can see that rollbackAndContinue()
is pretty close to being syntactic sugar. I think adding rollbackAndContinue()
is justified and complements the existing commitAndContinue().
2022-09-01 17:08:11 +12:00
Rob Bygrave 563340edbd Bump to 13.9.1-SNAPSHOT after release 2022-09-01 16:47:22 +12:00
Rob Bygrave 28d70cf9c4 [maven-release-plugin] prepare for next development iteration 2022-09-01 12:33:08 +12:00
Rob Bygrave 25d0675532 [maven-release-plugin] prepare release ebean-parent-13.9.0 2022-09-01 12:33:01 +12:00
Rob Bygrave c8ffad2831 Fix TestSubQuery for postgres compatible syntax with ANY(?) 2022-09-01 12:25:50 +12:00
Rob Bygrave 8233058d2e Bump ebean-agent to 13.9.0 (no effective change) 2022-09-01 12:23:00 +12:00
Rob Bygrave f7e00aab78 #2457 #2810 - Add ebean-joda-time as a dependency to ebean composite
- Add ebean-joda-time as a dependency to ebean composite
- Add ebean-joda-time to BOM
2022-09-01 11:37:28 +12:00
Rob BygraveandGitHub a111f3ff10 Merge pull request #2816 from ebean-orm/feature/2813-subQueryCompile-raceCondition
#2813 - Sometimes subquery use wrong alias in SQL
2022-09-01 11:18:23 +12:00
Rob Bygrave 29e2b81092 #2813 - Sometimes subquery use wrong alias in SQL
The reason for this is that as part of DefaultOrmQuery.copy() it uses
DefaultExpressionList.copy() and that assumed that expressions were
safe to share which is NOT the case for IN and EXISTS sub-query expressions
so InQueryExpression and ExistsQueryExpression

The effective fix for this is that DefaultExpressionList.copy() changes
to call SpiExpression.copy() and for InQueryExpression and ExistsQueryExpression
to implement that copy() by creating a copy of the sub-query.

A "side-fix" is that in DefaultOrmQuery.createExtraJoinsToSupportManyWhereClause()
it was creating an instance of ManyWhereJoins, then mutating it ... and if we
change that to only doing the assignment at the end (object assignment is atomic)
then racy access reading ManyWhereJoins would always get a fully completed non-mutating
instance of ManyWhereJoins. Noting this because it kind of points to where I think
the race condition is (in createExtraJoinsToSupportManyWhereClause()) but noting that
with the change to DefaultExpressionList.copy() this "side-fix" isn't required per say.
2022-08-31 17:24:55 +12:00
Rob Bygrave 0dda3e0e93 #2814 - Change setNestedUseSavepoint() to use 'ScopeTrans' rather than the underlying Transaction
The reason for this is that ScopedTransaction holds a stack of ScopeTrans and Transaction, but
the actual transaction in this stack is often the same instance / shared when nesting. The issue
is that currently setNestedUseSavepoint() sets this flag on the *_underlying transaction_* and
this instance is the same / shared when 'nesting'.

This change moves the nestedUseSavepoint flag for ScopedTransaction to be on ScopeTrans
(from the underlying transaction).
2022-08-31 11:39:02 +12:00
Rob Bygrave f07c7411fa No effective change - tidy SqlTreeAlias only 2022-08-30 12:37:27 +12:00
Rob BygraveandGitHub b4d037fa18 Merge pull request #2812 from ebean-orm/feature/inspect-tidy
IntelliJ inspect various improvements
2022-08-30 11:58:54 +12:00
Rob Bygrave e46bbcf8cf NaturalKeyQueryData use the matchSingleProperty + IntelliJ Inspect various improvements
The non-use of the matchSingleProperty meant it fell back to the multi-property match
2022-08-27 23:10:13 +12:00
Rob Bygrave 0c2ab729bc IntelliJ Inspect various improvements 2022-08-27 22:37:48 +12:00
Rob Bygrave 81ef967d9f IntelliJ Inspect various improvements 2022-08-27 22:02:32 +12:00
Rob BygraveandGitHub 2d733795c7 Merge pull request #2811 from ebean-orm/feature/refactor-json-docstore-methods
Refactor method names SpiJsonReader and DocStore types
2022-08-27 20:16:03 +12:00
Rob Bygrave 7ce85fe5f2 Refactor method names SpiJsonReader and DocStore types 2022-08-27 20:09:27 +12:00
Rob Bygrave e3e30cafdd Refactor tidy error and log messages - part 2 2022-08-27 17:15:08 +12:00
Rob Bygrave e51ac7de36 Refactor tidy error and log messages 2022-08-27 16:50:54 +12:00
Rob Bygrave ee71c79125 Tidy DefaultTypeManager, reduce unnecessary fields 2022-08-27 16:08:30 +12:00
Rob Bygrave bce2dec1cd Remove unused imports in DefaultTypeManager 2022-08-27 15:40:06 +12:00
Rob Bygrave 3f2d0ef520 Bump to 13.9.0-SNAPSHOT 2022-08-26 17:49:01 +12:00
Rob BygraveandGitHub bbb3ad9333 Merge pull request #2810 from ebean-orm/feature/extract-joda-time-module
Refactor extract ebean-joda-time module - move joda ScalarTypes
2022-08-26 17:34:28 +12:00
Rob Bygrave b7e62df371 Refactor extract ebean-joda-time module - move joda ScalarTypes
Moves the joda-time ScalarTypes into a new ebean-joda-time module. Include
the ebean-joda-time module in the classpath, and the extra types will be
service loaded (by DefaultTypeManager).
2022-08-26 17:32:31 +12:00
Rob BygraveandGitHub 7b3405ca25 Merge pull request #2809 from ebean-orm/feature/refactor-move-BasicTypeConverter
Refactor move BasicTypeConverter to ebean-core-type module
2022-08-26 15:30:16 +12:00
Rob Bygrave 9984b53070 Refactor move BasicTypeConverter to ebean-core-type module
Doing this in preparation for moving the joda-type ScalarTypes into their own module
2022-08-26 15:21:30 +12:00
Rob BygraveandGitHub 5e1aef1953 Merge pull request #2808 from ebean-orm/feature/refactor-move-internal-bindAndJson
Refactor move package - server.type.DataBind to server.bind, server.text.json -> server.json
2022-08-26 14:52:02 +12:00
Rob Bygrave 4c13a3a779 Refactor move package - server.type.DataBind to server.bind, server.text.json -> server.json
The DataBind classes don't need to be in with server.type anymore.
The server.text.json package can just reduce package nesting.
2022-08-26 14:51:19 +12:00
Rob BygraveandGitHub 100719ac1f Merge pull request #2807 from ebean-orm/feature/move-scalarTypeBaseVarchar
Refactor move ScalarTypeBaseDate, ScalarTypeBaseDateTime, ScalarTypeBaseVarchar in ebean-core-type
2022-08-26 13:22:23 +12:00
Rob Bygrave a13f581a65 Refactor ScalarTypeBaseDateTime, merge into ScalarTypeUtils both IsoJsonDateTimeParser and DecimalUtils
That is, merge the static util methods into ScalarTypeUtils
2022-08-26 13:15:55 +12:00
Rob Bygrave f319ee66ad Refactor move ScalarTypeBaseDateTime to ebean-core-type module 2022-08-26 13:02:42 +12:00
Rob Bygrave 6f249c7b72 No effective change, tidy ScalarTypeBaseDate only 2022-08-26 12:36:04 +12:00
Rob Bygrave 09e20934d7 Refactor move ScalarTypeBaseDate to ebean-core-type module 2022-08-26 12:30:50 +12:00
Rob Bygrave 5b22506b9b Refactor move ScalarTypeBaseVarchar to ebean-core-type module 2022-08-26 12:28:29 +12:00
Rob Bygrave 13a913428e DecimalUtils - remove unused methods converting between Instance and BigDecimal 2022-08-26 12:24:15 +12:00
Rob Bygrave 5667f1b118 ScalarTypeCharArray - remove unused method jsonWrite() with incorrect params 2022-08-26 12:20:36 +12:00
Rob BygraveandGitHub fcb8e4ca64 Merge pull request #2806 from ebean-orm/feature/refactor-scalarType-convertFromMillis
Refactor ScalarType, remove convertFromMillis() method (no longer needed)
2022-08-25 22:49:03 +12:00
Rob Bygrave c5e8b217e3 Refactor ScalarType, remove convertFromMillis() method (no longer needed)
Due to the move and change of CsvReader using StringParser ScalarType no longer
needs that general convertFromMillis() method. Note that date and dateTime ScalarTypes
still retain this conversion method.
2022-08-25 22:37:47 +12:00
Rob BygraveandGitHub f98b6b0e2a Merge pull request #2805 from ebean-orm/feature/extract-csv-reader-module
Extract csv reader module
2022-08-25 22:24:07 +12:00
Rob Bygrave f01d8174e8 Extract CsvReader - fix parent pom version 2022-08-25 22:17:20 +12:00
Rob Bygrave ccf790a630 Extract CsvReader - provider scope for ebean-core 2022-08-25 22:15:15 +12:00
Rob Bygrave efe80a534c Extract CsvReader - remove built in date, time, dateTime parsing - use StringParser instead
Just always use our own StringParser lambda function instead for parsing date, time and dateTime types.
2022-08-25 22:09:38 +12:00
Rob Bygrave 1aac01ead0 Extract CsvReader - move DefaultCsvCallback and add module-info 2022-08-25 17:49:11 +12:00
Rob Bygrave 216c43eea6 Extract CsvReader into separate ebean-csv-reader module 2022-08-25 17:25:49 +12:00
Rob BygraveandGitHub 5b2a8cdacb Merge pull request #2804 from ebean-orm/feature/refactor-move-ScalarTypeBase
Refactor move ScalarTypeBase + remove loadIgnore()
2022-08-25 13:47:14 +12:00
Rob Bygrave d2da4f7e52 Reorder methods on ScalarType only 2022-08-25 13:12:35 +12:00
Rob Bygrave 186019da7f Refactor ScalarType move format() default method from ScalarTypeBase to ScalarType 2022-08-25 13:00:30 +12:00
Rob Bygrave 7d1772cb54 Refactor ScalarType remove loadIgnore() method to implement in BeanProperty & DynamicPropertyBase 2022-08-25 12:53:44 +12:00
Rob Bygrave cd30c47951 Refactor move ScalarTypeBase to the ebean-core-type module (for external reuse)
Doing this in preparation for moving the joda-time scalar types into their own module
(so that they can become optional).
2022-08-25 12:42:12 +12:00
Rob BygraveandGitHub 4b11147b83 Merge pull request #2801 from ebean-orm/feature/drop-feature-OnQueryOnly
Remove the OnQueryOnly (rollback) feature
2022-08-25 12:30:16 +12:00
Rob BygraveandGitHub 6d7a5f07f0 Merge pull request #2803 from ebean-orm/feature/refactor-scalarType-methodNames
Refactor ScalarType methods from getters to accessors
2022-08-25 12:30:05 +12:00
Rob Bygrave 26f0605d72 Refactor ScalarType methods from getters to accessors 2022-08-25 12:25:38 +12:00
Rob BygraveandGitHub 4959053ce0 Merge pull request #2802 from ebean-orm/feature/remove-ScalarType-isDateTimeCapable
Remove ScalarType.isDateTimeCapable() ... (only used by CSV reader)
2022-08-25 12:17:26 +12:00
Rob Bygrave 10c9b2addd Remove ScalarType.isDateTimeCapable() ... (only used by CSV reader)
So the complexity cost doesn't justify itself against only being used
by CSV reader to validate when assigning a date/time format to a property
/ expression path.
2022-08-25 12:16:37 +12:00
Rob BygraveandGitHub 3092b59622 Merge pull request #2800 from ebean-orm/feature/refactor-databasePlatform
Refactor database platform - remove unused tableExists() method, rename getters to accessors
2022-08-25 12:01:49 +12:00
Rob Bygrave 8b086e0e49 Bump to 13.8.2-SNAPSHOT after release 2022-08-25 11:48:18 +12:00
Rob Bygrave 981c3595a8 [maven-release-plugin] prepare for next development iteration 2022-08-25 11:34:05 +12:00
Rob Bygrave 5414fa17cf [maven-release-plugin] prepare release ebean-parent-13.8.1 2022-08-25 11:33:58 +12:00
Rob Bygrave 807b017463 Bump to ebean-agent 13.8.1 2022-08-25 11:29:25 +12:00
Rob Bygrave 96b674114c Remove the OnQueryOnly (rollback) feature
The better approach these days is to use the read-only datasource with autoCommit
2022-08-25 11:26:55 +12:00
Rob Bygrave 456086fb3c Refactor DatabasePlatform - rename getters to accessors
Although this is public API these getters are not expected to be used
by application code so, I feel comfortable making this change.
2022-08-25 10:34:39 +12:00
Rob Bygrave 341b9a7449 Refactor DatabasePlatform - remove unused method tableExists() 2022-08-25 10:23:14 +12:00
Rob Bygrave 6c7cedc1f1 #2799 - Remove unused DatabasePlatform.treatEmptyStringsAsNull 2022-08-25 10:19:11 +12:00
Rob Bygrave 01155c3466 #2798 - SQL Anywhere: invalid escape character on like expression 2022-08-23 18:16:51 +12:00
Rob Bygrave c297ebda5a No effective change, fix typo in DatabasePlatform variable name 2022-08-23 16:09:45 +12:00
Rob BygraveandGitHub cec7492c10 Merge pull request #2797 from ebean-orm/feature/systemLogger-logging
Use AppLog and System.Logger for logging rather than slf4j-api
2022-08-23 15:36:49 +12:00
Rob Bygrave 4252445eb4 Use AppLog and System.Logger for logging - static imports 2022-08-23 15:18:46 +12:00
Rob Bygrave a23f241fff Use AppLog and System.Logger for logging rather than slf4j-api
The avaje-applog-slf4j dependency means this is still using
slf4j-api for implementation. Remove that dependency and
service load the desired implementation.
2022-08-18 22:44:31 +12:00
Rob BygraveandGitHub d145e6494d Merge pull request #2796 from ebean-orm/feature/final-mods-querybeans
Add missing final modifier on methods of query bean types
2022-08-18 16:55:43 +12:00
Rob Bygrave 2563d52ecf Fix versions after release 2022-08-18 16:52:10 +12:00
Rob Bygrave 8632aef268 Add missing final modifier on methods of query bean types 2022-08-18 16:49:39 +12:00
Rob Bygrave f827a292ff [maven-release-plugin] prepare for next development iteration 2022-08-18 16:04:31 +12:00
Rob Bygrave a027c630b1 [maven-release-plugin] prepare release ebean-parent-13.8.0 2022-08-18 16:04:25 +12:00
Rob Bygrave ab1a49abee Include ebean-types and persistence-api in BOM 2022-08-18 15:42:55 +12:00
Rob Bygrave bc5cf0e326 Bump to ebean-agent 13.8.0 (no effective change) 2022-08-18 15:36:48 +12:00
Rob Bygrave 348535ec6c Bump to 13.8.0-SNAPSHOT 2022-08-18 15:35:17 +12:00
Rob BygraveandGitHub 273f994cdf Merge pull request #2795 from ebean-orm/feature/refactor-methodNames-query
Refactor rename internal methods - io.ebeaninternal.server.query
2022-08-18 13:26:55 +12:00
Rob Bygrave c0a3f7e05d Refactor rename internal methods - io.ebeaninternal.server.query 2022-08-18 11:11:12 +12:00
Rob Bygrave 1bc9bab988 #2794 - ebean-test-containers - Handle SQLServer specific occasional fail on start 2022-08-18 10:19:02 +12:00
Rob Bygrave dc730fd97b #2788 - Support mapping @DbArray List<Float> to Postgres float4[] 2022-08-18 08:23:52 +12:00
Rob Bygrave 6c15115530 #2786 - Support logging Ebean version unknown
We don't really care if we can't determine the version so only log when we can read it.
2022-08-17 17:42:39 +12:00
Rob BygraveandGitHub 841b268fc7 Merge pull request #2791 from ebean-orm/feature/InternString
Just use String.intern() now that we are on min Java 11 runtime.
2022-08-17 17:38:41 +12:00
Rob BygraveandGitHub 6c8db9dec7 Merge pull request #2793 from ebean-orm/feature/2782-mariaDb-driver-update
#2782 - Support MariaDB jdbc driver update - Batched JDBC SQLException translation, SqlRow BLOB reading
2022-08-17 17:27:07 +12:00
Rob Bygrave 51d2f52d19 #2782 - Support MariaDB jdbc driver update - Batched JDBC SQLException translation, SqlRow BLOB reading
- Batched JDBC SQLException translation - Need to dig into nested exception to get cause error state
- SqlRow BLOB reading - BLOB can come as LONGVARBINARY (TestRawSqlBuilder)
- Fix test for history using system time (TestHistoryInsert)
- Fix SqlQueryCancelTest
- Fix TestSqlUpdateExceptions
2022-08-17 17:25:28 +12:00
Rob BygraveandGitHub ff45f9ab63 Merge pull request #2792 from ebean-orm/feature/2782-fwdOnlyFetchSize
#2782 #2783 - Forward only fetchSize() for MySql and MariaDB is Integer.MIN_VALUE and 1 respectively
2022-08-17 16:19:22 +12:00
Rob Bygrave 507027df0a #2782 #2783 - Forward only fetchSize() for MySql and MariaDB is Integer.MIN_VALUE and 1 respectively 2022-08-17 16:17:26 +12:00
Rob Bygrave 50d45c6da9 Just use String.intern() now that we are on min Java 11 runtime. 2022-08-17 15:21:16 +12:00
Rob BygraveandGitHub f5e9356451 Merge pull request #2783 from Wooza/patch-1
Bump mariadb-java-client to 3.0.7
2022-08-17 14:55:20 +12:00
Rob BygraveandGitHub dfe46cc011 Merge pull request #2779 from ebean-orm/feature/refactor-rename-queryplan-methods
Refactor rename internal methods for SpiQueryPlan and DbReadContext
2022-08-17 14:42:54 +12:00
Rob BygraveandGitHub 34cdbc5620 Merge pull request #2787 from ebean-orm/revert-2722-feature/jakarta-jaxb
Revert "Migrate to Jakarta JAXB (jakarta.xml.bind <- javax.xml.bind)"
2022-08-16 17:05:27 +12:00
Rob Bygrave 595c057964 #2784 - Fix @Return javadoc for TQRootBean.findSingleAttribute() 2022-08-16 17:03:07 +12:00
Rob BygraveandGitHub 73bc9e516e Revert "Migrate to Jakarta JAXB (jakarta.xml.bind <- javax.xml.bind)" 2022-08-15 15:14:57 +12:00
Rob BygraveandGitHub 6a4cfb231d Merge pull request #2785 from ebean-orm/feature/2784-findSingleAttribute-nullable
#2784 - Correct documentation for TQRootBean.findSingleAttribute with @Nullable
2022-08-12 15:54:28 +12:00
Rob Bygrave 4523db85c3 Fix for generated migration index files in test 2022-08-12 15:54:09 +12:00
Rob Bygrave d703709f14 #2784 - Correct documentation for TQRootBean.findSingleAttribute with @Nullable 2022-08-12 15:50:17 +12:00
FloandGitHub e8afba7ed2 Use fetch size 1 instead of Integer.MIN_VALUE 2022-08-10 19:26:40 +02:00
FloandGitHub dd5bb3edff Bump mariadb-java-client to 3.0.7 2022-08-10 12:48:02 +02:00
Rob Bygrave 475b05052e Refactor rename internal methods for SpiQueryPlan and DbReadContext
Change the getter methods to use accessor style
2022-08-09 15:43:16 +12:00
Rob Bygrave 4cc012b974 Bump to 13.7.1-SNAPSHOT 2022-08-09 14:26:04 +12:00
Rob Bygrave c214fe52f0 Bump to 13.7.0 2022-08-09 13:59:43 +12:00
Rob Bygrave 4f57bd3511 Prepare release, set kotlin-querybean-generator used version 2022-08-09 13:53:38 +12:00
Rob Bygrave 82dc2d031a Change EA build to just use EA,GA - remove loom,metropolis,panama 2022-08-09 12:38:04 +12:00
Rob Bygrave a831ee9ac9 Bump to 13.7.0-SNAPSHOT 2022-08-09 12:35:00 +12:00
Rob Bygrave e01b20aecb Bump to 13.7.0-SNAPSHOT 2022-08-09 12:33:44 +12:00
Rob Bygrave 58713c7083 #2770 - Improve test asserts with SqlQuery usingTransaction() 2022-08-09 12:31:36 +12:00
Rob BygraveandGitHub 2df6f2e5fb Merge pull request #2770 from ebean-orm/feature/sqlquery-useTransaction
Add SqlQuery usingTransaction() for consistency and deprecate ExtendedServer API
2022-08-09 11:59:10 +12:00
Rob Bygrave 19724e71db Merge branch 'master' of github.com:ebean-orm/ebean 2022-08-09 11:28:33 +12:00
Rob BygraveandGitHub 1a74c7ca85 Merge pull request #2778 from ebean-orm/feature/metric-naming-convention
Support a naming convention function that can be applied to metrics names for reporting
2022-08-09 11:10:51 +12:00
Rob BygraveandGitHub 0356f595c8 Merge pull request #2777 from ebean-orm/dependabot/maven/ebean-postgis/org.postgresql-postgresql-42.4.1
Bump postgresql from 42.3.3 to 42.4.1 in /ebean-postgis
2022-08-09 10:48:38 +12:00
Rob BygraveandGitHub b12a9adf46 Merge pull request #2776 from ebean-orm/dependabot/maven/ebean-test/org.postgresql-postgresql-42.4.1
Bump postgresql from 42.3.3 to 42.4.1 in /ebean-test
2022-08-09 10:48:24 +12:00
Rob BygraveandGitHub 2b874189a2 Merge pull request #2775 from ebean-orm/dependabot/maven/ebean-core/org.postgresql-postgresql-42.4.1
Bump postgresql from 42.3.3 to 42.4.1 in /ebean-core
2022-08-09 10:47:56 +12:00
Rob Bygrave f2d95cf012 Merge branch 'master' of github.com:ebean-orm/ebean 2022-08-09 10:47:09 +12:00
Rob Bygrave d4825cd72c Bump ebean-agent to 13.7.0 2022-08-09 10:46:55 +12:00
Rob Bygrave c7bd6c8bde Support a naming convention function that can be applied to metrics names for reporting
For example, can apply a lower case underscore naming convention to the metrics names. This
can be done such that it doesn't have to be applied every time the metrics are collected and
reported.
2022-08-08 21:34:00 +12:00
dependabot[bot]andGitHub c9b3a91539 Bump postgresql from 42.3.3 to 42.4.1 in /ebean-postgis
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-06 05:55:53 +00:00
dependabot[bot]andGitHub 565f6c5ac6 Bump postgresql from 42.3.3 to 42.4.1 in /ebean-test
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-06 05:55:53 +00:00
dependabot[bot]andGitHub 356b5e58d9 Bump postgresql from 42.3.3 to 42.4.1 in /ebean-core
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-06 05:55:52 +00:00
Rob BygraveandGitHub 094fc3f4b8 Merge pull request #2772 from FOCONIS/add-ebean-annotation-to-bom
Add ebean-annotation to BOM
2022-08-04 10:16:06 +12:00
Roland PramlandGitHub cfb9d860f9 Merge branch 'ebean-orm:master' into add-ebean-annotation-to-bom 2022-08-03 14:40:22 +02:00
Rob Bygrave 2f7b553d7c Bump kotlin-querybean-generator version 2022-08-03 22:18:09 +12:00
Roland Praml ec9481420c Add ebean-annotation to BOM 2022-08-03 11:34:31 +02:00
Rob BygraveandGitHub 797e1f4bd2 Merge pull request #2767 from ebean-orm/feature/2766-json-ref-bean
#2766 Explicitly specify disableLazyLoad on beans created from JSON by default
2022-08-03 20:36:19 +12:00
Rob BygraveandGitHub a14507e563 Merge pull request #2765 from ebean-orm/feature/2762-forUpdate-pagingList-count
#2762 - forUpdate is NOT included in query copy() method
2022-08-03 20:35:45 +12:00
Rob BygraveandGitHub 732f0e13e2 Merge pull request #2745 from ebean-orm/feature/2733-rename-moduleInfoLoader
#2733 - Rename ModuleInfoLoader to EntityClassRegister and _Ebean$ModuleInfo to EbeanEntityRegister
2022-08-03 20:35:21 +12:00
Rob BygraveandGitHub a6304ebe8b Merge pull request #2722 from ebean-orm/feature/jakarta-jaxb
Migrate to Jakarta JAXB (jakarta.xml.bind <- javax.xml.bind)
2022-08-03 20:34:55 +12:00
Rob Bygrave 4050d5e900 Add SqlQuery usingTransaction() for consistency and deprecate ExtendedServer API
- The ExtendedServer API is replaced by use of query usingTransaction()
- Add SqlQuery usingTransaction() for consistency with Query and DtoQuery
2022-08-02 15:35:00 +12:00
Rob Bygrave 87cc95f60d Bump to 13.6.7-SNAPSHOT after release 2022-08-02 09:12:00 +12:00
Rob Bygrave e8d663c94e [maven-release-plugin] prepare for next development iteration 2022-08-02 08:56:47 +12:00
Rob Bygrave effcb86174 [maven-release-plugin] prepare release ebean-parent-13.6.6 2022-08-02 08:56:41 +12:00
Rob Bygrave 7e50e6e427 Bump ebean-agent to 13.6.6 (no functional change) 2022-08-02 08:49:09 +12:00
Rob Bygrave 47b940f672 #2760 - Add ServerMetrics.asData() ... for consistency 2022-08-02 08:35:48 +12:00
Rob Bygrave 01d5aa8199 #2760 - Add ServerMetrics.asJson() ... to support conversion of collected metrics to json 2022-08-01 16:54:49 +12:00
Rob Bygrave 7474430a63 #2768 - ENH: Add eqIfPresent() - a helper expression for fluid style when some EQ are optional 2022-08-01 16:36:09 +12:00
Rob Bygrave ed830aeb0c #2766 - Explicitly specify disableLazyLoad on beans created from JSON (default)
- Beans created from JSON default to disableLazyLoad true
- Explicitly use new JsonReadOptions().setEnableLazyLoading(true) when lazy loading is needed
2022-08-01 15:43:08 +12:00
Rob Bygrave 54cbdae22d #2766 - Failing test for reference bean created from JSON allows lazy loading. 2022-08-01 15:38:11 +12:00
Rob Bygrave bb77d6588a #2762 - forUpdate is NOT included in query copy() method
The copy() method is used by findPagedList(), findIds(), findFutureList() etc.
2022-08-01 11:35:58 +12:00
Rob Bygrave f930471beb Update README to put build status badges at top 2022-08-01 10:19:32 +12:00
Rob Bygrave 3a84e4183d Fix platform specific asserts with TestQuerySingleAttribute using limit/offset 2022-08-01 09:45:33 +12:00
Rob Bygrave d12dc9bfed Fix platform specific asserts with TestQuerySingleAttribute using limit/offset 2022-08-01 09:37:34 +12:00
Rob Bygrave 5f689dee1b No effective change - tidy test only, TestQuerySingleAttribute 2022-08-01 09:20:38 +12:00
Rob Bygrave 08d3a3b2f5 Fix platform specific assert in test TestQuerySingleAttribute 2022-08-01 09:16:55 +12:00
Rob Bygrave 4ed5f91963 #2756 - Fix for Bug findSingleAttributeList o2m maxrows
Allow maxRows use in this case
2022-07-29 22:37:06 +12:00
Rob Bygrave f36e4543ee #2755 - Effectively fixed by #2753, format only change 2022-07-29 18:08:31 +12:00
Rob Bygrave 37f92bf967 Merge branch 'bug-singleattributelist-o2m-orderby' of github.com:FOCONIS/ebean into FOCONIS-bug-singleattributelist-o2m-orderby 2022-07-29 18:07:22 +12:00
Rob Bygrave eb14531b66 #2754 - Adjust test query for oneToMany_notNull() 2022-07-29 17:29:56 +12:00
Rob Bygrave 6c1a3647f9 Merge branch 'bug-findsingleattributelist-o2m-notnull' of github.com:FOCONIS/ebean into FOCONIS-bug-findsingleattributelist-o2m-notnull 2022-07-29 17:29:10 +12:00
Rob Bygrave fa9e9be003 #2753 - Fix for, Bug findSingleAttributeList o2m distinct 2022-07-29 17:12:51 +12:00
Rob Bygrave 02ead0bcdb Merge branch 'bug-findsingleattributelist-o2m-distinct' of github.com:FOCONIS/ebean into FOCONIS-bug-findsingleattributelist-o2m-distinct 2022-07-29 16:58:04 +12:00
Rob Bygrave 892e7bc84a Update test migration output due to remove of - NOTE: table has @History #2764
-- NOTE: table has @History - special migration may be necessary
2022-07-29 16:47:42 +12:00
Rob Bygrave 4bdcd49eab Javadoc tidy for Database and DB 2022-07-29 16:46:18 +12:00
Rob Bygrave 7a0de51721 Javadoc tidy for Database and DB 2022-07-29 16:39:13 +12:00
Rob BygraveandGitHub 0ea44b36dc Merge pull request #2764 from FOCONIS/fix-history-warning
Fix: DDL will get wrong hint for special migration
2022-07-29 08:40:24 +12:00
Rob BygraveandGitHub 35e1aa2737 Merge pull request #2763 from FOCONIS/fix-tojson-with-target
Fix: toJson must use setIntercept if target bean is passed
2022-07-29 08:38:42 +12:00
Roland Praml dab428ead5 Fix: DDL will get wrong hint for special migration 2022-07-28 15:10:37 +02:00
Roland Praml dbcc779731 Fix: toJson must use setIntercept if target bean is passed 2022-07-28 15:07:05 +02:00
Rob Bygrave 3c2b5f253f Tidy DLoadContext only 2022-07-27 22:28:15 +12:00
Rob Bygrave 31c20ca9a2 Format and imports on test code only 2022-07-27 22:26:26 +12:00
Rob Bygrave 0100d024d9 #2750 #2751 SoftDeleted entity included via lazy loading (Jackson serialisation)
The effective fix is in DLoadContext, only allow includeSoftDeletes to be set from
the query when the query is SpiQuery.Mode.NORMAL (not a lazy loading query).
2022-07-27 22:25:10 +12:00
Rob Bygrave 7a6d91c2f4 Merge branch 'update_ignores_soft_delete' of github.com:Ichtil/ebean into Ichtil-update_ignores_soft_delete 2022-07-27 21:22:16 +12:00
Rob Bygrave 31ac0f794f Add avaje-applog-slf4j dependency to ebean-api
This means by default AppLog logging goes to slf4j-api. Exclude this dependency to otherwise
control the AppLog System.Logger implementation.
2022-07-27 21:12:19 +12:00
Rob Bygrave 648bdf4553 Bump ebean-dll-runner to 2.2 2022-07-27 15:07:17 +12:00
Rob Bygrave bda0786924 #2760 - Add MetaInfoManager.metricsAsJson() ... to support conversion of collected metrics to json 2022-07-27 09:31:58 +12:00
Rob Bygrave 64311b2b9d Merge branch 'master' of github.com:ebean-orm/ebean 2022-07-26 21:25:54 +12:00
Rob Bygrave 743acf1f30 Bump avaje-config to 2.2 and ebean-datasource 8.2, these use AppLog.getLogger() to obtain System.Logger 2022-07-26 21:25:38 +12:00
Rob BygraveandGitHub 74fef50b67 Merge pull request #2758 from evolvedhat/master
Update README.md
2022-07-25 13:33:48 +12:00
evolvedhatandGitHub 185404a537 Merge pull request #1 from evolvedhat/evolvedhat-patch-1
Update README.md
2022-07-24 15:58:47 -07:00
Rob BygraveandGitHub ced5bb1089 Merge pull request #2757 from tobias-/patch-2
Add notIn(Query) to query beans
2022-07-21 08:18:24 +12:00
SnōwballandGitHub 52759e0510 Add notIn(Query) to query beans
Missing from query beans, but is available in the `ExpressionList` class.
2022-07-20 14:54:30 +02:00
Alexander Wagner 7db2210ba4 Bug findsingleattributelist o2m maxrows 2022-07-20 13:47:17 +02:00
Alexander Wagner 9b80dd97c9 Bug findsingleattributelist o2m orderby 2022-07-20 13:38:38 +02:00
Alexander Wagner 23ca0e716c Bug findsingleattributelist o2m notNull 2022-07-20 09:16:10 +02:00
Alexander Wagner eac03a0721 assert 2022-07-20 09:02:06 +02:00
Alexander Wagner cf8f099447 test for findSingleAttributeList o2m distinct 2022-07-20 09:02:06 +02:00
Rob Bygrave 6698dda8ae Improve Javadoc only for InterceptReadOnly and InterceptReadWrite 2022-07-20 10:45:27 +12:00
Rob Bygrave 1cb011df5b Improve Javadoc only for EntityBeanIntercept and InterceptReadOnly 2022-07-20 10:38:02 +12:00
Rob Bygrave ac1e1757e8 #2748 - Fix partially loaded bean scenario with .setDisableLazyLoading(true) .setBeanCacheMode(CacheMode.PUT) // force query to hit database 2022-07-20 08:16:43 +12:00
Rob Bygrave 48404fc85d #2748 - Fix setDisableLazyLoading(true) ... does not set fully loaded state [fully loaded bean scenario] 2022-07-20 07:55:42 +12:00
Rob Bygrave 9252e72581 #2748 - Fix such that .setLoadBeanCache(false) ... sets CacheMode.OFF 2022-07-20 07:45:20 +12:00
Jan Klička 64f99f5205 2750 failing test case 2022-07-15 17:49:10 +02:00
Rob Bygrave a5e3b9e68a #2749 - Bump ebean-datasource, ebean-annotation, ebean-types, persistence-api 2022-07-15 21:53:32 +12:00
evolvedhatandGitHub 4b43751512 Update README.md
Added descriptions from the website to give a better idea of what the project does.
2022-07-13 11:39:59 -07:00
Rob Bygrave 1d9db88050 #2733 - Rename ModuleInfoLoader to EntityClassRegister and _Ebean$ModuleInfo to EbeanEntityRegister 2022-07-11 15:35:46 +12:00
Rob Bygrave 5f6efd29ef #2743 - Postgres DDL - For create table, improve column ordering for tighter storage 2022-07-07 22:06:21 +12:00
Rob Bygrave 110bc614e4 #2743 - Postgres DDL - For create table, improve column ordering for tighter storage 2022-07-07 13:45:06 +12:00
Rob Bygrave ec89d31a32 Bump to 13.6.5-SNAPSHOT after release 2022-07-07 12:11:54 +12:00
Rob Bygrave fbae9cad8a #2742 - ModelContainer.applyChangeSet(ModelContainer.java:167) - IllegalArgumentException: No rule for io.ebeaninternal.dbmigration.migration.CreateSchema 2022-07-07 12:03:39 +12:00
Rob Bygrave fdfe2533c9 [maven-release-plugin] prepare for next development iteration 2022-07-06 20:59:11 +12:00
Rob Bygrave 7e3d39ac1a [maven-release-plugin] prepare release ebean-parent-13.6.5 2022-07-06 20:59:04 +12:00
Rob Bygrave ce19837649 Bump avaje-lang to 1.1 with the only change being the removal of maven pom descriptors from META-INF/maven 2022-07-06 20:49:49 +12:00
Rob Bygrave 11e20edb59 #2741 - Bump avaje-config to 2.1 and modify ebean-test to support use of ${docker.host} in test container jdbc urls 2022-07-06 20:47:54 +12:00
Rob Bygrave 88b6a60feb #2730 - Secondary @OneToMany fetch query is not happening if the same Entity type is fetched 2022-07-06 20:19:41 +12:00
Rob Bygrave 43dac07d5b #2740 - Bump ebean-test-containers to 6.2 2022-07-06 14:41:24 +12:00
Rob Bygrave 04434215d0 #2740 - Bump ebean-test-containers to 6.2 2022-07-06 14:27:28 +12:00
Rob Bygrave 52e6c0c625 #2736 - findDto nonsupport setter chain (accessor style setters, both fluid style and non fluid style) 2022-07-05 10:37:55 +12:00
Rob Bygrave 745fbe883e #2737 - Mapping of TimeZone doesn't have enough characters 2022-07-05 09:05:13 +12:00
Rob Bygrave 283e0b66fa #2734 - maven build - excluding maven descriptor (pom and properties) from built artifacts 2022-07-04 17:53:28 +12:00
Rob Bygrave 523deb20f4 #2732 - ebean-agent - skip transactional profiling aware enhancement on query beans 2022-07-04 17:05:25 +12:00
Rob Bygrave 23d52ca192 #2731 - Change ebean-querybean annotations from Retention RUNTIME to CLASS 2022-07-04 16:58:06 +12:00
Rob Bygrave d20d276d56 #2728 - Fix for stateless update with orphanRemoval=true and softDelete 2022-07-04 12:22:27 +12:00
Rob Bygrave 5b92ac6e02 Merge branch 'deleted_one_to_many_children_bug' of https://github.com/Ichtil/ebean into Ichtil-deleted_one_to_many_children_bug 2022-07-01 17:12:45 +12:00
Jan Klička 6392f90f32 Add more failing test cases 2022-06-29 18:41:19 +02:00
Jan Klička bb8f3831b8 Testcase demonstrating stateless update resulting in a delete 2022-06-29 16:09:51 +02:00
Rob Bygrave 4bb43814b7 Run build with -T 8 2022-06-28 10:30:30 +12:00
Rob Bygrave 95c1554642 Run build with -T 8, clean test only for main build 2022-06-28 10:24:35 +12:00
Rob Bygrave 2cd59c5166 Run build with -T 8 2022-06-28 09:59:37 +12:00
Rob Bygrave 2d65a3f1c9 Migrate to Jakarta JAXB (jakarta.xml.bind <- javax.xml.bind) 2022-06-17 18:10:14 +12:00
Rob Bygrave afdb1df7ce Testing nuodb 4.3.2, but it isn't supporting getGeneratedKeys for jdbc batch inserts
That breaks a lot of tests
2022-06-16 23:32:04 +12:00
Rob Bygrave fa6fdf124d Fix test BasicProfileLocationTest 2022-06-16 13:52:27 +12:00
Rob Bygrave 1e044f03ed Adjust test DefaultPersistenceContextTest 2022-06-15 22:25:46 +12:00
Rob Bygrave 7989fcd6ce Bump to 13.6.5-SNAPSHOT after release 2022-06-15 22:22:04 +12:00
Rob Bygrave a5256df6f2 [maven-release-plugin] prepare for next development iteration 2022-06-14 16:14:25 +12:00
Rob Bygrave fa11dac2b2 [maven-release-plugin] prepare release ebean-parent-13.6.4 2022-06-14 16:14:18 +12:00
Rob Bygrave c40ca2fad7 Bump agent to 13.6.4 (no effective change) 2022-06-14 16:09:13 +12:00
Rob BygraveandGitHub 5b9359f509 Merge pull request #2719 from ebean-orm/feature/postgres-default-table-partition-refactor
DDL - Refactor DDL for Postgres and YugabyteDB to just create a default partition table
2022-06-14 16:08:28 +12:00
Rob Bygrave 403556d8b2 DDL - Refactor DDL for Postgres and YugabyteDB to just create a default partition table
Removes the need and use of  PostgresPlatform.tablePartitionsExist() and PostgresPlatform.tablePartitionInit() altogether.
2022-06-14 16:00:54 +12:00
Rob Bygrave 06ad2edfc1 #2718 - [Yugabyte] Fix such that builtin table partition functions are included in DDL (when we use table partitioning) 2022-06-14 15:39:34 +12:00
Rob BygraveandGitHub 16e2489ba0 Merge pull request #2717 from ebean-orm/feature/string-jsonb
Support Postgres JSONB/JSON with String - @DbJsonb String content;
2022-06-14 15:09:05 +12:00
Rob Bygrave 162b3449e8 Put ebean.properties back to default to h2 2022-06-14 15:03:35 +12:00
Rob Bygrave 8c3ed6996e Put postgresql jdbc back to 42.3.3 2022-06-14 14:59:39 +12:00
Rob Bygrave 583c5f74eb Support Postgres JSONB/JSON with String - @DbJsonb String content; 2022-06-14 14:57:50 +12:00
Rob Bygrave ab047996d2 Add build badge for Oracle 2022-06-14 09:18:17 +12:00
Rob Bygrave 239f87bb5d Rename Oracle GH WF build 2022-06-13 22:39:35 +12:00
Rob Bygrave 5be3b7717c #2716 - Refactor ScalarType interface to make use of default methods 2022-06-13 22:38:15 +12:00
Rob Bygrave e29d83a379 #2710 - Update PersistRequestBean with checkAllMutableProperties() and checkAnyMutableProperties() 2022-06-13 18:58:38 +12:00
Rob Bygrave 8301fd5e74 #2710 - JSONB fields are not considered dirty after modified in BeanPersistController preUpdate 2022-06-13 18:35:42 +12:00
Rob Bygrave 3e3647816d #2715 - [ebean-test-containers] Fix for Postgis to support extraDb (second database), Update Oracle container 2022-06-13 15:44:52 +12:00
Rob Bygrave 9aa7ae79e2 #2713 - Improve javadoc of Finder, BeanFinder, BeanRepository - deprecate use of BeanFinder server field (migrate to database) 2022-06-09 13:26:48 +12:00
Rob Bygrave 168c940b79 #2712 - Bump jedis to 4.2.3 (from 4.2.2) 2022-06-09 12:29:52 +12:00
Rob Bygrave 1ee18a1823 #2711 - Gradle: Change querybean generator from isolating to aggregating 2022-06-09 12:26:36 +12:00
Rob BygraveandGitHub c02ab7340c Merge pull request #2708 from FOCONIS/fix-localtime
Part 1: Fix read/write/query LocalTime values
2022-06-09 12:00:06 +12:00
Rob BygraveandGitHub c67773505d Merge pull request #2706 from FOCONIS/findsingleattributeset
ENH: Add support for findSingleAttributeSet()
2022-06-09 11:50:04 +12:00
Noemi Praml 9c354919e5 refactoring
(cherry picked from commit 43e28c4f5c747cdda2e3547a8db593eab490ceec)
2022-05-31 10:49:09 +02:00
Noemi Praml c8be59fd95 it fixes the test
(cherry picked from commit d2e21aa3dcbd4ae59dd8d1ff5404d94c298f087b)
2022-05-31 10:47:32 +02:00
Noemi Praml d1a40b4739 failing test 2022-05-31 10:47:08 +02:00
Noemi Praml bb9cfe9d0f add support for findSingleAttributeSet 2022-05-24 11:09:56 +02:00
Rob Bygrave ede2ad4d54 Bump test modules to 13.6.4-SNAPSHOT after release 2022-05-24 14:01:05 +12:00
Rob Bygrave 1060503fe1 [maven-release-plugin] prepare for next development iteration 2022-05-24 13:46:16 +12:00
Rob Bygrave 2edfc33d00 [maven-release-plugin] prepare release ebean-parent-13.6.3 2022-05-24 13:46:09 +12:00
Rob Bygrave 37902c75eb Bump ebean-agent to 13.6.3 2022-05-24 13:41:13 +12:00
Rob BygraveandGitHub 14abb34739 Merge pull request #2704 from ebean-orm/feature/2702-renameTable
#2702 - IllegalArgumentException: No rule for io.ebeaninternal.dbmigration.migration.RenameTable
2022-05-24 10:55:11 +12:00
Rob Bygrave 68680ffd34 #2702 - IllegalArgumentException: No rule for io.ebeaninternal.dbmigration.migration.RenameTable
Add support for applying the RenameTable change to the model.
2022-05-24 10:48:38 +12:00
Rob Bygrave 8106ffd73d #2703 - Bump ebean-test-containers to 6.0 (Java 11 and System.Logger) 2022-05-24 10:20:04 +12:00
Rob BygraveandGitHub d00cb854fc Merge pull request #2703 from ebean-orm/feature/ebean-test-containers
ebean-test-docker was renamed to ebean-test-containers
2022-05-24 09:03:22 +12:00
Rob Bygrave ca445b5226 ebean-test-docker was renamed to ebean-test-containers
- Migrate from io.ebean:ebean-test-docker -> io.ebean:ebean-test-containers
- Migrate (with 5.8) package from io.ebean.docker.commands -> io.ebean.test.containers
2022-05-24 08:54:58 +12:00
Rob Bygrave 74b4994221 #2701 -[DDL] Postgres DDL generation for table partitioning with schema - helper method to add partitions does not work
This also removes the helper partition_init() stored function as it isn't really needed now that postgres has default partition support (since PG11 actually, partition_init predates PG11).
2022-05-23 20:39:45 +12:00
Rob Bygrave 62106935f4 Bump test modules to 13.6.3-SNAPSHOT after release 2022-05-18 21:01:40 +12:00
Rob Bygrave bf034eb2a1 Bump test modules to 13.6.3-SNAPSHOT after release 2022-05-18 20:26:30 +12:00
Rob Bygrave c5e980991e [maven-release-plugin] prepare for next development iteration 2022-05-18 20:11:18 +12:00
Rob Bygrave 1004675a0b [maven-release-plugin] prepare release ebean-parent-13.6.2 2022-05-18 20:11:12 +12:00
Rob Bygrave 12e508ab48 Merge branch 'master' of github.com:ebean-orm/ebean 2022-05-18 18:25:38 +12:00
Rob Bygrave be0e1116a7 Bump ebean-agent to 13.6.2 2022-05-18 18:25:24 +12:00
Rob BygraveandGitHub 4b03c8a00a Merge pull request #2698 from ebean-orm/feature/tidy-beancollection
No effective change - tidy BeanList etc, BeanCollectionHelpFactory to use specific CQueryCollectionAdd for List and Set
2022-05-18 18:03:09 +12:00
Rob Bygrave 0db93bc82d No effective change - tidy BeanList etc, BeanCollectionHelpFactory to use specific CQueryCollectionAdd for List and Set 2022-05-18 17:33:08 +12:00
Rob Bygrave e04a1baabe Bump tile enhancement to 13.6.0 2022-05-18 15:35:38 +12:00
Rob BygraveandGitHub 506e2f5625 Merge pull request #2697 from ebean-orm/feature/postgres-table-partitioning-pk
Postgres DDL - With Postgres table partitioning, add partition column to primary key
2022-05-17 22:18:55 +12:00
Rob Bygrave 7fbc1f8111 Postgres DDL - With Postgres table partitioning, add partition column to primary key
- Postgres DDL generation
- Using table partitioning
- There is a primary key defined that doesn't contain the partition column

In DDL generation, automatically add the partition column to the DB primary key.
2022-05-17 21:39:06 +12:00
Rob Bygrave 4084822d2c Bump to 13.0.0 and Java 11 2022-03-31 14:38:41 +13:00
Rob Bygrave a2c82263ee Bump to 12.12.0 2021-09-24 11:29:50 +12:00
rbygrave 30f3d542b3 Bump to 12.11.4 2021-09-09 13:10:13 +12:00
rbygrave 56cb2c69aa Bump to 12.11.1 2021-08-16 19:49:02 +12:00
rbygrave bd1dd43cbf Bump to 12.11.0 2021-08-16 19:43:28 +12:00
rob bygrave 5caae29df9 [maven-release-plugin] prepare for next development iteration 2020-12-23 20:46:33 +13:00
rob bygrave 9713b607b5 [maven-release-plugin] prepare release ebean-spring-txn-12.6.4 2020-12-23 20:46:10 +13:00
rob bygrave 0e46558cae Bump ebean to 12.6.4 for #22 2020-12-23 20:45:33 +13:00
Rob BygraveandGitHub 2386f1034b Merge pull request #24 from spinachomes/master
add fail situation for transaction Propagation.REQUIRES_NEW
2020-12-21 16:30:02 +13:00
李清波 ddf9f5c508 add fail situation for transaction Propagation.REQUIRES_NEW 2020-12-21 11:23:00 +08:00
rob bygrave 559867294f Add test for transaction Propagation.REQUIRES_NEW 2020-12-21 14:47:23 +13:00
rob bygrave bf0c8d8dab Add test for transaction Propagation.REQUIRES_NEW 2020-12-21 14:45:13 +13:00
rob bygrave 7077e92cb0 [maven-release-plugin] prepare for next development iteration 2020-12-18 15:29:36 +13:00
rob bygrave 035c5570c3 [maven-release-plugin] prepare release ebean-spring-txn-12.6.3 2020-12-18 15:29:25 +13:00
rob bygrave 0be0fd1e05 Bump to 12.6.3-SNAPSHOT 2020-12-18 15:28:31 +13:00
rob bygrave bdfd380687 #23 - Use updated PostCommit to send ChangeLog changes. Use PreCommit to flush last ChangeLog changes at PreCommit 2020-12-18 14:55:57 +13:00
rob bygrave d1a4c73cd6 [maven-release-plugin] prepare for next development iteration 2020-12-18 10:01:04 +13:00
rob bygrave 7133c81fc5 [maven-release-plugin] prepare release ebean-spring-txn-12.4.2 2020-12-18 10:00:52 +13:00
rob bygrave c6b4de39e8 Merge branch 'master' of github.com:ebean-orm/ebean-spring-txn 2020-12-18 09:58:30 +13:00
rob bygrave 94f367af70 #22 - Spring @Transactional with batch mode not invoking ebean batch flush 2020-12-18 09:58:16 +13:00
Rob BygraveandGitHub dc6c393300 Merge pull request #21 from ebean-orm/dependabot/maven/junit-junit-4.13.1
Bump junit from 4.12 to 4.13.1
2020-10-13 22:55:00 +13:00
dependabot[bot]andGitHub 239f3a0a54 Bump junit from 4.12 to 4.13.1
Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.1.
- [Release notes](https://github.com/junit-team/junit4/releases)
- [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md)
- [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-13 07:51:29 +00:00
rob bygrave d3e78ab54e [maven-release-plugin] prepare for next development iteration 2020-09-18 01:15:35 +12:00
rob bygrave c6483535bd [maven-release-plugin] prepare release ebean-spring-txn-12.4.1 2020-09-18 01:15:24 +12:00
rob bygrave 95bb2a5d56 Bump to 12.4.1 2020-09-18 01:14:52 +12:00
rob bygrave 23649ed840 [maven-release-plugin] prepare for next development iteration 2020-03-13 17:12:25 +13:00
rob bygrave 3ee4034a76 [maven-release-plugin] prepare release ebean-spring-txn-12.2.1 2020-03-13 17:12:15 +13:00
rob bygrave 21d377546e Bump to 12.2.1 2020-03-13 17:10:21 +13:00
rob bygrave 8c9dccc6a3 [maven-release-plugin] prepare for next development iteration 2019-10-14 14:53:28 +13:00
rob bygrave 6fdf681993 [maven-release-plugin] prepare release ebean-spring-txn-12.1.1 2019-10-14 14:53:19 +13:00
rob bygrave 7e8f413578 No effective change - sync to Ebean 12.1.1 2019-10-14 14:52:46 +13:00
rob bygrave 6705e5a962 Bump Ebean provided dependency to 11.42.1 2019-08-08 22:14:44 +12:00
Rob Bygrave d9126a936d [maven-release-plugin] prepare for next development iteration 2018-03-12 21:45:57 +13:00
Rob Bygrave 4ee024b1ce [maven-release-plugin] prepare release ebean-spring-txn-11.10.4 2018-03-12 21:45:45 +13:00
Rob Bygrave 19491d5ae6 #19 - java.lang.IllegalStateException: Transaction is Inactive ... when using Ebean transactions with Ebean's Spring transaction manager 2018-03-12 21:45:14 +13:00
Rob Bygrave db816594c5 No effective change - tidy tests 2018-02-23 10:50:51 +13:00
Rob Bygrave fa73b7791f [maven-release-plugin] prepare for next development iteration 2018-02-09 23:49:03 +13:00
Rob Bygrave c61da5b0e5 [maven-release-plugin] prepare release ebean-spring-txn-11.10.3 2018-02-09 23:48:50 +13:00
Rob Bygrave 49d724ad65 Bump pom version to align with Ebean version 2018-02-09 23:48:01 +13:00
Rob Bygrave 3ee2410a79 #18 - SpringJdbcTransactionManager inifinite recursion (Ebean #1254)
Update pom ebean version
2018-02-09 23:46:38 +13:00
Rob Bygrave c2ddc70565 #18 - SpringJdbcTransactionManager inifinite recursion (Ebean #1254) 2018-02-09 23:05:27 +13:00
Rob Bygrave 2f66e07c25 Add test for https://github.com/ebean-orm/ebean/issues/1254 2018-02-09 22:20:57 +13:00
Rob Bygrave 0807569ee2 Update readme 2018-02-03 00:14:00 +13:00
Rob Bygrave 206dec1bf8 [maven-release-plugin] prepare for next development iteration 2018-02-03 00:05:12 +13:00
Rob Bygrave 0e852f5bb5 [maven-release-plugin] prepare release ebean-spring-txn-11.10.1 2018-02-03 00:04:59 +13:00
Rob Bygrave a272fb4e02 #17 - Refactor to use the better internals in Ebean 11.10.1 2018-02-03 00:04:22 +13:00
Rob Bygrave cbdc6e09aa [maven-release-plugin] prepare for next development iteration 2018-01-30 23:53:23 +13:00
Rob Bygrave 211087f636 [maven-release-plugin] prepare release ebean-spring-txn-11.5.1 2018-01-30 23:53:10 +13:00
Rob Bygrave dca824b431 #16 - Bump to support Ebean 11.5.1+ 2018-01-30 23:52:40 +13:00
Rob Bygrave 6bcc8eb0f2 Update Readme 2016-12-21 21:11:00 +13:00
Rob Bygrave 844df4d5c9 Update scm due to rename to ebean-spring-txn 2016-12-21 21:04:47 +13:00
Rob Bygrave 6360d5fe1c [maven-release-plugin] prepare for next development iteration 2016-12-21 20:59:11 +13:00
Rob Bygrave e57a074b68 [maven-release-plugin] prepare release ebean-spring-txn-10.1.1 2016-12-21 20:59:00 +13:00
Rob Bygrave 052632239e pom - update name 2016-12-21 20:58:28 +13:00
Rob Bygrave 16aa4caceb #15 - Rename artifact to ebean-spring-txn ... (as this is specific and only for integration with spring transactions) 2016-12-21 20:57:28 +13:00
Rob Bygrave 83d84f6079 #14 - Remove agent loading feature for spring boot as it has been moved to ebean-spring-agent 2016-12-21 20:53:33 +13:00
Rob Bygrave 23c278d878 pom dependencies - ebean and slf4j-api as provided (versions expected to be controlled externally) 2016-12-21 20:44:47 +13:00
Rob Bygrave 7074b0de71 No effective change - use enhanced for 2016-12-19 16:40:00 +13:00
Rob BygraveandGitHub 2a9b025e88 Merge pull request #12 from ksperling/agent-autoconfig
Agent autoconfig and misc changes
2016-12-19 13:07:30 +13:00
Karsten Sperling 16b3a0b1c1 Rename from springtxn to spring since boot support is included as well (and Environment configuration support to come) 2016-12-16 23:38:36 +13:00
Karsten Sperling e0c4f73600 POM tidying 2016-12-16 23:38:36 +13:00
Karsten Sperling 6eb1947a6e Add EbeanAgentAutoConfiguration for Spring Boot 2016-12-16 23:38:36 +13:00
Rob Bygrave 2f793c29dc #11 - Repackage to io.ebean.springtxn ... remove factory bean support (move it to src/test as example) 2016-12-13 21:50:11 +13:00
Rob Bygrave 326fc221bf pom - modify scm to use ssh 2016-11-17 12:29:02 +13:00
Rob Bygrave d49018363c [maven-release-plugin] prepare for next development iteration 2016-11-17 12:19:27 +13:00
Rob Bygrave 2a2a0ad1f4 [maven-release-plugin] prepare release ebean-spring-7.2.1 2016-11-17 12:19:12 +13:00
Rob Bygrave 463b03ef7c bump pom to 7.2.1-SNAPSHOT 2016-11-17 12:18:01 +13:00
Rob BygraveandGitHub 80d39775ba Merge pull request #10 from ksperling/logging-tidyup
Use slf4j for logging and tidy up dependencies.
2016-11-17 12:14:08 +13:00
Karsten Sperling 92cdd25ca9 Use slf4j for logging and tidy up dependencies. 2016-11-17 09:37:41 +13:00
Rob BygraveandGitHub 53680ba53b Merge pull request #8 from ksperling/spring-tx-flush
Propagate 'flush' calls from Spring TX synchronization to the ebean
2016-11-14 15:23:26 +13:00
Karsten Sperling aa85c5fa3b Propagate 'flush' calls from Spring TX synchronization to the ebean transaction. 2016-11-14 13:30:03 +13:00
Robin Bygrave a1ce6f8a81 [maven-release-plugin] prepare for next development iteration 2016-08-03 17:46:37 +12:00
Robin Bygrave 7480904792 [maven-release-plugin] prepare release ebean-spring-7.1.2 2016-08-03 17:46:18 +12:00
Robin Bygrave b12cfafc21 Change groupId to ... org.avaje.ebean, and artifactId to ... ebean-spring 2016-08-03 17:45:51 +12:00
Robin Bygrave f07727651e [maven-release-plugin] prepare for next development iteration 2016-05-18 08:33:54 +12:00
Robin Bygrave 6090eaa167 [maven-release-plugin] prepare release avaje-ebeanorm-spring-7.1.1 2016-05-18 08:33:34 +12:00
Robin Bygrave 40eada4e80 #6 - Modify POM dependencies, change to provided scope for Ebean and Spring context 2016-05-18 08:33:04 +12:00
Robin Bygrave 2d375b3596 [maven-release-plugin] prepare for next development iteration 2015-11-04 08:34:33 +13:00
Robin Bygrave d864e2c723 [maven-release-plugin] prepare release avaje-ebeanorm-spring-6.1.1 2015-11-04 08:34:08 +13:00
Robin Bygrave e50c372562 Bump pom to 6.1.1-SNAPSHOT 2015-11-04 08:33:37 +13:00
Robin Bygrave e2cb033119 #5 - Error creating bean with name 'serverConfig' defined in class path resource [init-database.xml]: Cannot create inner bean 'com.avaje.ebean.config.AutofetchConfig#2e385cce' of type [com.avaje.ebean.config.AutofetchConfig] while setting bean property 'autofetchConfig' 2015-11-04 08:33:16 +13:00
Robin Bygrave 9620c57f19 [maven-release-plugin] prepare for next development iteration 2015-07-30 05:03:49 +12:00
Robin Bygrave 07cc0fcbb6 [maven-release-plugin] prepare release avaje-ebeanorm-spring-4.5.3 2015-07-30 05:03:28 +12:00
Robin Bygrave 6d1beb5c03 Add javadoc-plugin to pom 2015-07-30 05:03:05 +12:00
Robin Bygrave 1667107422 Update spring xsd to spring-beans-4.1.xsd 2015-07-30 04:57:03 +12:00
Robin Bygrave de5cf1df2c No effective change - format 2015-07-30 04:54:25 +12:00
Robin Bygrave a83114ced2 Update tests and dependencies 2015-07-30 04:53:25 +12:00
Rob Bygrave d6983422bf Merge pull request #3 from abguorui0928/master
Create AgentLoaderSupport.java
2015-05-14 22:45:43 +12:00
guor 6d4b3ad84e Create AgentLoaderSupport.java
add support for setup enhancement in spring
2015-05-11 21:01:58 +08:00
Eddie Mc Greal a3df7919b5 Updated to correct ebeanorm dependency range 2015-01-20 09:54:21 +01:00
Rob Bygrave 6f1aa39cc9 Merge pull request #2 from nedge/master
Update Version to 4.1.9 and edited MANIFEST for OSGi
2014-10-15 19:56:11 +13:00
Eddie Mc Greal f18c24c1d1 Update Version to 4.1.9 and edited MANIFEST for OSGi 2014-10-14 08:11:32 +02:00
Rob Bygrave 068401c29c [maven-release-plugin] prepare for next development iteration 2014-04-02 22:15:51 +13:00
Rob Bygrave 6fbbd8b107 [maven-release-plugin] prepare release avaje-ebeanorm-spring-3.3.1 2014-04-02 22:15:25 +13:00
Rob Bygrave 6379bd9e5d Set pom to 3.3.1-SNAPSHOT, ready for release 2014-04-02 22:12:31 +13:00
Rob Bygrave 94d58dfa7c Merge pull request #1 from nedge/develop
Changed to correct version and removed old logging config stuff
2014-04-02 22:08:21 +13:00
Eddie Mc Greal 035fb80959 Changed to correct version and removed old logging config stuff 2014-03-06 22:17:55 +01:00
Robin Bygrave 3b97f77083 [maven-release-plugin] prepare for next development iteration 2013-04-29 21:27:36 +12:00
Robin Bygrave a7d47202e6 [maven-release-plugin] prepare release avaje-ebeanorm-spring-3.2.1 2013-04-29 21:27:19 +12:00
Robin Bygrave 199a9d3118 Opps, fixed scm location 2013-04-29 21:26:37 +12:00
Robin Bygrave 5df3ac4b04 Change package of test beans etc for enhancement 2013-04-29 21:13:37 +12:00
Robin Bygrave 782f77b688 [maven-release-plugin] prepare for next development iteration 2012-09-15 01:32:05 +12:00
Robin Bygrave 1d570a233e [maven-release-plugin] prepare release avaje-ebeanorm-spring-3.1.1 2012-09-15 01:31:49 +12:00
Robin Bygrave 4a6b58bd9b Remove commons logging from dependency 2012-09-15 01:30:21 +12:00
rbygrave d64073bef0 Change license to Apache2, clean up dependencies 2012-09-15 01:15:37 +12:00
rbygrave 6d8a9236f8 initial add of EbeanORM spring from v2.8.1 2012-09-14 01:06:56 +12:00
Rob Bygrave 1665b4f2fa Initial commit 2012-09-13 05:59:29 -07:00
1365 changed files with 20469 additions and 18359 deletions
+4 -4
View File
@@ -17,14 +17,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'zulu'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
@@ -36,5 +36,5 @@ jobs:
# - name: Maven single test
# run: mvn --batch-mode clean verify -Dtest="io.ebeaninternal.server.core.DefaultServer_getReferenceTest" -DfailIfNoTests=false
- name: Build with Maven
run: mvn clean package
run: mvn -T 8 clean test
+4 -4
View File
@@ -20,14 +20,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'adopt'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
@@ -35,4 +35,4 @@ jobs:
~/.m2
key: build-${{ env.cache-name }}
- name: db2
run: mvn clean test -Dprops.file=testconfig/ebean-db2.properties
run: mvn -T 8 clean test -Dprops.file=testconfig/ebean-db2.properties
+4 -4
View File
@@ -20,14 +20,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'zulu'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
@@ -37,5 +37,5 @@ jobs:
- name: Maven version
run: mvn --version
- name: H2Database
run: mvn clean package
run: mvn -T 8 clean package
-39
View File
@@ -1,39 +0,0 @@
name: JDK 18-ea
on:
workflow_dispatch:
schedule:
- cron: '30 6 * * 1,3,5'
jobs:
build:
runs-on: ${{ matrix.os }}
permissions:
contents: read
packages: write
strategy:
fail-fast: false
matrix:
java_version: [18-ea]
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- name: Set up Java
uses: actions/setup-java@v2
with:
java-version: ${{ matrix.java_version }}
distribution: 'zulu'
- name: Maven cache
uses: actions/cache@v2
env:
cache-name: maven-cache
with:
path:
~/.m2
key: build-${{ env.cache-name }}
- name: Build with Maven
run: mvn package
+4 -6
View File
@@ -16,20 +16,18 @@ jobs:
strategy:
fail-fast: false
matrix:
## valhalla - failing on javadoc with:
## javadoc: error - The code being documented uses packages in the unnamed module, but the packages defined in https://ebean.io/platforms/ebean-platform-h2/apidocs/ are in named modules.
java_version: [GA,EA,loom,metropolis,panama]
java_version: [GA,EA]
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: oracle-actions/setup-java@v1
with:
website: jdk.java.net
release: ${{ matrix.java_version }}
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
@@ -39,5 +37,5 @@ jobs:
- name: Maven version
run: mvn --version
- name: Build with Maven
run: mvn package
run: mvn -T 8 test
+4 -4
View File
@@ -20,14 +20,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'adopt'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
@@ -35,4 +35,4 @@ jobs:
~/.m2
key: build-${{ env.cache-name }}
- name: mariadb 10.6
run: mvn clean test -Dprops.file=testconfig/ebean-mariadb.properties
run: mvn -T 8 clean test -Dprops.file=testconfig/ebean-mariadb.properties
+3 -3
View File
@@ -17,14 +17,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'adopt'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
+3 -3
View File
@@ -20,14 +20,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'zulu'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
+4 -4
View File
@@ -20,14 +20,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'adopt'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
@@ -35,4 +35,4 @@ jobs:
~/.m2
key: build-${{ env.cache-name }}
- name: mysql
run: mvn clean test -Dprops.file=testconfig/ebean-mysql.properties
run: mvn -T 8 clean test -Dprops.file=testconfig/ebean-mysql.properties
@@ -1,5 +1,5 @@
name: Oracle18
name: Oracle
on:
workflow_dispatch:
@@ -20,14 +20,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'zulu'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
@@ -35,4 +35,4 @@ jobs:
~/.m2
key: build-${{ env.cache-name }}
- name: oracle
run: mvn clean test -Dprops.file=testconfig/ebean-oracle.properties
run: mvn -T 8 clean test -Dprops.file=testconfig/ebean-oracle.properties
+4 -4
View File
@@ -20,14 +20,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'adopt'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
@@ -35,4 +35,4 @@ jobs:
~/.m2
key: build-${{ env.cache-name }}
- name: postgres
run: mvn clean test -Dprops.file=testconfig/ebean-postgres.properties
run: mvn -T 8 clean test -Dprops.file=testconfig/ebean-postgres.properties
+3 -3
View File
@@ -17,14 +17,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'adopt'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
+4 -4
View File
@@ -20,14 +20,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'adopt'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
@@ -35,4 +35,4 @@ jobs:
~/.m2
key: build-${{ env.cache-name }}
- name: sqlserver 2017
run: mvn clean test -Dprops.file=testconfig/ebean-sqlserver17.properties
run: mvn -T 8 clean test -Dprops.file=testconfig/ebean-sqlserver17.properties
+3 -3
View File
@@ -20,14 +20,14 @@ jobs:
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Set up Java
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java_version }}
distribution: 'adopt'
- name: Maven cache
uses: actions/cache@v2
uses: actions/cache@v3
env:
cache-name: maven-cache
with:
+37 -6
View File
@@ -1,26 +1,55 @@
[![Build](https://github.com/ebean-orm/ebean/actions/workflows/build.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/build.yml)
[![Maven Central : ebean](https://maven-badges.herokuapp.com/maven-central/io.ebean/ebean/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.ebean/ebean)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/ebean-orm/ebean/blob/master/LICENSE)
[![Multi-JDK Build](https://github.com/ebean-orm/ebean/actions/workflows/multi-jdk-build.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/multi-jdk-build.yml)
[![JDK 18-ea](https://github.com/ebean-orm/ebean/actions/workflows/jdk-18-ea.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/jdk-18-ea.yml)
##### Build with database platforms
[![H2Database](https://github.com/ebean-orm/ebean/actions/workflows/h2database.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/h2database.yml)
[![Postgres](https://github.com/ebean-orm/ebean/actions/workflows/postgres.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/postgres.yml)
[![MySql](https://github.com/ebean-orm/ebean/actions/workflows/mysql.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/mysql.yml)
[![MariaDB](https://github.com/ebean-orm/ebean/actions/workflows/mariadb.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/mariadb.yml)
[![Oracle](https://github.com/ebean-orm/ebean/actions/workflows/oracle.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/oracle.yml)
[![SqlServer](https://github.com/ebean-orm/ebean/actions/workflows/sqlserver.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/sqlserver.yml)
[![DB2 LUW](https://github.com/ebean-orm/ebean/actions/workflows/db2luw.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/db2luw.yml)
[![Yugabyte](https://github.com/ebean-orm/ebean/actions/workflows/yugabyte.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/yugabyte.yml)
#### Builds against EA (Early Access) versions of Java (19, Loom, panama etc)
##### Build with Java Early Access versions
[![ebean EA](https://github.com/ebean-orm/ebean/actions/workflows/jdk-ea.yml/badge.svg)](https://github.com/ebean-orm/ebean/actions/workflows/jdk-ea.yml)
[![datasource EA](https://github.com/ebean-orm/ebean-datasource/actions/workflows/jdk-ea.yml/badge.svg)](https://github.com/ebean-orm/ebean-datasource/actions/workflows/jdk-ea.yml)
[![migration EA](https://github.com/ebean-orm/ebean-migration/actions/workflows/jdk-ea.yml/badge.svg)](https://github.com/ebean-orm/ebean-migration/actions/workflows/jdk-ea.yml)
[![test-docker EA](https://github.com/ebean-orm/ebean-test-docker/actions/workflows/jdk-ea.yml/badge.svg)](https://github.com/ebean-orm/ebean-test-docker/actions/workflows/jdk-ea.yml)
[![ebean-agent EA](https://github.com/ebean-orm/ebean-agent/actions/workflows/jdk-ea.yml/badge.svg)](https://github.com/ebean-orm/ebean-agent/actions/workflows/jdk-ea.yml)
----------------------
# Ebean ORM for Java & Kotlin
**Multiple abstraction levels**: Ebean provides multiple levels of query abstraction [ORM Queries, mixed with SQL](https://ebean.io/docs/intro/queries/orm-query), [DTO Queries](https://ebean.io/docs/intro/queries/dto-query), [SqlQuery and JDBC](https://ebean.io/docs/intro/queries/sql-query).
Work at the highest level of abstraction and drop down levels as needed.
**Database migrations**: Built in [DB migration](https://ebean.io/docs/db-migrations/) generation and running. Support for "rebase" migrations as well as repeatable, init and 'normal' migrations.
**Awesome SQL**: Ebean produces SQL that you would hand craft yourself. Use great SQL, never generate SQL cartesian product, always honor relational limit/offset.
**Automated query tuning**: For ORM queries Ebean can profile the object graph being used and either [automatically tune the query](https://ebean.io/docs/query/background/autotune).
**Docker test containers**: [Docker test containers](https://ebean.io/docs/testing/) for all the supported databases. Get 100% test coverage on all the features of the database we use.
**Type safe queries**: We can build queries using type safe [query beans](https://ebean.io/docs/query/query-beans). IDE auto-complete when writing queries, compile time checking and it's FUN.
**Performance isn't optional**: Optimise queries to only fetch what we need (partial objects). Automatically avoid N+1 via a smart load context.
#### Benefits of ORM
* Automatically avoid N+1
* L2 caching to reduce database load
* Queries mixing database and L2 cache
* Automatically tune ORM queries
* Elasticsearch for search or L3 cache
----------------------
# Sponsors
<table>
<tbody>
@@ -50,13 +79,14 @@
</table>
## Need help?
Post questions or issues to the Ebean google group - https://groups.google.com/forum/#!forum/ebean
Post questions or issues to the [Ebean google group](https://groups.google.com/forum/#!forum/ebean)
or [github discussions](https://github.com/ebean-orm/ebean/discussions)
## Documentation
Goto [https://ebean.io/docs/](https://ebean.io/docs/)
## Maven central
[Maven central - io.ebean](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22io.ebean%22%20)
[Maven central - g:io.ebean](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22io.ebean%22%20)
## Building Ebean from source
@@ -90,3 +120,4 @@ To set this option as the global default for IntelliJ use:
`Run - Edit Configurations -> Edit configuration templates -> JUnit -> modify options - Do not use module-path option`
end
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-clickhouse</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-clickhouse</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-cockroach</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-db2</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-db2</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-h2</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-h2</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-hana</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-hana</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-mariadb</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mariadb</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-mysql</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-mysql</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-nuodb</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-nuodb</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-oracle</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-oracle</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-postgres</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-sqlite</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlite</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-sqlserver</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-sqlserver</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+11 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean-yugabyte</name>
@@ -16,13 +16,13 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +31,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-postgres</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+29 -5
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>composites</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean (all platforms)</name>
@@ -16,13 +16,31 @@
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-api</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-core</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-joda-time</artifactId>
<version>13.18.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-jackson-jsonnode</artifactId>
<version>13.18.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-jackson-mapper</artifactId>
<version>13.19.0</version>
</dependency>
<dependency>
@@ -31,17 +49,23 @@
<version>${ebean-datasource.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-migration</artifactId>
<version>${ebean-migration.version}</version>
</dependency>
<!-- Technically optional but most expected to use query beans -->
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-querybean</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-platform-all</artifactId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</dependency>
</dependencies>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<artifactId>composites</artifactId>
+57 -25
View File
@@ -4,7 +4,7 @@
<parent>
<artifactId>ebean-parent</artifactId>
<groupId>io.ebean</groupId>
<version>13.6.2-SNAPSHOT</version>
<version>13.19.0</version>
</parent>
<name>ebean api</name>
@@ -13,21 +13,17 @@
<dependencies>
<!--
Projects are expected to explicit depend on version
of slf4j that they want to use
-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.avaje</groupId>
<artifactId>avaje-config</artifactId>
<version>2.0</version>
<artifactId>avaje-applog</artifactId>
<version>1.0</version>
</dependency>
<!-- exclude avaje-applog-slf4j to direct logging to something else -->
<dependency>
<groupId>io.avaje</groupId>
<artifactId>avaje-applog-slf4j</artifactId>
<version>1.0</version>
</dependency>
<!--
@@ -37,25 +33,31 @@
<dependency>
<groupId>io.avaje</groupId>
<artifactId>avaje-lang</artifactId>
<version>1.0</version>
<version>1.1</version>
</dependency>
<dependency>
<groupId>io.avaje</groupId>
<artifactId>avaje-config</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>persistence-api</artifactId>
<version>2.2.5</version>
<version>${ebean-persistence-api.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-annotation</artifactId>
<version>8.0</version>
<version>${ebean-annotation.version}</version>
</dependency>
<dependency>
<groupId>io.ebean</groupId>
<artifactId>ebean-types</artifactId>
<version>2.2</version>
<version>${ebean-types.version}</version>
</dependency>
<dependency>
@@ -64,6 +66,14 @@
<version>${ebean-datasource.version}</version>
</dependency>
<!-- Support MdcBackgroundExecutorWrapper -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
<optional>true</optional>
</dependency>
<!-- Jackson core used internally by Ebean -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
@@ -80,19 +90,22 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
<optional>true</optional>
</dependency>
<!-- JAVAX-DEPENDENCY-START -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<optional>true</optional>
</dependency>
<!-- JAVAX-DEPENDENCY-END -->
<!-- JAKARTA-DEPENDENCY-START ___
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<optional>true</optional>
</dependency>
____ JAKARTA-DEPENDENCY-END -->
<dependency>
<groupId>io.avaje</groupId>
@@ -103,4 +116,23 @@
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/ebean-maven-version.txt</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/ebean-maven-version.txt</exclude>
</excludes>
</resource>
</resources>
</build>
</project>
@@ -12,6 +12,7 @@ import java.util.Optional;
* </p>
* <pre>{@code
*
* @Component
* public class CustomerFinder extends BeanFinder<Long,Customer> {
*
* @Inject
@@ -26,29 +27,31 @@ import java.util.Optional;
*
* @param <I> The ID type
* @param <T> The Bean type
*
* @see BeanRepository
*/
@NonNullApi
public abstract class BeanFinder<I,T> {
protected final Database server;
protected final Database database;
protected final Class<T> type;
/**
* Create with the given bean type and Database instance.
*
* @param type The bean type
* @param server The Database instance typically created via Spring factory or equivalent.
* @param database The Database instance typically created via Spring factory or equivalent.
*/
protected BeanFinder(Class<T> type, Database server) {
protected BeanFinder(Class<T> type, Database database) {
this.type = type;
this.server = server;
this.database = database;
}
/**
* Return the Database to use.
*/
public Database db() {
return server;
return database;
}
/**
@@ -70,10 +73,10 @@ public abstract class BeanFinder<I,T> {
* <p>
* This is equivalent to {@link DB#byName(String)}
*
* @param server The name of the Database. If this is null then the default Database is returned.
* @param name The name of the Database. If this is null then the default Database is returned.
*/
public Database db(String server) {
return DB.byName(server);
public Database db(String name) {
return DB.byName(name);
}
/**
@@ -6,11 +6,15 @@ import io.ebean.bean.EntityBean;
import java.util.Collection;
/**
* Provides finder functionality for use with "Dependency Injection style" use of Ebean.
* Provides find and persist functionality for use with "Dependency Injection style" use of Ebean.
* <p>
* Extend the BeanRepository with additional finder and persisting methods as needed by the
* application. The intention is to keep all the related logic together, for example, all the
* persisting and finding logic for Customer would be in CustomerRepository.
*
* <pre>{@code
*
* @Repository
* @Component
* public class CustomerRepository extends BeanRepository<Long,Customer> {
*
* @Inject
@@ -50,10 +54,10 @@ public abstract class BeanRepository<I, T> extends BeanFinder<I, T> {
* }</pre>
*
* @param type The bean type
* @param server The Database instance typically created via Spring factory or equivalent
* @param database The Database instance typically created via Spring factory or equivalent
*/
protected BeanRepository(Class<T> type, Database server) {
super(type, server);
protected BeanRepository(Class<T> type, Database database) {
super(type, database);
}
/**
@@ -122,8 +126,8 @@ public abstract class BeanRepository<I, T> extends BeanFinder<I, T> {
/**
* Save all the beans in the collection.
*/
public int saveAll(Collection<T> bean) {
return db().saveAll(bean);
public int saveAll(Collection<T> beans) {
return db().saveAll(beans);
}
/**
+5 -12
View File
@@ -5,7 +5,6 @@ import io.avaje.lang.Nullable;
import io.ebean.annotation.TxIsolation;
import io.ebean.cache.ServerCacheManager;
import io.ebean.plugin.Property;
import io.ebean.text.csv.CsvReader;
import io.ebean.text.json.JsonContext;
import javax.persistence.OptimisticLockException;
@@ -238,7 +237,7 @@ public final class DB {
}
/**
* The batch will be flushing automatically but you can use this to explicitly
* The batch will be flushing automatically but, you can use this to explicitly
* flush the batch if you like.
* <p>
* Flushing occurs automatically when:
@@ -785,12 +784,6 @@ public final class DB {
return getDefault().createUpdate(beanType, ormUpdate);
}
/**
* Create a CsvReader for a given beanType.
*/
public static <T> CsvReader<T> createCsvReader(Class<T> beanType) {
return getDefault().createCsvReader(beanType);
}
/**
* Create a named query.
@@ -961,7 +954,7 @@ public final class DB {
*
* DB.execute(scope, new TxRunnable() {
* public void run() {
* User u1 = DB.find(User.class, 1);
* User u1 = DB.find(User.class, 1);
* ...
* }
* });
@@ -1010,9 +1003,9 @@ public final class DB {
*
* DB.executeCall(scope, new Callable<String>() {
* public String call() {
* User u1 = DB.find(User.class, 1);
* ...
* return u1.getEmail();
* User u1 = DB.find(User.class, 1);
* ...
* return u1.getEmail();
* }
* });
* }</pre>
+115 -219
View File
@@ -9,7 +9,6 @@ import io.ebean.config.DatabaseConfig;
import io.ebean.meta.MetaInfoManager;
import io.ebean.plugin.Property;
import io.ebean.plugin.SpiServer;
import io.ebean.text.csv.CsvReader;
import io.ebean.text.json.JsonContext;
import javax.persistence.OptimisticLockException;
@@ -30,29 +29,24 @@ import java.util.concurrent.Callable;
* singleton (see {@link DatabaseConfig#setRegister(boolean)}). The DB
* singleton is essentially a map of Database's that have been registered
* with it.
* </p>
* <p>
* The Database can then be retrieved later via {@link DB#byName(String)}.
* </p>
*
* <h5>The 'default' Database</h5>
* <p>
* One Database can be designated as the 'default' or 'primary' Database
* (see {@link DatabaseConfig#setDefaultServer(boolean)}. Many methods on DB
* (see {@link DatabaseConfig#setDefaultServer(boolean)}). Many methods on DB
* such as {@link DB#find(Class)} etc are actually just a convenient way to
* call methods on the 'default/primary' Database.
* </p>
*
* <h5>Constructing a Database</h5>
* <p>
* Database's are constructed by the DatabaseFactory. They can be created
* Databases are constructed by the DatabaseFactory. They can be created
* programmatically via {@link DatabaseFactory#create(DatabaseConfig)} or they
* can be automatically constructed on demand using configuration information in
* the application.properties file.
* </p>
*
* <h5>Example: Get a Database</h5>
* <p>
* <pre>{@code
*
* // Get access to the Human Resources Database
@@ -71,22 +65,19 @@ import java.util.concurrent.Callable;
*
* <h5>Database vs DB API</h5>
* <p>
* Database provides additional API compared with DB. For example it
* Database provides additional API compared with DB. For example, it
* provides more control over the use of Transactions that is not available in
* the DB API.
* </p>
*
* <p>
* <em>External Transactions:</em> If you wanted to use transactions created
* externally to Ebean then Database provides additional methods where you
* can explicitly pass a transaction (that can be created externally).
* </p>
*
* <p>
* <em>Bypass ThreadLocal Mechanism:</em> If you want to bypass the built in
* <em>Bypass ThreadLocal Mechanism:</em> If you want to bypass the built-in
* ThreadLocal transaction management you can use the createTransaction()
* method. Example: a single thread requires more than one transaction.
* </p>
*
* @see DB
* @see DatabaseFactory
@@ -104,12 +95,10 @@ public interface Database {
* Shutdown the Database instance programmatically.
* <p>
* This method is not normally required. Ebean registers a shutdown hook and shuts down cleanly.
* </p>
* <p>
* If the under underlying DataSource is the Ebean implementation then you
* also have the option of shutting down the DataSource and deregistering the
* also have the option of shutting down the DataSource and de-registering the
* JDBC driver.
* </p>
*
* @param shutdownDataSource if true then shutdown the underlying DataSource if it is the Ebean
* DataSource implementation.
@@ -155,10 +144,10 @@ public interface Database {
* <p>
* Note many platforms have multiple specific platform types so often we want to
* get the base platform via {@link Platform#base()}.
* </p>
*
* <pre>{@code
*
* Platform platform = database.getPlatform().base();
* Platform platform = database.platform().base();
* if (platform == Platform.MYSQL) {
* // do MySql specific function
* }
@@ -177,8 +166,7 @@ public interface Database {
/**
* Return the BeanState for a given entity bean.
* <p>
* This will return null if the bean is not an enhanced entity bean.
* </p>
* This will throw an IllegalArgumentException if the bean is not an enhanced entity bean.
*/
BeanState beanState(Object bean);
@@ -192,7 +180,6 @@ public interface Database {
* <p>
* For example, if the id value passed in is a String but ought to be a Long or UUID etc
* then it will automatically be converted.
* </p>
*
* @param bean The entity bean to set the id value on.
* @param id The id value to set.
@@ -204,7 +191,6 @@ public interface Database {
* <p>
* When null is passed in for b, then the 'OldValues' of a is used for the
* difference comparison.
* </p>
*/
Map<String, ValuePair> diff(Object newBean, Object oldBean);
@@ -214,14 +200,9 @@ public interface Database {
* Useful if you use BeanPostConstructListeners or &#64;PostConstruct Annotations.
* In this case you should not use "new Bean...()". Making all bean constructors protected
* could be a good idea here.
* </p>
*/
<T> T createEntityBean(Class<T> type);
/**
* Create a CsvReader for a given beanType.
*/
<T> CsvReader<T> createCsvReader(Class<T> beanType);
/**
* Create an Update query to perform a bulk update.
@@ -248,7 +229,6 @@ public interface Database {
* 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
@@ -304,17 +284,14 @@ public interface Database {
* <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()}
* {@link Query#findSet()} etc will execute against the same Database from
* which is was created.
* </p>
* <p>
*
* <pre>{@code
*
* // Find order 2 specifying explicitly the parts of the object graph to
@@ -344,7 +321,7 @@ public interface Database {
* 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";
@@ -367,12 +344,10 @@ public interface Database {
* <p>
* This will only work when a IdGenerator is on the bean such as for beans
* that use 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>
*/
Object nextId(Class<?> beanType);
@@ -381,10 +356,8 @@ public interface Database {
* 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>
*/
<T> Filter<T> filter(Class<T> beanType);
@@ -401,12 +374,10 @@ public interface Database {
* <p>
* If you leave off any keywords the defaults are ascending order and treating
* nulls as high values.
* </p>
* <p>
* Note that the sorting uses a Comparator and Collections.sort(); and does
* not invoke a DB query.
* </p>
* <p>
*
* <pre>{@code
*
* // find orders and their customers
@@ -431,17 +402,15 @@ public interface Database {
<T> void sort(List<T> list, String sortByClause);
/**
* Create a orm update where you will supply the insert/update or delete
* Create an orm update where you will supply the insert/update or delete
* statement (rather than using a named one that is already defined using the
* &#064;NamedUpdates annotation).
* <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>
* <p>
*
* <pre>{@code
*
* // The bean name and properties - "topic","postCount" and "id"
@@ -466,7 +435,6 @@ public interface Database {
* <p>
* DTO beans are just normal bean like classes with public constructor(s) and setters.
* They do not need to be registered with DB before use.
* </p>
*
* @param dtoType The type of the DTO bean the rows will be mapped into.
* @param sql The SQL query to execute.
@@ -479,7 +447,6 @@ public interface Database {
* <p>
* DTO beans are just normal bean like classes with public constructor(s) and setters.
* They do not need to be registered with DB before use.
* </p>
*
* @param dtoType The type of the DTO bean the rows will be mapped into.
* @param namedQuery The name of the query
@@ -493,10 +460,8 @@ public interface Database {
*
* <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>
*/
SqlQuery sqlQuery(String sql);
@@ -505,11 +470,9 @@ public interface Database {
* <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
*/
@@ -522,7 +485,7 @@ public interface Database {
/**
* 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.
@@ -536,7 +499,6 @@ public interface Database {
* 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>
*/
Transaction createTransaction();
@@ -544,7 +506,6 @@ public interface Database {
* Create a new transaction additionally specifying the isolation level.
* <p>
* Note that this transaction is NOT stored in a thread local.
* </p>
*/
Transaction createTransaction(TxIsolation isolation);
@@ -552,86 +513,77 @@ public interface Database {
* 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>
* <p>
* Example of using a transaction to span multiple calls to find(), save() etc.
*
* <h3>Using try with resources</h3>
* <pre>{@code
*
* // start a transaction (stored in a ThreadLocal)
* // start a transaction (stored in a ThreadLocal)
* try (Transaction txn = database.beginTransaction()) {
*
* try (Transaction txn = database.beginTransaction()) {
* Order order = database.find(Order.class, 10);
* ...
* database.save(order);
*
* Order order = database.find(Order.class, 10);
* ...
* database.save(order);
*
* txn.commit();
* }
* txn.commit();
* }
*
* }</pre>
* <p>
*
* <h3>Using try finally block</h3>
* <pre>{@code
*
* // start a transaction (stored in a ThreadLocal)
* Transaction txn = database.beginTransaction();
* try {
* Order order = database.find(Order.class,10);
* // start a transaction (stored in a ThreadLocal)
* Transaction txn = database.beginTransaction();
* try {
* Order order = database.find(Order.class,10);
*
* database.save(order);
*
* txn.commit();
*
* } finally {
* txn.end();
* }
* database.save(order);
* txn.commit();
*
* } finally {
* txn.end();
* }
* }</pre>
* <p>
*
* <h3>Transaction options</h3>
* <pre>{@code
*
* try (Transaction txn = database.beginTransaction()) {
* try (Transaction txn = database.beginTransaction()) {
*
* // explicitly turn on/off JDBC batch use
* txn.setBatchMode(true);
* txn.setBatchSize(50);
* // explicitly turn on/off JDBC batch use
* txn.setBatchMode(true);
* txn.setBatchSize(50);
*
* // control flushing when mixing save and queries
* txn.setBatchFlushOnQuery(false);
* // control flushing when mixing save and queries
* txn.setBatchFlushOnQuery(false);
*
* // turn off persist cascade if needed
* txn.setPersistCascade(false);
* // turn off persist cascade if needed
* txn.setPersistCascade(false);
*
* // for large batch insert processing when we do not
* // ... need the generatedKeys, don't get them
* txn.setBatchGetGeneratedKeys(false);
* // for large batch insert processing when we do not
* // ... need the generatedKeys, don't get them
* txn.setBatchGetGeneratedKeys(false);
*
* // explicitly flush the JDBC batch buffer
* txn.flush();
* // explicitly flush the JDBC batch buffer
* txn.flush();
*
* ...
* ...
*
* txn.commit();
* }
* txn.commit();
* }
*
* }</pre>
* <p>
* <p>
* If you want to externalise the transaction management then you use
* createTransaction() and pass the transaction around to the various methods on
* Database yourself.
* </p>
*/
Transaction beginTransaction();
@@ -643,11 +595,9 @@ public interface Database {
/**
* Start a transaction typically specifying REQUIRES_NEW or REQUIRED semantics.
* <p>
* <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
* // Start a new transaction. If there is a current transaction
@@ -694,10 +644,8 @@ public interface Database {
* This only is useful when JDBC batch is used. Flush occurs automatically when the
* transaction commits or batch size is reached. This manually flushes the JDBC batch
* buffer.
* </p>
* <p>
* This is the same as <code>currentTransaction().flush()</code>.
* </p>
*/
void flush();
@@ -717,7 +665,6 @@ public interface Database {
* <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>
@@ -744,7 +691,6 @@ public interface Database {
* <p>
* Note that this resets OneToMany and ManyToMany properties so that if they
* are accessed a lazy load will refresh the many property.
* </p>
*/
void refresh(Object bean);
@@ -763,12 +709,11 @@ public interface Database {
* // Fetch order 1
* Order order = database.find(Order.class, 1);
* }</pre>
* <p>
*
* <p>
* If you want more control over the query then you can use createQuery() and
* Query.findOne();
* </p>
* <p>
*
* <pre>{@code
* // ... additionally fetching customer, customer shipping address,
* // order details, and the product associated with each order detail.
@@ -810,10 +755,9 @@ public interface Database {
* <p>
* This will not perform a query against the database unless some property other
* that the id property is accessed.
* </p>
* <p>
* It is most commonly used to set a 'foreign key' on another bean like:
* </p>
*
* <pre>{@code
*
* Product product = database.getReference(Product.class, 1);
@@ -853,12 +797,10 @@ public interface Database {
* <p>
* The extended API has the options for executing queries that take an explicit
* transaction as an argument.
* </p>
* <p>
* Typically we only need to use the extended API when we do NOT want to use the
* Typically, we only need to use the extended API when we do NOT want to use the
* usual ThreadLocal based mechanism to obtain the current transaction but instead
* supply the transaction explicitly.
* </p>
*/
ExtendedServer extended();
@@ -867,32 +809,27 @@ public interface Database {
* <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>
* In this example below the details property has a CascadeType.ALL set so
* saving an order will also save all its details.
* </p>
* <p>
*
* <pre>{@code
* public class Order { ...
*
* @OneToMany(cascade=CascadeType.ALL, mappedBy="order")
* List<OrderDetail> details;
* ...
* List<OrderDetail> details;
* ...
* }
* }</pre>
* <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>
*/
void save(Object bean) throws OptimisticLockException;
@@ -910,16 +847,13 @@ public interface Database {
* 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 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>
*/
boolean delete(Object bean) throws OptimisticLockException;
@@ -927,12 +861,10 @@ public interface Database {
* Delete the bean with an explicit transaction.
* <p>
* This will return true if the bean was deleted successfully or JDBC batch is being used.
* </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. However, if JDBC batch mode is used then this always returns true.
* </p>
*/
boolean delete(Object bean, Transaction transaction) throws OptimisticLockException;
@@ -1014,16 +946,13 @@ public interface Database {
* <p>
* If you wish to execute a Sql Select natively then you should use the
* SqlQuery object or DtoQuery.
* </p>
* <p>
* Note that the table modification information is automatically deduced and
* you do not need to call the DB.externalModification() method when you
* use this method.
* </p>
* <p>
* Example:
* </p>
* <p>
*
* <pre>{@code
*
* // example that uses 'named' parameters
@@ -1051,7 +980,6 @@ public interface Database {
* transaction.
* <p>
* This returns the number of rows that where inserted, updated or deleted.
* </p>
*/
int execute(Update<?> update);
@@ -1065,8 +993,7 @@ public interface Database {
* For making calls to stored procedures.
* <p>
* Example:
* </p>
* <p>
*
* <pre>{@code
*
* String sql = "{call sp_order_modify(?,?,?)}";
@@ -1091,23 +1018,19 @@ public interface Database {
* <p>
* If you use database.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 inserted true if rows where inserted into the table
@@ -1147,7 +1070,6 @@ public interface Database {
* Note: This checks only the root bean!
* <p>
* <pre>{@code
*
* // there is a unique constraint on title
*
* Document doc = new Document();
@@ -1176,7 +1098,7 @@ public interface Database {
* // uniqueProperties > [title]
* // custom msg > property[title] value[One flew over the cuckoo's nest]
*
* }
* }
*
* }</pre>
*
@@ -1200,13 +1122,12 @@ public interface Database {
* dirty so that it is not skipped.
* <p>
* <pre>{@code
* Customer customer = database.find(Customer, id);
*
* Customer customer = database.find(Customer, id);
*
* // mark the bean as dirty so that a save() or update() will
* // increment the version property
* database.markAsDirty(customer);
* database.save(customer);
* // mark the bean as dirty so that a save() or update() will
* // increment the version property
* database.markAsDirty(customer);
* database.save(customer);
*
* }</pre>
*/
@@ -1219,18 +1140,17 @@ public interface Database {
* <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>
*
* <pre>{@code
*
* // A 'stateless update' example
* Customer customer = new Customer();
* customer.setId(7);
* customer.setName("ModifiedNameNoOCC");
* database.update(customer);
* // A 'stateless update' example
* Customer customer = new Customer();
* customer.setId(7);
* customer.setName("ModifiedNameNoOCC");
* database.update(customer);
*
* }</pre>
*/
@@ -1281,7 +1201,6 @@ public interface Database {
* Compared to save() this forces bean to perform an insert rather than trying to decide
* based on the bean state. As such this is useful when you fetch beans from one database
* and want to insert them into another database (and you want to explicitly insert them).
* </p>
*/
void insert(Object bean);
@@ -1314,21 +1233,18 @@ public interface Database {
/**
* Execute a Runnable in a Transaction with an explicit scope.
* <p>
* The scope can control the transaction type, isolation and rollback
* semantics.
* </p>
* <p>
* The scope can control the transaction type, isolation and rollback semantics.
*
* <pre>{@code
* // set specific transactional scope settings
* TxScope scope = TxScope.requiresNew().setIsolation(TxIsolation.SERIALIZABLE);
*
* // set specific transactional scope settings
* TxScope scope = TxScope.requiresNew().setIsolation(TxIsolation.SERIALIZABLE);
*
* database.execute(scope, new Runnable() {
* public void run() {
* User u1 = database.find(User.class, 1);
* ...
* }
* });
* database.execute(scope, new Runnable() {
* public void run() {
* User u1 = database.find(User.class, 1);
* ...
* }
* });
*
* }</pre>
*/
@@ -1339,21 +1255,19 @@ public interface Database {
* <p>
* The default scope runs with REQUIRED and by default will rollback on any
* exception (checked or runtime).
* </p>
* <p>
*
* <pre>{@code
* database.execute(() -> {
*
* database.execute(() -> {
* User u1 = database.find(User.class, 1);
* User u2 = database.find(User.class, 2);
*
* User u1 = database.find(User.class, 1);
* User u2 = database.find(User.class, 2);
* u1.setName("u1 mod");
* u2.setName("u2 mod");
*
* u1.setName("u1 mod");
* u2.setName("u2 mod");
*
* u1.save();
* u2.save();
* });
* u1.save();
* u2.save();
* });
*
* }</pre>
*/
@@ -1364,18 +1278,16 @@ public interface Database {
* <p>
* The scope can control the transaction type, isolation and rollback
* semantics.
* </p>
* <p>
* <pre>{@code
*
* <pre>{@code
* // set specific transactional scope settings
* TxScope scope = TxScope.requiresNew().setIsolation(TxIsolation.SERIALIZABLE);
*
* database.executeCall(scope, new Callable<String>() {
* public String call() {
* User u1 = database.find(User.class, 1);
* ...
* return u1.getEmail();
* public String call() {
* User u1 = database.find(User.class, 1);
* ...
* return u1.getEmail();
* }
* });
*
@@ -1388,10 +1300,8 @@ public interface Database {
* <p>
* The default scope runs with REQUIRED and by default will rollback on any
* exception (checked or runtime).
* </p>
* <p>
* <pre>{@code
*
* <pre>{@code
* database.executeCall(new Callable<String>() {
* public String call() {
* User u1 = database.find(User.class, 1);
@@ -1406,7 +1316,6 @@ public interface Database {
* return u1.getEmail();
* }
* });
*
* }</pre>
*/
<T> T executeCall(Callable<T> callable);
@@ -1417,8 +1326,7 @@ public interface Database {
ServerCacheManager cacheManager();
/**
* Return the BackgroundExecutor service for asynchronous processing of
* queries.
* Return the BackgroundExecutor service for asynchronous processing of queries.
*/
BackgroundExecutor backgroundExecutor();
@@ -1427,33 +1335,30 @@ public interface Database {
* <p>
* This instance is safe to be used concurrently by multiple threads and this
* method is cheap to call.
* </p>
* <p>
*
* <h3>Simple example:</h3>
* <pre>{@code
*
* JsonContext json = database.json();
* String jsonOutput = json.toJson(list);
* System.out.println(jsonOutput);
*
* JsonContext json = database.json();
* String jsonOutput = json.toJson(list);
* System.out.println(jsonOutput);
* }</pre>
*
* <p>
* <h3>Using PathProperties:</h3>
* <pre>{@code
* // specify just the properties we want
* PathProperties paths = PathProperties.parse("name, status, anniversary");
*
* // specify just the properties we want
* PathProperties paths = PathProperties.parse("name, status, anniversary");
* List<Customer> customers =
* database.find(Customer.class)
* // apply those paths to the query (only fetch what we need)
* .apply(paths)
* .where().ilike("name", "rob%")
* .findList();
*
* List<Customer> customers =
* database.find(Customer.class)
* // apply those paths to the query (only fetch what we need)
* .apply(paths)
* .where().ilike("name", "rob%")
* .findList();
*
* // ... get the json
* JsonContext jsonContext = database.json();
* String json = jsonContext.toJson(customers, paths);
* // ... get the json
* JsonContext jsonContext = database.json();
* String json = jsonContext.toJson(customers, paths);
*
* }</pre>
*
@@ -1478,7 +1383,6 @@ public interface Database {
* Publish a single bean given its type and id returning the resulting live bean.
* <p>
* The values are published from the draft to the live bean.
* </p>
*
* @param <T> the type of the entity bean
* @param beanType the type of the entity bean
@@ -1493,7 +1397,6 @@ public interface Database {
* This will use the current transaction or create one if required.
* <p>
* The values are published from the draft to the live bean.
* </p>
*
* @param <T> the type of the entity bean
* @param beanType the type of the entity bean
@@ -1506,7 +1409,6 @@ public interface Database {
* Publish the beans that match the query returning the resulting published beans.
* <p>
* The values are published from the draft beans to the live beans.
* </p>
*
* @param <T> the type of the entity bean
* @param query the query used to select the draft beans to publish
@@ -1519,7 +1421,6 @@ public interface Database {
* This will use the current transaction or create one if required.
* <p>
* The values are published from the draft beans to the live beans.
* </p>
*
* @param <T> the type of the entity bean
* @param query the query used to select the draft beans to publish
@@ -1531,7 +1432,6 @@ public interface Database {
* <p>
* The values from the live beans are set back to the draft bean and the
* <code>@DraftDirty</code> and <code>@DraftReset</code> properties are reset.
* </p>
*
* @param <T> the type of the entity bean
* @param beanType the type of the entity bean
@@ -1546,7 +1446,6 @@ public interface Database {
* <p>
* The values from the live beans are set back to the draft bean and the
* <code>@DraftDirty</code> and <code>@DraftReset</code> properties are reset.
* </p>
*
* @param <T> the type of the entity bean
* @param beanType the type of the entity bean
@@ -1560,7 +1459,6 @@ public interface Database {
* <p>
* The values from the live beans are set back to the draft bean and the
* <code>@DraftDirty</code> and <code>@DraftReset</code> properties are reset.
* </p>
*
* @param <T> the type of the entity bean
* @param query the query used to select the draft beans to restore
@@ -1573,7 +1471,6 @@ public interface Database {
* <p>
* The values from the live beans are set back to the draft bean and the
* <code>@DraftDirty</code> and <code>@DraftReset</code> properties are reset.
* </p>
*
* @param <T> the type of the entity bean
* @param query the query used to select the draft beans to restore
@@ -1585,7 +1482,6 @@ public interface Database {
* <p>
* Validate the query checking the where and orderBy expression paths to confirm if
* they represent valid properties/path for the given bean type.
* </p>
*/
<T> Set<String> validateQuery(Query<T> query);
@@ -1611,6 +1507,6 @@ public interface Database {
/**
* Truncate the base tables for the given bean types.
*/
void truncate(Class<?>... tables);
void truncate(Class<?>... beanTypes);
}
@@ -2,20 +2,20 @@ package io.ebean;
import io.ebean.config.BeanNotEnhancedException;
import io.ebean.datasource.DataSourceConfigurationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.PersistenceException;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.System.Logger.Level.ERROR;
/**
* Holds Database instances.
*/
final class DbContext {
private static final Logger log = LoggerFactory.getLogger("io.ebean");
private static final System.Logger log = EbeanVersion.log;
static {
EbeanVersion.getVersion();
}
@@ -23,14 +23,9 @@ final class DbContext {
private static final DbContext INSTANCE = new DbContext();
private final ConcurrentHashMap<String, Database> concMap = new ConcurrentHashMap<>();
private final HashMap<String, Database> syncMap = new HashMap<>();
private final ReentrantLock lock = new ReentrantLock();
/**
* The 'default' Database.
*/
private Database defaultDatabase;
private DbContext() {
@@ -52,7 +47,7 @@ final class DbContext {
throw new DataSourceConfigurationException(msg, e);
} catch (Throwable e) {
log.error("Error trying to create the default Database", e);
log.log(ERROR, "Error trying to create the default Database", e);
throw new RuntimeException(e);
}
}
@@ -69,9 +64,9 @@ final class DbContext {
*/
Database getDefault() {
if (defaultDatabase == null) {
String msg = "The default Database has not been defined?";
msg += " This is normally set via the ebean.datasource.default property.";
msg += " Otherwise it should be registered programmatically via registerServer()";
String msg = "The default Database has not been defined?"
+ " This is normally set via the ebean.datasource.default property."
+ " Otherwise it should be registered programmatically via registerServer()";
throw new PersistenceException(msg);
}
return defaultDatabase;
@@ -76,9 +76,9 @@ final class DbPrimary {
defaultServerName = System.getProperty("db", defaultServerName);
defaultServerName = System.getProperty("ebean_db", defaultServerName);
if (isEmpty(defaultServerName)) {
defaultServerName = Config.get("datasource.default", null);
defaultServerName = Config.getOptional("datasource.default").orElse(null);
if (isEmpty(defaultServerName)) {
defaultServerName = Config.get("ebean.default.datasource", null);
defaultServerName = Config.getOptional("ebean.default.datasource").orElse(null);
}
}
if (defaultServerName == null) {
@@ -129,6 +129,11 @@ public interface DtoQuery<T> extends CancelableQuery {
*/
DtoQuery<T> setParameter(String name, Object value);
/**
* Bind the named parameter to SQL NULL.
*/
DtoQuery<T> setNullParameter(String name, int jdbcType);
/**
* Bind the named multi-value array parameter which we would use with Postgres ANY.
* <p>
@@ -141,6 +146,11 @@ public interface DtoQuery<T> extends CancelableQuery {
*/
DtoQuery<T> setParameter(int position, Object value);
/**
* Set a positioned parameter to SQL NULL.
*/
DtoQuery<T> setNullParameter(int position, int jdbcType);
/**
* Set the index of the first row of the results to return.
*/
@@ -2,6 +2,28 @@ package io.ebean;
/**
* Thrown when a duplicate is attempted on a unique constraint.
* <p>
* In terms of catching this exception with the view of continuing processing
* using the same transaction look to use {@link Transaction#rollbackAndContinue()}.
*
* <pre>{@code
*
* try (Transaction txn = database.beginTransaction()) {
*
* try {
* ...
* database.save(bean);
* database.flush();
* } catch (DuplicateKeyException e) {
* // carry on processing using the transaction
* txn.rollbackAndContinue();
* ...
* }
*
* txn.commit();
* }
*
* }</pre>
*/
public class DuplicateKeyException extends DataIntegrityException {
private static final long serialVersionUID = -4771932723285724817L;
@@ -1,12 +1,15 @@
package io.ebean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.avaje.applog.AppLog;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.Properties;
import static java.lang.System.Logger.Level.*;
/**
* Class to determine the ebean version.
*
@@ -14,7 +17,7 @@ import java.util.Properties;
*/
public final class EbeanVersion {
private static final Logger log = LoggerFactory.getLogger("io.ebean");
public static final System.Logger log = AppLog.getLogger("io.ebean");
/**
* Maintain the minimum ebean-agent version manually based on required ebean-agent bug fixes.
@@ -22,6 +25,7 @@ public final class EbeanVersion {
private static final int MIN_AGENT_MAJOR_VERSION = 12;
private static final int MIN_AGENT_MINOR_VERSION = 12;
private static String version = "unknown";
static {
readVersion();
checkAgentVersion();
@@ -29,14 +33,16 @@ public final class EbeanVersion {
private static void readVersion() {
try {
try (InputStream in = ClassLoader.getSystemResourceAsStream("META-INF/maven/io.ebean/ebean-api/pom.properties")) {
try (InputStream in = ClassLoader.getSystemResourceAsStream("META-INF/ebean-maven-version.txt")) {
if (in != null) {
version = readVersion(in);
try (LineNumberReader reader = new LineNumberReader(new InputStreamReader(in))) {
version = reader.readLine();
log.log(INFO, "ebean version: {0}", version);
}
}
}
log.info("ebean version: {}", version);
} catch (IOException e) {
log.warn("Could not determine ebean version: {}", e.getMessage());
log.log(WARNING, "Could not determine ebean version: {0}", e.getMessage());
}
}
@@ -48,13 +54,13 @@ public final class EbeanVersion {
String agentVersion = readVersion(in);
if (agentVersion != null) {
if (checkMinAgentVersion(agentVersion)) {
log.error("Expected minimum ebean-agent version {}.{}.0 but we have {}, please update the ebean-agent", MIN_AGENT_MAJOR_VERSION, MIN_AGENT_MINOR_VERSION, agentVersion);
log.log(ERROR, "Expected minimum ebean-agent version {0}.{1}.0 but we have {2}, please update the ebean-agent", MIN_AGENT_MAJOR_VERSION, MIN_AGENT_MINOR_VERSION, agentVersion);
}
}
}
}
} catch (IOException e) {
log.warn("Could not check minimum ebean-agent version {}.{}.0 required due to - {}", MIN_AGENT_MAJOR_VERSION, MIN_AGENT_MINOR_VERSION, e.getMessage());
log.log(WARNING, "Could not check minimum ebean-agent version {0}.{1}.0 required due to - {2}", MIN_AGENT_MAJOR_VERSION, MIN_AGENT_MINOR_VERSION, e.getMessage());
}
}
@@ -88,7 +94,7 @@ public final class EbeanVersion {
}
/**
* Returns the ebean version (read from /META-INF/maven/io.ebean/ebean/pom.properties)
* Returns the ebean version (read from META-INF/ebean-maven-version.txt)
*/
public static String getVersion() {
return version;
+46 -39
View File
@@ -30,18 +30,25 @@ public final class Expr {
private Expr() {
}
/**
* Return the underlying expression factory.
*/
public static ExpressionFactory factory() {
return DB.expressionFactory();
}
/**
* Equal To - property equal to the given value.
*/
public static Expression eq(String propertyName, Object value) {
return DB.expressionFactory().eq(propertyName, value);
return factory().eq(propertyName, value);
}
/**
* Not Equal To - property not equal to the given value.
*/
public static Expression ne(String propertyName, Object value) {
return DB.expressionFactory().ne(propertyName, value);
return factory().ne(propertyName, value);
}
/**
@@ -49,7 +56,7 @@ public final class Expr {
* using a lower() function to make it case insensitive).
*/
public static Expression ieq(String propertyName, String value) {
return DB.expressionFactory().ieq(propertyName, value);
return factory().ieq(propertyName, value);
}
/**
@@ -59,28 +66,28 @@ public final class Expr {
* </p>
*/
public static Expression inRange(String propertyName, Object value1, Object value2) {
return DB.expressionFactory().inRange(propertyName, value1, value2);
return factory().inRange(propertyName, value1, value2);
}
/**
* Between - property between the two given values.
*/
public static Expression between(String propertyName, Object value1, Object value2) {
return DB.expressionFactory().between(propertyName, value1, value2);
return factory().between(propertyName, value1, value2);
}
/**
* Between - value between two given properties.
*/
public static Expression between(String lowProperty, String highProperty, Object value) {
return DB.expressionFactory().betweenProperties(lowProperty, highProperty, value);
return factory().betweenProperties(lowProperty, highProperty, value);
}
/**
* Greater Than - property greater than the given value.
*/
public static Expression gt(String propertyName, Object value) {
return DB.expressionFactory().gt(propertyName, value);
return factory().gt(propertyName, value);
}
/**
@@ -88,42 +95,42 @@ public final class Expr {
* value.
*/
public static Expression ge(String propertyName, Object value) {
return DB.expressionFactory().ge(propertyName, value);
return factory().ge(propertyName, value);
}
/**
* Less Than - property less than the given value.
*/
public static Expression lt(String propertyName, Object value) {
return DB.expressionFactory().lt(propertyName, value);
return factory().lt(propertyName, value);
}
/**
* Less Than or Equal to - property less than or equal to the given value.
*/
public static Expression le(String propertyName, Object value) {
return DB.expressionFactory().le(propertyName, value);
return factory().le(propertyName, value);
}
/**
* Is Null - property is null.
*/
public static Expression isNull(String propertyName) {
return DB.expressionFactory().isNull(propertyName);
return factory().isNull(propertyName);
}
/**
* Is Not Null - property is not null.
*/
public static Expression isNotNull(String propertyName) {
return DB.expressionFactory().isNotNull(propertyName);
return factory().isNotNull(propertyName);
}
/**
* Case insensitive {@link #exampleLike(Object)}
*/
public static ExampleExpression iexampleLike(Object example) {
return DB.expressionFactory().iexampleLike(example);
return factory().iexampleLike(example);
}
/**
@@ -131,14 +138,14 @@ public final class Expr {
* LikeType.RAW (you need to add you own wildcards % and _).
*/
public static ExampleExpression exampleLike(Object example) {
return DB.expressionFactory().exampleLike(example);
return factory().exampleLike(example);
}
/**
* Create the query by Example expression specifying more options.
*/
public static ExampleExpression exampleLike(Object example, boolean caseInsensitive, LikeType likeType) {
return DB.expressionFactory().exampleLike(example, caseInsensitive, likeType);
return factory().exampleLike(example, caseInsensitive, likeType);
}
/**
@@ -146,7 +153,7 @@ public final class Expr {
* characters % (percentage) and _ (underscore).
*/
public static Expression like(String propertyName, String value) {
return DB.expressionFactory().like(propertyName, value);
return factory().like(propertyName, value);
}
/**
@@ -155,14 +162,14 @@ public final class Expr {
* a lower() function to make the expression case insensitive.
*/
public static Expression ilike(String propertyName, String value) {
return DB.expressionFactory().ilike(propertyName, value);
return factory().ilike(propertyName, value);
}
/**
* Starts With - property like value%.
*/
public static Expression startsWith(String propertyName, String value) {
return DB.expressionFactory().startsWith(propertyName, value);
return factory().startsWith(propertyName, value);
}
/**
@@ -170,14 +177,14 @@ public final class Expr {
* lower() function to make the expression case insensitive.
*/
public static Expression istartsWith(String propertyName, String value) {
return DB.expressionFactory().istartsWith(propertyName, value);
return factory().istartsWith(propertyName, value);
}
/**
* Ends With - property like %value.
*/
public static Expression endsWith(String propertyName, String value) {
return DB.expressionFactory().endsWith(propertyName, value);
return factory().endsWith(propertyName, value);
}
/**
@@ -185,14 +192,14 @@ public final class Expr {
* function to make the expression case insensitive.
*/
public static Expression iendsWith(String propertyName, String value) {
return DB.expressionFactory().iendsWith(propertyName, value);
return factory().iendsWith(propertyName, value);
}
/**
* Contains - property like %value%.
*/
public static Expression contains(String propertyName, String value) {
return DB.expressionFactory().contains(propertyName, value);
return factory().contains(propertyName, value);
}
/**
@@ -200,42 +207,42 @@ public final class Expr {
* function to make the expression case insensitive.
*/
public static Expression icontains(String propertyName, String value) {
return DB.expressionFactory().icontains(propertyName, value);
return factory().icontains(propertyName, value);
}
/**
* For collection properties that are empty (have not existing elements).
*/
public static Expression isEmpty(String propertyName) {
return DB.expressionFactory().isEmpty(propertyName);
return factory().isEmpty(propertyName);
}
/**
* For collection properties that are not empty (have existing elements).
*/
public static Expression isNotEmpty(String propertyName) {
return DB.expressionFactory().isNotEmpty(propertyName);
return factory().isNotEmpty(propertyName);
}
/**
* In - property has a value in the array of values.
*/
public static Expression in(String propertyName, Object[] values) {
return DB.expressionFactory().in(propertyName, values);
return factory().in(propertyName, values);
}
/**
* In - using a subQuery.
*/
public static Expression in(String propertyName, Query<?> subQuery) {
return DB.expressionFactory().in(propertyName, subQuery);
return factory().in(propertyName, subQuery);
}
/**
* In - property has a value in the collection of values.
*/
public static Expression in(String propertyName, Collection<?> values) {
return DB.expressionFactory().in(propertyName, values);
return factory().in(propertyName, values);
}
/**
@@ -272,14 +279,14 @@ public final class Expr {
* }</pre>
*/
public static Expression inOrEmpty(String propertyName, Collection<?> values) {
return DB.expressionFactory().inOrEmpty(propertyName, values);
return factory().inOrEmpty(propertyName, values);
}
/**
* Id Equal to - ID property is equal to the value.
*/
public static Expression idEq(Object value) {
return DB.expressionFactory().idEq(value);
return factory().idEq(value);
}
/**
@@ -292,7 +299,7 @@ public final class Expr {
* @param propertyMap a map keyed by property names.
*/
public static Expression allEq(Map<String, Object> propertyMap) {
return DB.expressionFactory().allEq(propertyMap);
return factory().allEq(propertyMap);
}
/**
@@ -303,7 +310,7 @@ public final class Expr {
* </p>
*/
public static Expression raw(String raw, Object value) {
return DB.expressionFactory().raw(raw, value);
return factory().raw(raw, value);
}
/**
@@ -314,48 +321,48 @@ public final class Expr {
* </p>
*/
public static Expression raw(String raw, Object[] values) {
return DB.expressionFactory().raw(raw, values);
return factory().raw(raw, values);
}
/**
* Add raw expression with no parameters.
*/
public static Expression raw(String raw) {
return DB.expressionFactory().raw(raw);
return factory().raw(raw);
}
/**
* And - join two expressions with a logical and.
*/
public static Expression and(Expression expOne, Expression expTwo) {
return DB.expressionFactory().and(expOne, expTwo);
return factory().and(expOne, expTwo);
}
/**
* Or - join two expressions with a logical or.
*/
public static Expression or(Expression expOne, Expression expTwo) {
return DB.expressionFactory().or(expOne, expTwo);
return factory().or(expOne, expTwo);
}
/**
* Negate the expression (prefix it with NOT).
*/
public static Expression not(Expression exp) {
return DB.expressionFactory().not(exp);
return factory().not(exp);
}
/**
* Return a list of expressions that will be joined by AND's.
*/
public static <T> Junction<T> conjunction(Query<T> query) {
return DB.expressionFactory().conjunction(query);
return factory().conjunction(query);
}
/**
* Return a list of expressions that will be joined by OR's.
*/
public static <T> Junction<T> disjunction(Query<T> query) {
return DB.expressionFactory().disjunction(query);
return factory().disjunction(query);
}
}
@@ -1,10 +1,6 @@
package io.ebean;
import io.ebean.search.Match;
import io.ebean.search.MultiMatch;
import io.ebean.search.TextCommonTerms;
import io.ebean.search.TextQueryString;
import io.ebean.search.TextSimple;
import io.ebean.search.*;
import java.util.Collection;
import java.util.Map;
@@ -117,6 +113,11 @@ public interface ExpressionFactory {
*/
Expression arrayIsNotEmpty(String propertyName);
/**
* Equal To the result of a sub-query.
*/
Expression eq(String propertyName, Query<?> subQuery);
/**
* Equal To - property equal to the given value.
*/
@@ -127,6 +128,11 @@ public interface ExpressionFactory {
*/
Expression eqOrNull(String propertyName, Object value);
/**
* Not Equal To the result of a sub-query.
*/
Expression ne(String propertyName, Query<?> subQuery);
/**
* Not Equal To - property not equal to the given value.
*/
@@ -181,6 +187,23 @@ public interface ExpressionFactory {
*/
Expression inRangeWith(String lowProperty, String highProperty, Object value);
/**
* A Property is in Range between 2 properties.
*
* <pre>{@code
*
* .orderDate.inRangeWith(QOrder.Alias.product.startDate, QOrder.Alias.product.endDate)
*
* // which equates to
* product.startDate <= orderDate and (orderDate < product.endDate or product.endDate is null)
*
* }</pre>
*
* <p>
* This is a convenience expression combining a number of simple expressions.
*/
Expression inRangeWithProperties(String propertyName, String lowProperty, String highProperty);
/**
* Between - property between the two given values.
*/
@@ -207,11 +230,21 @@ public interface ExpressionFactory {
*/
Expression geOrNull(String propertyName, Object value);
/**
* Greater Than the result of a sub-query.
*/
Expression gt(String propertyName, Query<?> subQuery);
/**
* Greater Than - property greater than the given value.
*/
Expression gt(String propertyName, Object value);
/**
* Greater Than or Equal to the result of a sub-query.
*/
Expression ge(String propertyName, Query<?> subQuery);
/**
* Greater Than or Equal to - property greater than or equal to the given
* value.
@@ -234,11 +267,21 @@ public interface ExpressionFactory {
*/
Expression leOrNull(String propertyName, Object value);
/**
* Less Than the result of a sub-query.
*/
Expression lt(String propertyName, Query<?> subQuery);
/**
* Less Than - property less than the given value.
*/
Expression lt(String propertyName, Object value);
/**
* Less Than or Equal to the result of a sub-query.
*/
Expression le(String propertyName, Query<?> subQuery);
/**
* Less Than or Equal to - property less than or equal to the given value.
*/
@@ -376,6 +419,94 @@ public interface ExpressionFactory {
*/
Expression inOrEmpty(String propertyName, Collection<?> values);
/**
* EXISTS a raw SQL SubQuery.
*
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
Expression exists(String sqlSubQuery, Object... bindValues);
/**
* Not EXISTS a raw SQL SubQuery.
*
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
Expression notExists(String sqlSubQuery, Object... bindValues);
/**
* IN a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
Expression inSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Not IN a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
Expression notInSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Equal To a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
Expression eqSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Not Equal To a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
Expression neSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Greater Than or Equal To a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
Expression geSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Greater Than a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
Expression gtSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Less Than or Equal To a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
Expression leSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Less Than a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
Expression ltSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Not In - property has a value in the array of values.
*/
@@ -54,14 +54,12 @@ public interface ExpressionList<T> {
Query<T> orderById(boolean orderById);
/**
* Set the order by clause replacing the existing order by clause if there is
* one.
* <p>
* This follows SQL syntax using commas between each property with the
* optional asc and desc keywords representing ascending and descending order
* respectively.
* Deprecated migrate to {@link #orderBy(String)}
*/
ExpressionList<T> order(String orderByClause);
@Deprecated(since = "13.19")
default ExpressionList<T> order(String orderByClause) {
return orderBy(orderByClause);
}
/**
* Set the order by clause replacing the existing order by clause if there is
@@ -74,15 +72,12 @@ public interface ExpressionList<T> {
ExpressionList<T> orderBy(String orderBy);
/**
* Return the OrderBy so that you can append an ascending or descending
* property to the order by clause.
* <p>
* This will never return a null. If no order by clause exists then an 'empty'
* OrderBy object is returned.
* <p>
* This is the same as <code>orderBy()</code>
* Deprecated migrate to orderBy().
*/
OrderBy<T> order();
@Deprecated
default OrderBy<T> order() {
return orderBy();
}
/**
* Return the OrderBy so that you can append an ascending or descending
@@ -95,12 +90,6 @@ public interface ExpressionList<T> {
*/
OrderBy<T> orderBy();
/**
* Deprecated migrate to {@link #orderBy(String)}
*/
@Deprecated
Query<T> setOrderBy(String orderBy);
/**
* Apply the path properties to the query replacing the select and fetch clauses.
*/
@@ -383,6 +372,15 @@ public interface ExpressionList<T> {
*/
<A> List<A> findSingleAttributeList();
/**
* Executes the query returning a set of values for a single property.
* <p>
* This can be used to cache sets.
*
* @return a HashSet of values for the selegted property
*/
<A> Set<A> findSingleAttributeSet();
/**
* Execute a query returning a single value of a single property/column.
* <pre>{@code
@@ -395,6 +393,7 @@ public interface ExpressionList<T> {
*
* }</pre>
*/
@Nullable
default <A> A findSingleAttribute() {
List<A> list = findSingleAttributeList();
return !list.isEmpty() ? list.get(0) : null;
@@ -821,16 +820,40 @@ public interface ExpressionList<T> {
*/
ExpressionList<T> addAll(ExpressionList<T> exprList);
/**
* Equal To the result of a sub-query.
*/
ExpressionList<T> eq(String propertyName, Query<?> subQuery);
/**
* Equal To - property is equal to a given value.
*/
ExpressionList<T> eq(String propertyName, Object value);
/**
* Is EQUAL TO if value is non-null and otherwise no expression is added to the query.
* <p>
* This is the EQUAL TO equivalent to {@link #inOrEmpty(String, Collection)} where the expression/predicate
* is only added when the value is non-null.
* <p>
* This is effectively a helper method that allows a query to be built in fluid style where some predicates are
* effectively optional. We can use <code>eqIfPresent()</code> rather than having a separate if block.
* <p>
* Another option is to instead globally use {@link io.ebean.config.DatabaseConfig#setExpressionEqualsWithNullAsNoop(boolean)}
* but that is not always desirable.
*/
ExpressionList<T> eqIfPresent(String propertyName, @Nullable Object value);
/**
* Equal To or Null - property is equal to a given value or null.
*/
ExpressionList<T> eqOrNull(String propertyName, Object value);
/**
* Not Equal To the result of a sub-query.
*/
ExpressionList<T> ne(String propertyName, Query<?> subQuery);
/**
* Not Equal To - property not equal to the given value.
*/
@@ -867,6 +890,23 @@ public interface ExpressionList<T> {
*/
ExpressionList<T> inRangeWith(String lowProperty, String highProperty, Object value);
/**
* A Property is in Range between 2 properties.
*
* <pre>{@code
*
* .orderDate.inRangeWith(QOrder.Alias.product.startDate, QOrder.Alias.product.endDate)
*
* // which equates to
* product.startDate <= orderDate and (orderDate < product.endDate or product.endDate is null)
*
* }</pre>
*
* <p>
* This is a convenience expression combining a number of simple expressions.
*/
ExpressionList<T> inRangeWithProperties(String propertyName, String lowProperty, String highProperty);
/**
* In Range - {@code property >= value1 and property < value2}.
* <p>
@@ -885,6 +925,11 @@ public interface ExpressionList<T> {
*/
ExpressionList<T> betweenProperties(String lowProperty, String highProperty, Object value);
/**
* Greater Than the result of a sub-query.
*/
ExpressionList<T> gt(String propertyName, Query<?> subQuery);
/**
* Greater Than - property greater than the given value.
*/
@@ -896,9 +941,17 @@ public interface ExpressionList<T> {
ExpressionList<T> gtOrNull(String propertyName, Object value);
/**
* Greater Than or Equal to OR Null - ({@code >= or null }).
* Is GREATER THAN if value is non-null and otherwise no expression is added to the query.
* <p>
* This is effectively a helper method that allows a query to be built in fluid style where some predicates are
* effectively optional. We can use <code>gtIfPresent()</code> rather than having a separate if block.
*/
ExpressionList<T> geOrNull(String propertyName, Object value);
ExpressionList<T> gtIfPresent(String propertyName, @Nullable Object value);
/**
* Greater Than or Equal to the result of a sub-query.
*/
ExpressionList<T> ge(String propertyName, Query<?> subQuery);
/**
* Greater Than or Equal to - property greater than or equal to the given
@@ -906,6 +959,25 @@ public interface ExpressionList<T> {
*/
ExpressionList<T> ge(String propertyName, Object value);
/**
* Greater Than or Equal to OR Null - ({@code >= or null }).
*/
ExpressionList<T> geOrNull(String propertyName, Object value);
/**
* Is GREATER THAN OR EQUAL TO if value is non-null and otherwise no expression is added to the query.
* <p>
* This is effectively a helper method that allows a query to be built in fluid style where some predicates are
* effectively optional. We can use <code>geIfPresent()</code> rather than having a separate if block.
*/
ExpressionList<T> geIfPresent(String propertyName, @Nullable Object value);
/**
* Less Than the result of a sub-query.
*/
ExpressionList<T> lt(String propertyName, Query<?> subQuery);
/**
* Less Than - property less than the given value.
*/
@@ -917,15 +989,36 @@ public interface ExpressionList<T> {
ExpressionList<T> ltOrNull(String propertyName, Object value);
/**
* Less Than or Equal to OR Null - ({@code <= or null }).
* Is LESS THAN if value is non-null and otherwise no expression is added to the query.
* <p>
* This is effectively a helper method that allows a query to be built in fluid style where some predicates are
* effectively optional. We can use <code>ltIfPresent()</code> rather than having a separate if block.
*/
ExpressionList<T> leOrNull(String propertyName, Object value);
ExpressionList<T> ltIfPresent(String propertyName, @Nullable Object value);
/**
* Less Than or Equal to the result of a sub-query.
*/
ExpressionList<T> le(String propertyName, Query<?> subQuery);
/**
* Less Than or Equal to - property less than or equal to the given value.
*/
ExpressionList<T> le(String propertyName, Object value);
/**
* Less Than or Equal to OR Null - ({@code <= or null }).
*/
ExpressionList<T> leOrNull(String propertyName, Object value);
/**
* Is LESS THAN OR EQUAL TO if value is non-null and otherwise no expression is added to the query.
* <p>
* This is effectively a helper method that allows a query to be built in fluid style where some predicates are
* effectively optional. We can use <code>leIfPresent()</code> rather than having a separate if block.
*/
ExpressionList<T> leIfPresent(String propertyName, @Nullable Object value);
/**
* Is Null - property is null.
*/
@@ -1038,6 +1131,94 @@ public interface ExpressionList<T> {
*/
ExpressionList<T> inPairs(Pairs pairs);
/**
* EXISTS a raw SQL SubQuery.
*
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
ExpressionList<T> exists(String sqlSubQuery, Object... bindValues);
/**
* Not EXISTS a raw SQL SubQuery.
*
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
ExpressionList<T> notExists(String sqlSubQuery, Object... bindValues);
/**
* IN a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
ExpressionList<T> inSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Not IN a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
ExpressionList<T> notInSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Equal To a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
ExpressionList<T> eqSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Not Equal To a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
ExpressionList<T> neSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Greater Than a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
ExpressionList<T> gtSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Greater Than or Equal To a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
ExpressionList<T> geSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Less Than a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
ExpressionList<T> ltSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* Less Than or Equal To a raw SQL SubQuery.
*
* @param propertyName The bean property
* @param sqlSubQuery The SQL SubQuery
* @param bindValues Optional bind values if the SubQuery uses {@code ? } bind values.
*/
ExpressionList<T> leSubQuery(String propertyName, String sqlSubQuery, Object... bindValues);
/**
* In - using a subQuery.
*/
@@ -1660,4 +1841,8 @@ public interface ExpressionList<T> {
*/
ExpressionList<T> endNot();
/**
* Clears the current expression list.
*/
ExpressionList<T> clear();
}
@@ -1,480 +1,21 @@
package io.ebean;
import io.avaje.lang.Nullable;
import javax.persistence.NonUniqueResultException;
import java.time.Clock;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;
/**
* The extended API for Database.
* <p>
* This provides the finder methods that take an explicit transaction rather than obtaining
* the transaction from the usual mechanism (which is ThreadLocal based).
* </p>
* <p>
* In general we only want to use this ExtendedServer API when we want to avoid / bypass
* the use of the mechanism to get the current transaction and instead explicitly supply
* the transaction to use.
* </p>
* <p>
* Note that in all cases the transaction supplied can be null and in this case the Database
* will use the normal mechanism to obtain the transaction to use.
* </p>
*/
public interface ExtendedServer {
/**
* Return the NOW time from the Clock.
*/
long clockNow();
/**
* Deprecated but no yet determined suitable replacement (to support testing only change of clock).
* <p>
* Set the Clock to use for <code>@WhenCreated</code> and <code>@WhenModified</code>.
* <p>
* Note that we only expect to change the Clock for testing purposes.
* </p>
*/
@Deprecated
void setClock(Clock clock);
/**
* Execute the query returning true if a row is found.
* <p>
* The query is executed using max rows of 1 and will only select the id property.
* This method is really just a convenient way to optimise a query to perform a
* 'does a row exist in the db' check.
* </p>
*
* <h2>Example:</h2>
* <pre>{@code
*
* boolean userExists = query().where().eq("email", "rob@foo.com").exists();
*
* }</pre>
*
* <h2>Example using a query bean:</h2>
* <pre>{@code
*
* boolean userExists = new QContact().email.equalTo("rob@foo.com").exists();
*
* }</pre>
*
* @return True if the query finds a matching row in the database
*/
<T> boolean exists(Query<T> ormQuery, Transaction transaction);
/**
* Return the number of 'top level' or 'root' entities this query should return.
*
* @see Query#findCount()
* @see Query#findFutureCount()
*/
<T> int findCount(Query<T> query, Transaction transaction);
/**
* Return the Id values of the query as a List.
*
* @see Query#findIds()
*/
<A, T> List<A> findIds(Query<T> query, Transaction transaction);
/**
* Return a QueryIterator for the query.
* <p>
* Generally using {@link #findEach(Query, Consumer, Transaction)} or
* {@link #findEachWhile(Query, Predicate, Transaction)} is preferred
* to findIterate(). The reason is that those methods automatically take care of
* closing the queryIterator (and the underlying jdbc statement and resultSet).
* <p>
* This is similar to findEach in that not all the result beans need to be held
* in memory at the same time and as such is good for processing large queries.
*
* @see Query#findIterate()
* @see Query#findEach(Consumer)
* @see Query#findEachWhile(Predicate)
*/
<T> QueryIterator<T> findIterate(Query<T> query, Transaction transaction);
/**
* Execute the query returning the result as a Stream.
* <p>
* Note that this can support very large queries iterating any number of results.
* To do so internally it can use multiple persistence contexts.
* <p>
* Note that the stream needs to be closed so use with try with resources.
* </p>
*/
<T> Stream<T> findStream(Query<T> query, Transaction transaction);
/**
* Execute the query visiting the each bean one at a time.
* <p>
* Unlike findList() this is suitable for processing a query that will return
* a very large resultSet. The reason is that not all the result beans need to be
* held in memory at the same time and instead processed one at a time.
* </p>
* <p>
* Internally this query using a PersistenceContext scoped to each bean (and the
* beans associated object graph).
* </p>
* <p>
* <pre>{@code
*
* DB.find(Order.class)
* .where().eq("status", Order.Status.NEW)
* .order().asc("id")
* .findEach((Order order) -> {
*
* // do something with the order bean
* System.out.println(" -- processing order ... " + order);
* });
*
* }</pre>
*
* @see Query#findEach(Consumer)
* @see Query#findEachWhile(Predicate)
*/
<T> void findEach(Query<T> query, Consumer<T> consumer, Transaction transaction);
/**
* Execute findEach with batch consumer.
*
* @see Query#findEach(int, Consumer)
*/
<T> void findEach(Query<T> query, int batch, Consumer<List<T>> consumer, Transaction t);
/**
* Execute the query visiting the each bean one at a time.
* <p>
* Compared to findEach() this provides the ability to stop processing the query
* results early by returning false for the Predicate.
* </p>
* <p>
* Unlike findList() this is suitable for processing a query that will return
* a very large resultSet. The reason is that not all the result beans need to be
* held in memory at the same time and instead processed one at a time.
* </p>
* <p>
* Internally this query using a PersistenceContext scoped to each bean (and the
* beans associated object graph).
* </p>
* <p>
* <pre>{@code
*
* DB.find(Order.class)
* .where().eq("status", Order.Status.NEW)
* .order().asc("id")
* .findEachWhile((Order order) -> {
*
* // do something with the order bean
* System.out.println(" -- processing order ... " + order);
*
* boolean carryOnProcessing = ...
* return carryOnProcessing;
* });
*
* }</pre>
*
* @see Query#findEach(Consumer)
* @see Query#findEachWhile(Predicate)
*/
<T> void findEachWhile(Query<T> query, Predicate<T> consumer, Transaction transaction);
/**
* Return versions of a @History entity bean.
* <p>
* Generally this query is expected to be a find by id or unique predicates query.
* It will execute the query against the history returning the versions of the bean.
* </p>
*/
<T> List<Version<T>> findVersions(Query<T> query, Transaction transaction);
/**
* Execute a query returning a list of beans.
* <p>
* Generally you are able to use {@link Query#findList()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
* <p>
* <pre>{@code
*
* List<Customer> customers = DB.find(Customer.class)
* .where().ilike("name", "rob%")
* .findList();
*
* }</pre>
*
* @param <T> the type of entity bean to fetch.
* @param query the query to execute.
* @param transaction the transaction to use (can be null).
* @return the list of fetched beans.
* @see Query#findList()
*/
<T> List<T> findList(Query<T> query, Transaction transaction);
/**
* Execute find row count query in a background thread.
* <p>
* This returns a Future object which can be used to cancel, check the
* execution status (isDone etc) and get the value (with or without a
* timeout).
* </p>
*
* @param query the query to execute the row count on
* @param transaction the transaction (can be null).
* @return a Future object for the row count query
* @see Query#findFutureCount()
*/
<T> FutureRowCount<T> findFutureCount(Query<T> query, Transaction transaction);
/**
* Execute find Id's query in a background thread.
* <p>
* This returns a Future object which can be used to cancel, check the
* execution status (isDone etc) and get the value (with or without a
* timeout).
* </p>
*
* @param query the query to execute the fetch Id's on
* @param transaction the transaction (can be null).
* @return a Future object for the list of Id's
* @see Query#findFutureIds()
*/
<T> FutureIds<T> findFutureIds(Query<T> query, Transaction transaction);
/**
* Execute find list query in a background thread returning a FutureList object.
* <p>
* This returns a Future object which can be used to cancel, check the
* execution status (isDone etc) and get the value (with or without a timeout).
* <p>
* This query will execute in it's own PersistenceContext and using its own transaction.
* What that means is that it will not share any bean instances with other queries.
*
* @param query the query to execute in the background
* @param transaction the transaction (can be null).
* @return a Future object for the list result of the query
* @see Query#findFutureList()
*/
<T> FutureList<T> findFutureList(Query<T> query, Transaction transaction);
/**
* Return a PagedList for this query using firstRow and maxRows.
* <p>
* The benefit of using this over findList() is that it provides functionality to get the
* total row count etc.
* </p>
* <p>
* If maxRows is not set on the query prior to calling findPagedList() then a
* PersistenceException is thrown.
* </p>
* <p>
* <pre>{@code
*
* PagedList<Order> pagedList = DB.find(Order.class)
* .setFirstRow(50)
* .setMaxRows(20)
* .findPagedList();
*
* // fetch the total row count in the background
* pagedList.loadRowCount();
*
* List<Order> orders = pagedList.getList();
* int totalRowCount = pagedList.getTotalRowCount();
*
* }</pre>
*
* @return The PagedList
* @see Query#findPagedList()
*/
<T> PagedList<T> findPagedList(Query<T> query, Transaction transaction);
/**
* Execute the query returning a set of entity beans.
* <p>
* Generally you are able to use {@link Query#findSet()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
* <p>
* <pre>{@code
*
* Set<Customer> customers = DB.find(Customer.class)
* .where().ilike("name", "rob%")
* .findSet();
*
* }</pre>
*
* @param <T> the type of entity bean to fetch.
* @param query the query to execute
* @param transaction the transaction to use (can be null).
* @return the set of fetched beans.
* @see Query#findSet()
*/
<T> Set<T> findSet(Query<T> query, Transaction transaction);
/**
* Execute the query returning the entity beans in a Map.
* <p>
* Generally you are able to use {@link Query#findMap()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
*
* @param <T> the type of entity bean to fetch.
* @param query the query to execute.
* @param transaction the transaction to use (can be null).
* @return the map of fetched beans.
* @see Query#findMap()
*/
<K, T> Map<K, T> findMap(Query<T> query, Transaction transaction);
/**
* Execute the query returning a list of values for a single property.
* <p>
* <h3>Example 1:</h3>
* <pre>{@code
*
* List<String> names =
* DB.find(Customer.class)
* .select("name")
* .order().asc("name")
* .findSingleAttributeList();
*
* }</pre>
* <h3>Example 2:</h3>
* <pre>{@code
*
* List<String> names =
* DB.find(Customer.class)
* .setDistinct(true)
* .select("name")
* .where().eq("status", Customer.Status.NEW)
* .order().asc("name")
* .setMaxRows(100)
* .findSingleAttributeList();
*
* }</pre>
*
* @return the list of values for the selected property
* @see Query#findSingleAttributeList()
*/
<A, T> List<A> findSingleAttributeList(Query<T> query, Transaction transaction);
/**
* Execute the query returning at most one entity bean or null (if no matching
* bean is found).
* <p>
* This will throw a NonUniqueResultException if the query finds more than one result.
* </p>
* <p>
* Generally you are able to use {@link Query#findOne()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
*
* @param <T> the type of entity bean to fetch.
* @param query the query to execute.
* @param transaction the transaction to use (can be null).
* @return the list of fetched beans.
* @throws NonUniqueResultException if more than one result was found
* @see Query#findOne()
*/
@Nullable
<T> T findOne(Query<T> query, Transaction transaction);
/**
* Similar to findOne() but returns an Optional (rather than nullable).
*/
<T> Optional<T> findOneOrEmpty(Query<T> query, Transaction transaction);
/**
* Execute as a delete query deleting the 'root level' beans that match the predicates
* in the query.
* <p>
* Note that if the query includes joins then the generated delete statement may not be
* optimal depending on the database platform.
* </p>
*
* @param query the query used for the delete
* @param transaction the transaction to use (can be null)
* @param <T> the type of entity bean to fetch.
* @return the number of beans/rows that were deleted
*/
<T> int delete(Query<T> query, Transaction transaction);
/**
* Execute the update query returning the number of rows updated.
* <p>
* The update query must be created using {@link Database#update(Class)}.
* </p>
*
* @param query the update query to execute
* @param transaction the optional transaction to use for the update (can be null)
* @param <T> the type of entity bean
* @return The number of rows updated
*/
<T> int update(Query<T> query, Transaction transaction);
/**
* Execute the sql query returning a list of MapBean.
* <p>
* Generally you are able to use {@link SqlQuery#findList()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
*
* @param query the query to execute.
* @param transaction the transaction to use (can be null).
* @return the list of fetched MapBean.
* @see SqlQuery#findList()
*/
List<SqlRow> findList(SqlQuery query, Transaction transaction);
/**
* Execute the SqlQuery iterating a row at a time.
* <p>
* This streaming type query is useful for large query execution as only 1 row needs to be held in memory.
* </p>
*/
void findEach(SqlQuery query, Consumer<SqlRow> consumer, Transaction transaction);
/**
* Execute the SqlQuery iterating a row at a time with the ability to stop consuming part way through.
* <p>
* Returning false after processing a row stops the iteration through the query results.
* </p>
* <p>
* This streaming type query is useful for large query execution as only 1 row needs to be held in memory.
* </p>
*/
void findEachWhile(SqlQuery query, Predicate<SqlRow> consumer, Transaction transaction);
/**
* Execute the sql query returning a single MapBean or null.
* <p>
* This will throw a PersistenceException if the query found more than one
* result.
* </p>
* <p>
* Generally you are able to use {@link SqlQuery#findOne()} rather than
* explicitly calling this method. You could use this method if you wish to
* explicitly control the transaction used for the query.
* </p>
*
* @param query the query to execute.
* @param transaction the transaction to use (can be null).
* @return the fetched MapBean or null if none was found.
* @see SqlQuery#findOne()
*/
@Nullable
SqlRow findOne(SqlQuery query, Transaction transaction);
}
@@ -8,6 +8,9 @@ import java.util.List;
* Intended to be used as a base class for 'Finder' implementations that can then
* be injected or used as public static fields on the associated entity bean.
* <p>
* When using dependency injection {@link BeanRepository} and {@link BeanFinder}
* are expected to be used rather than this Finder.
* <p>
* These 'finders' are a place to organise all the finder methods for that bean type
* and specific finder methods are expected to be added (find by unique properties etc).
* </p>
@@ -54,6 +57,8 @@ import java.util.List;
*
* }</pre>
*
* @see BeanRepository
* @see BeanFinder
*/
@NonNullApi
public class Finder<I, T> {
@@ -231,18 +231,6 @@ public class OrderBy<T> implements Serializable {
return this;
}
/**
* Return true if this order by can be used in select clause.
*/
public boolean supportsSelect() {
for (Property property : list) {
if (!property.supportsSelect()) {
return false;
}
}
return true;
}
/**
* A property and its ascending descending order.
*/
@@ -403,12 +391,6 @@ public class OrderBy<T> implements Serializable {
this.ascending = ascending;
}
/**
* Support use in select clause if no collation or nulls ordering.
*/
boolean supportsSelect() {
return nulls == null;
}
}
private void parse(String orderByClause) {
@@ -17,17 +17,17 @@ public interface ProfileLocation {
}
/**
* Create and return a new ProfileLocation with a given lineNumber and label.
* Create and return a new ProfileLocation with line number.
*/
static ProfileLocation create(int lineNumber, String label) {
return XServiceProvider.profileLocationFactory().create(lineNumber, label);
static ProfileLocation createWithLine() {
return XServiceProvider.profileLocationFactory().createWithLine();
}
/**
* Create and return a new ProfileLocation with a given location.
* Create and return a new ProfileLocation with a given lineNumber and label.
*/
static ProfileLocation createAt(String location) {
return XServiceProvider.profileLocationFactory().createAt(location);
static ProfileLocation create(String label) {
return XServiceProvider.profileLocationFactory().create(label);
}
/**
+40 -22
View File
@@ -926,7 +926,12 @@ public interface Query<T> extends CancelableQuery {
<A> List<A> findSingleAttributeList();
/**
* Execute a query returning a single value of a single property/column.
* Execute the query returning a hashset of values for a single property.
*/
<A> Set<A> findSingleAttributeSet();
/**
* Execute a query returning a single value or null for a single property/column.
* <p>
* <pre>{@code
*
@@ -938,6 +943,7 @@ public interface Query<T> extends CancelableQuery {
*
* }</pre>
*/
@Nullable
<A> A findSingleAttribute();
/**
@@ -1366,13 +1372,9 @@ public interface Query<T> extends CancelableQuery {
Query<T> orderBy(String orderByClause);
/**
* Set the order by clause replacing the existing order by clause if there is
* one.
* <p>
* This follows SQL syntax using commas between each property with the
* optional asc and desc keywords representing ascending and descending order
* respectively.
* Deprecated migrate to orderBy().
*/
@Deprecated(since = "13.19")
default Query<T> order(String orderByClause) {
return orderBy(orderByClause);
}
@@ -1389,14 +1391,9 @@ public interface Query<T> extends CancelableQuery {
OrderBy<T> orderBy();
/**
* Return the OrderBy so that you can append an ascending or descending
* property to the order by clause.
* <p>
* This will never return a null. If no order by clause exists then an 'empty'
* OrderBy object is returned.
* <p>
* This is the same as <code>orderBy()</code>
* Deprecated migrate to orderBy().
*/
@Deprecated(since = "13.19")
default OrderBy<T> order() {
return orderBy();
}
@@ -1407,8 +1404,9 @@ public interface Query<T> extends CancelableQuery {
Query<T> setOrderBy(OrderBy<T> orderBy);
/**
* Set an OrderBy object to replace any existing OrderBy clause.
* Deprecated migrate to setOrderBy().
*/
@Deprecated(since = "13.19")
default Query<T> setOrder(OrderBy<T> orderBy) {
return setOrderBy(orderBy);
}
@@ -1573,13 +1571,6 @@ public interface Query<T> extends CancelableQuery {
*/
Query<T> setReadOnly(boolean readOnly);
/**
* Will be deprecated - migrate to use setBeanCacheMode(CacheMode.RECACHE).
* <p>
* When set to true all the beans from this query are loaded into the bean cache.
*/
Query<T> setLoadBeanCache(boolean loadBeanCache);
/**
* Set a timeout on this query.
* <p>
@@ -1761,4 +1752,31 @@ public interface Query<T> extends CancelableQuery {
*/
Query<T> orderById(boolean orderById);
/**
* Type safe query bean properties and expressions (marker interface).
* <p>
* Implemented by query bean properties and expressions based on those properties.
* <p>
* The base type determines which {@link StdOperators} can be used on the property.
*
* @param <T> The property type.
*/
interface Property<T> {
/**
* Return a property given the expression.
*/
static <T> Property<T> of(String expression) {
return new SimpleProperty<>(expression);
}
/**
* Return the property in string expression form.
* <p>
* This is a path to a database column (like "name" or "billingAddress.city") or a function
* wrapping a path (like <em>lower(name)</em>, <em>concat(name, '-', billingAddress.city)</em>
*/
@Override
String toString();
}
}
@@ -0,0 +1,15 @@
package io.ebean;
final class SimpleProperty<T> implements Query.Property<T> {
private final String expression;
SimpleProperty(String expression) {
this.expression = expression;
}
@Override
public String toString() {
return expression;
}
}
+11 -1
View File
@@ -2,8 +2,8 @@ package io.ebean;
import io.avaje.lang.NonNullApi;
import io.avaje.lang.Nullable;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
@@ -40,6 +40,11 @@ import java.util.function.Predicate;
@NonNullApi
public interface SqlQuery extends Serializable, CancelableQuery {
/**
* Execute the query using the given transaction.
*/
SqlQuery usingTransaction(Transaction transaction);
/**
* Execute the query returning a list.
*/
@@ -298,6 +303,11 @@ public interface SqlQuery extends Serializable, CancelableQuery {
*/
interface TypeQuery<T> {
/**
* Execute the query using the given transaction.
*/
TypeQuery<T> usingTransaction(Transaction transaction);
/**
* Return the single value.
*/
@@ -0,0 +1,332 @@
package io.ebean;
import io.ebean.Query.Property;
import java.util.Collection;
/**
* Standard Operators for use with strongly typed query construction.
* <p>
* This is currently deemed to be experimental and subject to change.
*/
@Deprecated(since = "experimental")
public final class StdOperators {
// ---- Functions ---- //
/**
* Sum of the given property.
*/
public static Property<Number> sum(Property<? extends Number> property) {
return Property.of("sum(" + property + ")");
}
/**
* Count of the given property.
*/
public static Property<Number> count(Property<?> property) {
return Property.of("count(" + property + ")");
}
/**
* Average of the given property.
*/
public static <T> Property<T> avg(Property<T> property) {
return Property.of("avg(" + property + ")");
}
/**
* Max of the given property.
*/
public static <T> Property<T> max(Property<T> property) {
return Property.of("max(" + property + ")");
}
/**
* Min of the given property.
*/
public static <T> Property<T> min(Property<T> property) {
return Property.of("min(" + property + ")");
}
/**
* Coalesce of the property and value.
*/
public static <T> Property<T> coalesce(Property<T> property, Object value) {
return Property.of("coalesce(" + property.toString() + "," + sqlValue(value) + ")");
}
/**
* Lower of the given property.
*/
public static Property<String> lower(Property<String> property) {
return Property.of("lower(" + property + ")");
}
/**
* Upper of the given property.
*/
public static Property<String> upper(Property<String> property) {
return Property.of("upper(" + property + ")");
}
/**
* Concat of the given property and values or other properties.
*/
public static Property<String> concat(Property<?> property, Object... values) {
StringBuilder expression = new StringBuilder(50);
expression.append("concat(").append(property.toString());
for (Object value : values) {
expression.append(",").append(sqlConcatString(value));
}
expression.append(")");
return Property.of(expression.toString());
}
private static String sqlConcatString(Object value) {
if (value instanceof Property) {
return value.toString();
} else {
return sqlQuote(value);
}
}
/**
* Allows numbers to be unquoted.
*/
private static String sqlValue(Object value) {
if (value instanceof Property || value instanceof Number) {
return value.toString();
} else {
return sqlQuote(value);
}
}
/**
* SQL quoted escaping single quotes.
*/
private static String sqlQuote(Object value) {
return "'" + String.valueOf(value).replace("'", "''") + "'";
}
// ---- Operators ---- //
/**
* Equal to - for a property and value.
*/
public static <T> Expression eq(Property<T> property, T value) {
return Expr.eq(property.toString(), value);
}
/**
* Equal to - for a property and sub-query.
*/
public static <T> Expression eq(Property<T> property, Query<?> subQuery) {
return Expr.in(property.toString(), subQuery);
}
/**
* Equal to or null - for a property and value.
*/
public static <T> Expression eqOrNull(Property<T> property, T value) {
return Expr.factory().eqOrNull(property.toString(), value);
}
/**
* Not equal to - for a property and value.
*/
public static <T> Expression ne(Property<T> property, T value) {
return Expr.ne(property.toString(), value);
}
/**
* Not equal to - for a property and sub-query.
*/
public static <T> Expression ne(Property<T> property, Query<?> subQuery) {
return Expr.ne(property.toString(), subQuery);
}
/**
* Greater than - for a property and value.
*/
public static <T> Expression gt(Property<T> property, T value) {
return Expr.gt(property.toString(), value);
}
/**
* Greater than - for a property and sub-query.
*/
public static <T> Expression gt(Property<T> property, Query<?> subQuery) {
return Expr.gt(property.toString(), subQuery);
}
/**
* Greater than or null - for a property and value.
*/
public static <T> Expression gtOrNull(Property<T> property, T value) {
return Expr.factory().gtOrNull(property.toString(), value);
}
/**
* Greater than or equal to - for a property and value.
*/
public static <T> Expression ge(Property<T> property, T value) {
return Expr.ge(property.toString(), value);
}
/**
* Greater than or equal to - for a property and sub-query.
*/
public static <T> Expression ge(Property<T> property, Query<?> subQuery) {
return Expr.ge(property.toString(), subQuery);
}
/**
* Greater than or null - for a property and value.
*/
public static <T> Expression geOrNull(Property<T> property, T value) {
return Expr.factory().geOrNull(property.toString(), value);
}
/**
* Less than - for a property and value.
*/
public static <T> Expression lt(Property<T> property, T value) {
return Expr.lt(property.toString(), value);
}
/**
* Less than - for a property and sub-query.
*/
public static <T> Expression lt(Property<T> property, Query<?> subQuery) {
return Expr.lt(property.toString(), subQuery);
}
/**
* Less than or null - for a property and value.
*/
public static <T> Expression ltOrNull(Property<T> property, T value) {
return Expr.factory().ltOrNull(property.toString(), value);
}
/**
* Greater than or equal to - for a property and value.
*/
public static <T> Expression le(Property<T> property, T value) {
return Expr.le(property.toString(), value);
}
/**
* Greater than or equal to - for a property and sub-query.
*/
public static <T> Expression le(Property<T> property, Query<?> subQuery) {
return Expr.le(property.toString(), subQuery);
}
/**
* Greater than or equal to or null - for a property and value.
*/
public static <T> Expression leOrNull(Property<T> property, T value) {
return Expr.factory().leOrNull(property.toString(), value);
}
/**
* In range - for a property and values.
*/
public static <T> Expression inRange(Property<T> property, T lowValue, T highValue) {
return Expr.factory().inRange(property.toString(), lowValue, highValue);
}
/**
* In range - for properties and a value.
*/
public static <T> Expression inRange(Property<T> lowProperty, Property<T> highProperty, T value) {
return Expr.factory().inRangeWith(lowProperty.toString(), highProperty.toString(), value);
}
/**
* In range - for properties.
*/
public static <T> Expression inRange(Property<T> lowProperty, Property<T> property, Property<T> highProperty) {
return Expr.factory().inRangeWithProperties(lowProperty.toString(), property.toString(), highProperty.toString());
}
/**
* In - for a given property and collection of values.
*/
public static <T> Expression in(Property<T> property, Collection<T> value) {
return Expr.in(property.toString(), value);
}
/**
* In - for a given property and sub-query.
*/
public static <T> Expression in(Property<T> property, Query<?> subQuery) {
return Expr.in(property.toString(), subQuery);
}
/**
* In or empty - for a given property and collection of values.
*/
public static <T> Expression inOrEmpty(Property<T> property, Collection<T> value) {
return Expr.inOrEmpty(property.toString(), value);
}
/**
* Not In - for a given property and collection of values.
*/
public static <T> Expression notIn(Property<T> property, Collection<T> value) {
return Expr.factory().notIn(property.toString(), value);
}
/**
* Not In - for a given property and sub-query.
*/
public static <T> Expression notIn(Property<T> property, Query<?> subQuery) {
return Expr.factory().notIn(property.toString(), subQuery);
}
// ---- String operators ---- //
/**
* Like - for a given property and value.
*/
public static Expression like(Property<String> property, String value) {
return Expr.like(property.toString(), value);
}
/**
* Case-insensitive Like - for a given property and value.
*/
public static Expression ilike(Property<String> property, String value) {
return Expr.ilike(property.toString(), value);
}
/**
* Starts with - for a given property and value.
*/
public static Expression startsWith(Property<String> property, String value) {
return Expr.startsWith(property.toString(), value);
}
/**
* Case-insensitive starts with - for a given property and value.
*/
public static Expression istartsWith(Property<String> property, String value) {
return Expr.istartsWith(property.toString(), value);
}
/**
* Contains - for a given property and value.
*/
public static Expression contains(Property<String> property, String value) {
return Expr.contains(property.toString(), value);
}
/**
* Case-insensitive contains - for a given property and value.
*/
public static Expression icontains(Property<String> property, String value) {
return Expr.icontains(property.toString(), value);
}
}
@@ -144,6 +144,35 @@ public interface Transaction extends AutoCloseable {
*/
void rollback(Throwable e) throws PersistenceException;
/**
* Performs a rollback on the underlying JDBC connection with the intention of
* continuing to use this same transaction and performing a commit or rollback
* later to complete the transaction.
* <p>
* Typically used when catching {@link DuplicateKeyException} where we wish to
* rollback work done at that point but carry on processing using the transaction.
*
* <pre>{@code
*
* try (Transaction txn = database.beginTransaction()) {
*
* try {
* ...
* database.save(bean);
* database.flush();
* } catch (DuplicateKeyException e) {
* // carry on processing using the transaction
* txn.rollbackAndContinue();
* ...
* }
*
* txn.commit();
* }
*
* }</pre>
*/
void rollbackAndContinue();
/**
* Set when we want nested transactions to use Savepoint's.
* <p>
@@ -14,7 +14,7 @@ package io.ebean;
*
* int rows = DB.update(Customer.class)
* .set("status", Customer.Status.ACTIVE)
* .set("updtime", new Timestamp(System.currentTimeMillis()))
* .set("whenUpdated", Instant.now())
* .where()
* .gt("id", 1000)
* .update();
@@ -25,6 +25,20 @@ package io.ebean;
* update o_customer set status=?, updtime=? where id > ?
*
* }</pre>
*
* <h4>Example: Using query bean</h4>
* <pre>{@code
*
* var cust = QCustomer.alias();
*
* int rows = new QCustomer()
* .id.gt(1000)
* .asUpdate()
* .set(cust.status, Customer.Status.COMPLETE)
* .set(cust.whenUpdated, Instant.now())
* .update();
*
* }</pre>
* <p>
* Note that if the where() clause contains a join then the SQL update changes to use a
* <code> WHERE ID IN () </code> form.
@@ -40,7 +54,7 @@ package io.ebean;
*
* int rows = DB.update(Customer.class)
* .set("status", Customer.Status.ACTIVE)
* .set("updtime", new Timestamp(System.currentTimeMillis()))
* .set("whenUpdated", Instant.now())
* .where()
* .eq("status", Customer.Status.NEW)
* .eq("billingAddress.country", nz)
@@ -73,7 +87,7 @@ public interface UpdateQuery<T> {
*
* int rows = DB.update(Customer.class)
* .set("status", Customer.Status.ACTIVE)
* .set("updtime", new Timestamp(System.currentTimeMillis()))
* .set("whenUpdated", Instant.now())
* .where()
* .gt("id", 1000)
* .update();
@@ -85,6 +99,27 @@ public interface UpdateQuery<T> {
*/
UpdateQuery<T> set(String property, Object value);
/**
* Set the value of a property.
* <p>
* <pre>{@code
*
* var cust = QCustomer.alias();
*
* int rows = new QCustomer()
* .id.gt(1000)
* .asUpdate()
* .set(cust.status, Customer.Status.COMPLETE)
* .set(cust.whenUpdated, Instant.now())
* .update();
*
* }</pre>
*
* @param property The bean property to be set
* @param value The value to set the property to
*/
<P> UpdateQuery<T> set(Query.Property<P> property, P value);
/**
* Set the property to be null.
* <p>
@@ -102,6 +137,13 @@ public interface UpdateQuery<T> {
*/
UpdateQuery<T> setNull(String property);
/**
* Set the property to be null.
*
* @param property The bean property to be set
*/
UpdateQuery<T> setNull(Query.Property<?> property);
/**
* Set using a property expression that does not need any bind values.
* <p>
@@ -77,12 +77,12 @@ public interface BeanCollection<E> extends Serializable, ToStringAware {
/**
* Return the bean that owns this collection.
*/
EntityBean getOwnerBean();
EntityBean owner();
/**
* Return the bean property name this collection represents.
*/
String getPropertyName();
String propertyName();
/**
* Check after the lazy load that the underlying collection is not null
@@ -99,7 +99,7 @@ public interface BeanCollection<E> extends Serializable, ToStringAware {
* This is so that the filter can be applied on refresh.
* </p>
*/
ExpressionList<?> getFilterMany();
ExpressionList<?> filterMany();
/**
* Set the filter that was used in building this collection.
@@ -154,7 +154,7 @@ public interface BeanCollection<E> extends Serializable, ToStringAware {
/**
* Returns the underlying collection of beans from the Set, Map or List.
*/
Collection<E> getActualDetails();
Collection<E> actualDetails();
/**
* Returns the underlying entries so for Maps this is a collection of
@@ -162,7 +162,7 @@ public interface BeanCollection<E> extends Serializable, ToStringAware {
* <p>
* For maps this returns the entrySet as we need the keys of the map.
*/
Collection<?> getActualEntries();
Collection<?> actualEntries();
/**
* return true if there are real rows held. Return false is this is using
@@ -195,7 +195,7 @@ public interface BeanCollection<E> extends Serializable, ToStringAware {
/**
* Return the current modify listening mode. Can be null for on newly created beans.
*/
ModifyListenMode getModifyListening();
ModifyListenMode modifyListening();
/**
* Add an object to the additions list.
@@ -217,13 +217,13 @@ public interface BeanCollection<E> extends Serializable, ToStringAware {
* Return the list of objects added to the list set or map. These will used to
* insert rows into the intersection table of a ManyToMany.
*/
Set<E> getModifyAdditions();
Set<E> modifyAdditions();
/**
* Return the list of objects removed from the list set or map. These will
* used to delete rows from the intersection table of a ManyToMany.
*/
Set<E> getModifyRemovals();
Set<E> modifyRemovals();
/**
* Reset the set of additions and deletions. This is called after the
@@ -239,5 +239,5 @@ public interface BeanCollection<E> extends Serializable, ToStringAware {
/**
* Return a shallow copy of this collection that is modifiable.
*/
BeanCollection<E> getShallowCopy();
BeanCollection<E> shallowCopy();
}
@@ -13,7 +13,7 @@ public interface BeanLoader {
/**
* Return the name of the associated Database.
*/
String getName();
String name();
/**
* Invoke the lazy loading for this bean.
@@ -8,15 +8,15 @@ public interface CallOrigin {
/**
* Return the top element. Typically the top stack element with class and line.
*/
String getTopElement();
String top();
/**
* Return the full description of the call origin.
*/
String getFullDescription();
String description();
/**
* Compute and return an origin key based on the query hash.
*/
String getOriginKey(int queryHash);
String key(int queryHash);
}
@@ -2,6 +2,7 @@ package io.ebean.bean;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import static io.ebean.util.EncodeB64.enc;
@@ -27,20 +28,27 @@ public final class CallStack implements Serializable, CallOrigin {
private final String zeroHash;
private final String pathHash;
private final StackTraceElement[] callStack;
private final Object[] callStack;
private final int hc;
public CallStack(StackTraceElement[] callStack, int zeroHash, int pathHash) {
public CallStack(Object[] callStack, int zeroHash, int pathHash) {
this.callStack = callStack;
this.hc = computeHashCode();
this.zeroHash = enc(zeroHash);
this.pathHash = enc(pathHash);
}
public CallStack(List<StackWalker.StackFrame> frames) {
this.callStack = frames.toArray(new Object[0]);
this.hc = computeHashCode();
this.zeroHash = enc(callStack[0].toString().hashCode());
this.pathHash = enc(hc);
}
private int computeHashCode() {
int hc = 0;
for (StackTraceElement element : callStack) {
hc = 92821 * hc + element.hashCode();
for (Object element : callStack) {
hc = 92821 * hc + element.toString().hashCode();
}
return hc;
}
@@ -71,7 +79,7 @@ public final class CallStack implements Serializable, CallOrigin {
* Return the first element of the call stack.
*/
@Override
public String getTopElement() {
public String top() {
return callStack[0].toString();
}
@@ -79,7 +87,7 @@ public final class CallStack implements Serializable, CallOrigin {
* Return the call stack lines appended with the given newLine string.
*/
@Override
public String getFullDescription() {
public String description() {
StringBuilder sb = new StringBuilder(400);
for (int i = 0; i < callStack.length; i++) {
if (i > 0) {
@@ -91,7 +99,7 @@ public final class CallStack implements Serializable, CallOrigin {
}
@Override
public String getOriginKey(int queryHash) {
public String key(int queryHash) {
return enc(queryHash) + "." + zeroHash + "." + pathHash;
}
@@ -6,17 +6,23 @@ import java.io.Serializable;
import java.util.Map;
import java.util.Set;
/**
* This is the object associated to every entity bean using byte code enhancement.
* <p>
* This provides per property state such as loaded state, changed state, original values
* as well as bean level dirty state etc.
*/
public interface EntityBeanIntercept extends Serializable {
/**
* Return the 'owning' entity bean.
*/
EntityBean getOwner();
EntityBean owner();
/**
* Return the persistenceContext.
*/
PersistenceContext getPersistenceContext();
PersistenceContext persistenceContext();
/**
* Set the persistenceContext.
@@ -31,7 +37,7 @@ public interface EntityBeanIntercept extends Serializable {
/**
* Return the ownerId (IdClass).
*/
Object getOwnerId();
Object ownerId();
/**
* Set the ownerId (IdClass).
@@ -41,12 +47,12 @@ public interface EntityBeanIntercept extends Serializable {
/**
* Return the owning bean for an embedded bean.
*/
Object getEmbeddedOwner();
Object embeddedOwner();
/**
* Return the property index (for the parent) of this embedded bean.
*/
int getEmbeddedOwnerIndex();
int embeddedOwnerIndex();
/**
* Clear the getter callback.
@@ -223,7 +229,7 @@ public interface EntityBeanIntercept extends Serializable {
/**
* Return the original value that was changed via an update.
*/
Object getOrigValue(int propertyIndex);
Object origValue(int propertyIndex);
/**
* Finds the index position of a given property. Returns -1 if the
@@ -234,12 +240,12 @@ public interface EntityBeanIntercept extends Serializable {
/**
* Return the property name for the given property.
*/
String getProperty(int propertyIndex);
String property(int propertyIndex);
/**
* Return the number of properties.
*/
int getPropertyLength();
int propertyLength();
/**
* Set the loaded state of the property given it's name.
@@ -282,8 +288,14 @@ public interface EntityBeanIntercept extends Serializable {
*/
void markPropertyAsChanged(int propertyIndex);
/**
* Set the changed state for the given property.
*/
void setChangedProperty(int propertyIndex);
/**
* Set the changed and loaded state for the given property.
*/
void setChangeLoaded(int propertyIndex);
/**
@@ -291,6 +303,9 @@ public interface EntityBeanIntercept extends Serializable {
*/
void setEmbeddedPropertyDirty(int propertyIndex);
/**
* Set the original value for the property.
*/
void setOriginalValue(int propertyIndex, Object value);
/**
@@ -306,17 +321,17 @@ public interface EntityBeanIntercept extends Serializable {
/**
* Return the set of property names for a partially loaded bean.
*/
Set<String> getLoadedPropertyNames();
Set<String> loadedPropertyNames();
/**
* Return the array of flags indicating the dirty properties.
*/
boolean[] getDirtyProperties();
boolean[] dirtyProperties();
/**
* Return the set of dirty properties.
*/
Set<String> getDirtyPropertyNames();
Set<String> dirtyPropertyNames();
/**
* Recursively add dirty properties.
@@ -331,7 +346,7 @@ public interface EntityBeanIntercept extends Serializable {
/**
* Return a map of dirty properties with their new and old values.
*/
Map<String, ValuePair> getDirtyValues();
Map<String, ValuePair> dirtyValues();
/**
* Recursively add dirty properties.
@@ -346,7 +361,7 @@ public interface EntityBeanIntercept extends Serializable {
/**
* Return a dirty property hash taking into account embedded beans.
*/
StringBuilder getDirtyPropertyKey();
StringBuilder dirtyPropertyKey();
/**
* Add and return a dirty property hash.
@@ -356,19 +371,22 @@ public interface EntityBeanIntercept extends Serializable {
/**
* Return a loaded property hash.
*/
StringBuilder getLoadedPropertyKey();
StringBuilder loadedPropertyKey();
boolean[] getLoaded();
/**
* Return the loaded state for all the properties.
*/
boolean[] loaded();
/**
* Return the index of the property that triggered the lazy load.
*/
int getLazyLoadPropertyIndex();
int lazyLoadPropertyIndex();
/**
* Return the property that triggered the lazy load.
*/
String getLazyLoadProperty();
String lazyLoadProperty();
/**
* Load the bean when it is a reference.
@@ -385,6 +403,9 @@ public interface EntityBeanIntercept extends Serializable {
*/
void initialisedMany(int propertyIndex);
/**
* Invoke the PreGetterCallback if it has been set due to getter for the given property.
*/
void preGetterCallback(int propertyIndex);
/**
@@ -402,8 +423,14 @@ public interface EntityBeanIntercept extends Serializable {
*/
void preSetterMany(boolean interceptField, int propertyIndex, Object oldValue, Object newValue);
/**
* Set the property changed state, bean dirtyState and property original value.
*/
void setChangedPropertyValue(int propertyIndex, boolean setDirtyState, Object origValue);
/**
* Set the dirty state on the bean.
*/
void setDirtyStatus();
/**
@@ -470,7 +497,7 @@ public interface EntityBeanIntercept extends Serializable {
/**
* Return the sort order value for an order column.
*/
int getSortOrder();
int sortOrder();
/**
* Set the sort order value for an order column.
@@ -482,6 +509,9 @@ public interface EntityBeanIntercept extends Serializable {
*/
void setDeletedFromCollection(boolean deletedFromCollection);
/**
* Return true if the bean was orphan deleted from a collection.
*/
boolean isOrphanDelete();
/**
@@ -492,9 +522,12 @@ public interface EntityBeanIntercept extends Serializable {
/**
* Returns the loadErrors.
*/
Map<String, Exception> getLoadErrors();
Map<String, Exception> loadErrors();
boolean isChangedProp(int i);
/**
* Return true if the property has its changed state set.
*/
boolean isChangedProp(int propertyIndex);
/**
* Return the MutableValueInfo for the given property or null.
@@ -6,21 +6,36 @@ import java.util.Collections;
import java.util.Map;
import java.util.Set;
/**
* EntityBeanIntercept optimised for read only use.
* <p>
* For the read only use this intercept doesn't need to hold any state that is normally
* required for updates such as per property changed, loaded, dirty state, original values
* bean state etc.
*/
public class InterceptReadOnly implements EntityBeanIntercept {
private final EntityBean owner;
/**
* Create with a given entity.
*/
public InterceptReadOnly(Object ownerBean) {
this.owner = (EntityBean) ownerBean;
}
@Override
public EntityBean getOwner() {
public String toString() {
return "InterceptReadOnly{" + owner + '}';
}
@Override
public EntityBean owner() {
return owner;
}
@Override
public PersistenceContext getPersistenceContext() {
public PersistenceContext persistenceContext() {
return null;
}
@@ -35,7 +50,7 @@ public class InterceptReadOnly implements EntityBeanIntercept {
}
@Override
public Object getOwnerId() {
public Object ownerId() {
return null;
}
@@ -45,12 +60,12 @@ public class InterceptReadOnly implements EntityBeanIntercept {
}
@Override
public Object getEmbeddedOwner() {
public Object embeddedOwner() {
return null;
}
@Override
public int getEmbeddedOwnerIndex() {
public int embeddedOwnerIndex() {
return 0;
}
@@ -215,7 +230,7 @@ public class InterceptReadOnly implements EntityBeanIntercept {
}
@Override
public Object getOrigValue(int propertyIndex) {
public Object origValue(int propertyIndex) {
return null;
}
@@ -225,12 +240,12 @@ public class InterceptReadOnly implements EntityBeanIntercept {
}
@Override
public String getProperty(int propertyIndex) {
public String property(int propertyIndex) {
return null;
}
@Override
public int getPropertyLength() {
public int propertyLength() {
return 0;
}
@@ -305,17 +320,17 @@ public class InterceptReadOnly implements EntityBeanIntercept {
}
@Override
public Set<String> getLoadedPropertyNames() {
public Set<String> loadedPropertyNames() {
return Collections.emptySet();
}
@Override
public boolean[] getDirtyProperties() {
public boolean[] dirtyProperties() {
return new boolean[0];
}
@Override
public Set<String> getDirtyPropertyNames() {
public Set<String> dirtyPropertyNames() {
return Collections.emptySet();
}
@@ -330,7 +345,7 @@ public class InterceptReadOnly implements EntityBeanIntercept {
}
@Override
public Map<String, ValuePair> getDirtyValues() {
public Map<String, ValuePair> dirtyValues() {
return Collections.emptyMap();
}
@@ -345,7 +360,7 @@ public class InterceptReadOnly implements EntityBeanIntercept {
}
@Override
public StringBuilder getDirtyPropertyKey() {
public StringBuilder dirtyPropertyKey() {
return null;
}
@@ -355,22 +370,22 @@ public class InterceptReadOnly implements EntityBeanIntercept {
}
@Override
public StringBuilder getLoadedPropertyKey() {
public StringBuilder loadedPropertyKey() {
return null;
}
@Override
public boolean[] getLoaded() {
public boolean[] loaded() {
return new boolean[0];
}
@Override
public int getLazyLoadPropertyIndex() {
public int lazyLoadPropertyIndex() {
return 0;
}
@Override
public String getLazyLoadProperty() {
public String lazyLoadProperty() {
return null;
}
@@ -480,7 +495,7 @@ public class InterceptReadOnly implements EntityBeanIntercept {
}
@Override
public int getSortOrder() {
public int sortOrder() {
return 0;
}
@@ -505,7 +520,7 @@ public class InterceptReadOnly implements EntityBeanIntercept {
}
@Override
public Map<String, Exception> getLoadErrors() {
public Map<String, Exception> loadErrors() {
return null;
}
@@ -21,7 +21,6 @@ import java.util.concurrent.locks.ReentrantLock;
* <p>
* This provides the mechanisms to support deferred fetching of reference beans
* and oldValues generation for concurrency checking.
* </p>
*/
public final class InterceptReadWrite implements EntityBeanIntercept {
@@ -32,30 +31,23 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
private static final int STATE_LOADED = 2;
/**
* Used when a bean is partially filled.
* Used when a bean is partially loaded.
*/
private static final byte FLAG_LOADED_PROP = 1;
private static final byte FLAG_CHANGED_PROP = 2;
private static final byte FLAG_CHANGEDLOADED_PROP = 3;
/**
* Flags indicating if a property is a dirty embedded bean. Used to distinguish
* between an embedded bean being completely overwritten and one of its
* embedded properties being made dirty.
* Flags indicating if a property is a dirty embedded bean. Used to distinguish between an
* embedded bean being completely overwritten vs one with embedded properties that are dirty.
*/
private static final byte FLAG_EMBEDDED_DIRTY = 4;
/**
* Flags indicating if a property is a dirty embedded bean. Used to distinguish
* between an embedded bean being completely overwritten and one of its
* embedded properties being made dirty.
*/
private static final byte FLAG_ORIG_VALUE_SET = 8;
/**
* Flags indicating if the mutable hash is set.
*/
private static final byte FLAG_MUTABLE_HASH_SET = 16;
private transient final ReentrantLock lock = new ReentrantLock();
private final ReentrantLock lock = new ReentrantLock();
private transient NodeUsageCollector nodeUsageCollector;
private transient PersistenceContext persistenceContext;
private transient BeanLoader beanLoader;
@@ -78,10 +70,9 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
private boolean readOnly;
private boolean dirty;
/**
* Flag set to disable lazy loading - typically for SQL "report" type entity beans.
* Flag set to disable lazy loading.
*/
private boolean disableLazyLoad;
/**
* Flag set when lazy loading failed due to the underlying bean being deleted in the DB.
*/
@@ -107,7 +98,7 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
private MutableValueNext[] mutableNext;
/**
* Create a intercept with a given entity.
* Create with a given entity.
*/
public InterceptReadWrite(Object ownerBean) {
this.owner = (EntityBean) ownerBean;
@@ -123,12 +114,30 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public EntityBean getOwner() {
public String toString() {
return "InterceptReadWrite@" + hashCode() + "{state=" + state +
(dirty ? " dirty;" : "") +
(forceUpdate ? " forceUpdate;" : "") +
(readOnly ? " readOnly;" : "") +
(disableLazyLoad ? " disableLazyLoad;" : "") +
(lazyLoadFailure ? " lazyLoadFailure;" : "") +
(fullyLoadedBean ? " fullyLoadedBean;" : "") +
(loadedFromCache ? " loadedFromCache;" : "") +
", pc=" + System.identityHashCode(persistenceContext) +
", flags=" + Arrays.toString(flags) +
(lazyLoadProperty > -1 ? (", lazyLoadProperty=" + lazyLoadProperty) : "") +
", loader=" + beanLoader +
(ownerId != null ? (", ownerId=" + ownerId) : "") +
'}';
}
@Override
public EntityBean owner() {
return owner;
}
@Override
public PersistenceContext getPersistenceContext() {
public PersistenceContext persistenceContext() {
return persistenceContext;
}
@@ -143,7 +152,7 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public Object getOwnerId() {
public Object ownerId() {
return ownerId;
}
@@ -153,12 +162,12 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public Object getEmbeddedOwner() {
public Object embeddedOwner() {
return embeddedOwner;
}
@Override
public int getEmbeddedOwnerIndex() {
public int embeddedOwnerIndex() {
return embeddedOwnerIndex;
}
@@ -182,13 +191,13 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
public void setBeanLoader(BeanLoader beanLoader, PersistenceContext ctx) {
this.beanLoader = beanLoader;
this.persistenceContext = ctx;
this.ebeanServerName = beanLoader.getName();
this.ebeanServerName = beanLoader.name();
}
@Override
public void setBeanLoader(BeanLoader beanLoader) {
this.beanLoader = beanLoader;
this.ebeanServerName = beanLoader.getName();
this.ebeanServerName = beanLoader.name();
}
@Override
@@ -371,8 +380,7 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
@Override
public void setEmbeddedLoaded(Object embeddedBean) {
if (embeddedBean instanceof EntityBean) {
EntityBean eb = (EntityBean) embeddedBean;
eb._ebean_getIntercept().setLoaded();
((EntityBean) embeddedBean)._ebean_getIntercept().setLoaded();
}
}
@@ -392,7 +400,7 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public Object getOrigValue(int propertyIndex) {
public Object origValue(int propertyIndex) {
if ((flags[propertyIndex] & (FLAG_ORIG_VALUE_SET | FLAG_MUTABLE_HASH_SET)) == FLAG_MUTABLE_HASH_SET) {
// mutable hash set, but not ORIG_VALUE
setOriginalValue(propertyIndex, mutableInfo[propertyIndex].get());
@@ -405,7 +413,7 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
@Override
public int findProperty(String propertyName) {
String[] names = owner._ebean_getPropertyNames();
final String[] names = owner._ebean_getPropertyNames();
for (int i = 0; i < names.length; i++) {
if (names[i].equals(propertyName)) {
return i;
@@ -415,7 +423,7 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public String getProperty(int propertyIndex) {
public String property(int propertyIndex) {
if (propertyIndex == -1) {
return null;
}
@@ -423,13 +431,13 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public int getPropertyLength() {
public int propertyLength() {
return flags.length;
}
@Override
public void setPropertyLoaded(String propertyName, boolean loaded) {
int position = findProperty(propertyName);
final int position = findProperty(propertyName);
if (position == -1) {
throw new IllegalArgumentException("Property " + propertyName + " not found");
}
@@ -523,23 +531,23 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public Set<String> getLoadedPropertyNames() {
public Set<String> loadedPropertyNames() {
if (fullyLoadedBean) {
return null;
}
Set<String> props = new LinkedHashSet<>();
final Set<String> props = new LinkedHashSet<>();
for (int i = 0; i < flags.length; i++) {
if ((flags[i] & FLAG_LOADED_PROP) != 0) {
props.add(getProperty(i));
props.add(property(i));
}
}
return props;
}
@Override
public boolean[] getDirtyProperties() {
int len = getPropertyLength();
boolean[] dirties = new boolean[len];
public boolean[] dirtyProperties() {
final int len = propertyLength();
final boolean[] dirties = new boolean[len];
for (int i = 0; i < len; i++) {
// this, or an embedded property has been changed - recurse
dirties[i] = (flags[i] & (FLAG_CHANGED_PROP + FLAG_EMBEDDED_DIRTY)) != 0;
@@ -548,31 +556,31 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public Set<String> getDirtyPropertyNames() {
Set<String> props = new LinkedHashSet<>();
public Set<String> dirtyPropertyNames() {
final Set<String> props = new LinkedHashSet<>();
addDirtyPropertyNames(props, null);
return props;
}
@Override
public void addDirtyPropertyNames(Set<String> props, String prefix) {
int len = getPropertyLength();
final int len = propertyLength();
for (int i = 0; i < len; i++) {
if (isChangedProp(i)) {
// the property has been changed on this bean
props.add((prefix == null ? getProperty(i) : prefix + getProperty(i)));
props.add((prefix == null ? property(i) : prefix + property(i)));
} else if ((flags[i] & FLAG_EMBEDDED_DIRTY) != 0) {
// an embedded property has been changed - recurse
EntityBean embeddedBean = (EntityBean) owner._ebean_getField(i);
embeddedBean._ebean_getIntercept().addDirtyPropertyNames(props, getProperty(i) + ".");
final EntityBean embeddedBean = (EntityBean) owner._ebean_getField(i);
embeddedBean._ebean_getIntercept().addDirtyPropertyNames(props, property(i) + ".");
}
}
}
@Override
public boolean hasDirtyProperty(Set<String> propertyNames) {
String[] names = owner._ebean_getPropertyNames();
int len = getPropertyLength();
final String[] names = owner._ebean_getPropertyNames();
final int len = propertyLength();
for (int i = 0; i < len; i++) {
if (isChangedProp(i)) {
if (propertyNames.contains(names[i])) {
@@ -588,46 +596,46 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public Map<String, ValuePair> getDirtyValues() {
Map<String, ValuePair> dirtyValues = new LinkedHashMap<>();
public Map<String, ValuePair> dirtyValues() {
final Map<String, ValuePair> dirtyValues = new LinkedHashMap<>();
addDirtyPropertyValues(dirtyValues, null);
return dirtyValues;
}
@Override
public void addDirtyPropertyValues(Map<String, ValuePair> dirtyValues, String prefix) {
int len = getPropertyLength();
final int len = propertyLength();
for (int i = 0; i < len; i++) {
if (isChangedProp(i)) {
// the property has been changed on this bean
String propName = (prefix == null ? getProperty(i) : prefix + getProperty(i));
Object newVal = owner._ebean_getField(i);
Object oldVal = getOrigValue(i);
final String propName = (prefix == null ? property(i) : prefix + property(i));
final Object newVal = owner._ebean_getField(i);
final Object oldVal = origValue(i);
if (notEqual(oldVal, newVal)) {
dirtyValues.put(propName, new ValuePair(newVal, oldVal));
}
} else if ((flags[i] & FLAG_EMBEDDED_DIRTY) != 0) {
// an embedded property has been changed - recurse
EntityBean embeddedBean = (EntityBean) owner._ebean_getField(i);
embeddedBean._ebean_getIntercept().addDirtyPropertyValues(dirtyValues, getProperty(i) + ".");
final EntityBean embeddedBean = (EntityBean) owner._ebean_getField(i);
embeddedBean._ebean_getIntercept().addDirtyPropertyValues(dirtyValues, property(i) + ".");
}
}
}
@Override
public void addDirtyPropertyValues(BeanDiffVisitor visitor) {
int len = getPropertyLength();
final int len = propertyLength();
for (int i = 0; i < len; i++) {
if (isChangedProp(i)) {
// the property has been changed on this bean
Object newVal = owner._ebean_getField(i);
Object oldVal = getOrigValue(i);
final Object newVal = owner._ebean_getField(i);
final Object oldVal = origValue(i);
if (notEqual(oldVal, newVal)) {
visitor.visit(i, newVal, oldVal);
}
} else if ((flags[i] & FLAG_EMBEDDED_DIRTY) != 0) {
// an embedded property has been changed - recurse
EntityBean embeddedBean = (EntityBean) owner._ebean_getField(i);
final EntityBean embeddedBean = (EntityBean) owner._ebean_getField(i);
visitor.visitPush(i);
embeddedBean._ebean_getIntercept().addDirtyPropertyValues(visitor);
visitor.visitPop();
@@ -636,8 +644,8 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public StringBuilder getDirtyPropertyKey() {
StringBuilder sb = new StringBuilder();
public StringBuilder dirtyPropertyKey() {
final StringBuilder sb = new StringBuilder();
addDirtyPropertyKey(sb);
return sb;
}
@@ -647,24 +655,23 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
if (sortOrder > 0) {
sb.append("s,");
}
int len = getPropertyLength();
final int len = propertyLength();
for (int i = 0; i < len; i++) {
if ((flags[i] & FLAG_CHANGED_PROP) != 0) { // we do not check against mutablecontent here.
sb.append(i).append(',');
} else if ((flags[i] & FLAG_EMBEDDED_DIRTY) != 0) {
// an embedded property has been changed - recurse
EntityBean embeddedBean = (EntityBean) owner._ebean_getField(i);
sb.append(i).append('[');
embeddedBean._ebean_getIntercept().addDirtyPropertyKey(sb);
((EntityBean) owner._ebean_getField(i))._ebean_getIntercept().addDirtyPropertyKey(sb);
sb.append(']');
}
}
}
@Override
public StringBuilder getLoadedPropertyKey() {
StringBuilder sb = new StringBuilder();
int len = getPropertyLength();
public StringBuilder loadedPropertyKey() {
final StringBuilder sb = new StringBuilder();
final int len = propertyLength();
for (int i = 0; i < len; i++) {
if (isLoadedProperty(i)) {
sb.append(i).append(',');
@@ -674,8 +681,8 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public boolean[] getLoaded() {
boolean[] ret = new boolean[flags.length];
public boolean[] loaded() {
final boolean[] ret = new boolean[flags.length];
for (int i = 0; i < ret.length; i++) {
ret[i] = (flags[i] & FLAG_LOADED_PROP) != 0;
}
@@ -683,13 +690,13 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public int getLazyLoadPropertyIndex() {
public int lazyLoadPropertyIndex() {
return lazyLoadProperty;
}
@Override
public String getLazyLoadProperty() {
return getProperty(lazyLoadProperty);
public String lazyLoadProperty() {
return property(lazyLoadProperty);
}
@Override
@@ -699,7 +706,7 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
if (beanLoader == null) {
final Database database = DB.byName(ebeanServerName);
if (database == null) {
throw new PersistenceException("Database [" + ebeanServerName + "] was not found?");
throw new PersistenceException(ebeanServerName == null ? "No registered default server" : "Database [" + ebeanServerName + "] is not registered");
}
// For stand alone reference bean or after deserialisation lazy load
// using the ebeanServer. Synchronise only on the bean.
@@ -727,14 +734,14 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
if (lazyLoadFailure) {
// failed when batch lazy loaded by another bean in the batch
throw new EntityNotFoundException("(Lazy) loading failed on type:" + owner.getClass().getName() + " id:" + ownerId + " - Bean has been deleted");
throw new EntityNotFoundException("(Lazy) loading failed on type:" + owner.getClass().getName() + " id:" + ownerId + " - Bean has been deleted. BeanLoader: " + beanLoader);
}
if (lazyLoadProperty == -1) {
lazyLoadProperty = loadProperty;
loader.loadBean(this);
if (lazyLoadFailure) {
// failed when lazy loading this bean
throw new EntityNotFoundException("Lazy loading failed on type:" + owner.getClass().getName() + " id:" + ownerId + " - Bean has been deleted.");
throw new EntityNotFoundException("Lazy loading failed on type:" + owner.getClass().getName() + " id:" + ownerId + " - Bean has been deleted. BeanLoader: " + beanLoader);
}
// bean should be loaded and intercepting now. setLoaded() has
// been called by the lazy loading mechanism
@@ -829,7 +836,7 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
loadBean(propertyIndex);
}
if (nodeUsageCollector != null) {
nodeUsageCollector.addUsed(getProperty(propertyIndex));
nodeUsageCollector.addUsed(property(propertyIndex));
}
}
@@ -978,7 +985,7 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public int getSortOrder() {
public int sortOrder() {
return sortOrder;
}
@@ -1007,19 +1014,19 @@ public final class InterceptReadWrite implements EntityBeanIntercept {
}
@Override
public Map<String, Exception> getLoadErrors() {
public Map<String, Exception> loadErrors() {
if (loadErrors == null) {
return Collections.emptyMap();
}
Map<String, Exception> ret = null;
int len = getPropertyLength();
int len = propertyLength();
for (int i = 0; i < len; i++) {
Exception loadError = loadErrors[i];
final Exception loadError = loadErrors[i];
if (loadError != null) {
if (ret == null) {
ret = new LinkedHashMap<>();
}
ret.put(getProperty(i), loadError);
ret.put(property(i), loadError);
}
}
return ret;
@@ -8,7 +8,6 @@ import java.util.Objects;
* <p>
* It represents a location relative to the root of an object graph and specific
* to a query and call stack hash.
* </p>
*/
public final class ObjectGraphNode implements Serializable {
@@ -17,7 +16,7 @@ public final class ObjectGraphNode implements Serializable {
/**
* Identifies the origin.
*/
private final ObjectGraphOrigin originQueryPoint;
private final ObjectGraphOrigin origin;
/**
* The path relative to the root.
@@ -28,26 +27,26 @@ public final class ObjectGraphNode implements Serializable {
* Create at a sub level.
*/
public ObjectGraphNode(ObjectGraphNode parent, String path) {
this.originQueryPoint = parent.getOriginQueryPoint();
this.path = parent.getChildPath(path);
this.origin = parent.origin();
this.path = parent.childPath(path);
}
/**
* Create an the root level.
*/
public ObjectGraphNode(ObjectGraphOrigin originQueryPoint, String path) {
this.originQueryPoint = originQueryPoint;
public ObjectGraphNode(ObjectGraphOrigin origin, String path) {
this.origin = origin;
this.path = path;
}
/**
* Return the origin query point.
*/
public ObjectGraphOrigin getOriginQueryPoint() {
return originQueryPoint;
public ObjectGraphOrigin origin() {
return origin;
}
private String getChildPath(String childPath) {
private String childPath(String childPath) {
if (path == null) {
return childPath;
} else if (childPath == null) {
@@ -60,18 +59,18 @@ public final class ObjectGraphNode implements Serializable {
/**
* Return the path relative to the root.
*/
public String getPath() {
public String path() {
return path;
}
@Override
public String toString() {
return "origin:" + originQueryPoint + " path[" + path + "]";
return "origin:" + origin + " path[" + path + "]";
}
@Override
public int hashCode() {
int hc = 92821 * originQueryPoint.hashCode();
int hc = 92821 * origin.hashCode();
hc = 92821 * hc + (path == null ? 0 : path.hashCode());
return hc;
}
@@ -87,6 +86,6 @@ public final class ObjectGraphNode implements Serializable {
ObjectGraphNode e = (ObjectGraphNode) obj;
return (Objects.equals(e.path, path))
&& e.originQueryPoint.equals(originQueryPoint);
&& e.origin.equals(origin);
}
}
@@ -28,38 +28,38 @@ public final class ObjectGraphOrigin implements Serializable {
this.callOrigin = callOrigin;
this.beanType = beanType;
this.queryHash = queryHash;
this.key = callOrigin.getOriginKey(queryHash);
this.key = callOrigin.key(queryHash);
}
/**
* The key includes the queryPlan hash and the callStack hash. This becomes
* the unique identifier for a query point.
*/
public String getKey() {
public String key() {
return key;
}
/**
* The type of bean the query is fetching.
*/
public String getBeanType() {
public String beanType() {
return beanType;
}
/**
* The call stack involved.
*/
public CallOrigin getCallOrigin() {
public CallOrigin callOrigin() {
return callOrigin;
}
public String getTopElement() {
return callOrigin.getTopElement();
public String top() {
return callOrigin.top();
}
@Override
public String toString() {
return "key[" + key + "] type[" + beanType + "] " + callOrigin.getTopElement();
return "key[" + key + "] type[" + beanType + "] " + callOrigin.top();
}
@Override
@@ -19,7 +19,7 @@ public abstract class SingleBeanLoader implements BeanLoader {
}
@Override
public String getName() {
public String name() {
return database.name();
}
@@ -1,7 +1,5 @@
package io.ebean.bean;
import io.ebean.common.BeanMap;
import java.util.Collection;
import java.util.IdentityHashMap;
import java.util.Map;
@@ -112,7 +110,7 @@ public final class ToStringBuilder {
} else {
String content = String.valueOf(value);
if (content.length() > TRIM_LENGTH) {
content = content.substring(0, TRIM_LENGTH) + " <trimmed>";
content = content.substring(0, TRIM_LENGTH) + " (trimmed)";
}
sb.append(content);
if (sb.length() >= MAX_TOTAL_CONTENT) {
@@ -6,7 +6,6 @@ import java.util.Set;
* Notification event that dependent tables have been modified.
* <p>
* This is sent to other interested servers (in the cluster).
* </p>
*/
public class ServerCacheNotification {
@@ -6,7 +6,6 @@ import io.ebean.config.DatabaseConfig;
* Plugin that provides a ServerCacheNotify implementation.
* <p>
* Is supplied this will be used to send the ServerCacheNotification event to other cluster members.
* </p>
*/
public interface ServerCacheNotifyPlugin {
@@ -29,6 +29,11 @@ public class ServerCacheStatistics {
protected long evictCount;
protected long gcCount;
protected long idleCount;
protected long ttlCount;
protected long lruCount;
@Override
public String toString() {
//noinspection StringBufferReplaceableByString
@@ -43,6 +48,10 @@ public class ServerCacheStatistics {
sb.append(" remove:").append(removeCount);
sb.append(" clear:").append(clearCount);
sb.append(" evict:").append(evictCount);
sb.append(" gc:").append(gcCount);
sb.append(" idle:").append(idleCount);
sb.append(" ttl:").append(ttlCount);
sb.append(" lru:").append(lruCount);
return sb.toString();
}
@@ -191,4 +200,37 @@ public class ServerCacheStatistics {
return evictCount;
}
/**
* Set the count of entries removed by the garbage collection.
*/
public void setGcCount(long gcCount) {
this.gcCount = gcCount;
}
/**
* Return the count of entries removed by the garbage collection.
*/
public long getGcCount() {
return gcCount;
}
public void setIdleCount(long idleCount) {
this.idleCount = idleCount;
}
public long getIdleCount() {
return idleCount;
}
public void setTtlCount(long ttlCount) {
this.ttlCount = ttlCount;
}
public long getTtlCount() {
return ttlCount;
}
public void setLruCount(long lruCount) {
this.lruCount = lruCount;
}
}
@@ -17,39 +17,28 @@ abstract class AbstractBeanCollection<E> implements BeanCollection<E> {
private static final long serialVersionUID = 3365725236140187588L;
protected final ReentrantLock lock = new ReentrantLock();
protected boolean readOnly;
protected boolean disableLazyLoad;
/**
* The Database this is associated with. (used for lazy fetch).
*/
protected transient BeanCollectionLoader loader;
protected transient ExpressionList<?> filterMany;
/**
* Flag set when registered with the batch loading context.
*/
protected boolean registeredWithLoadContext;
protected String ebeanServerName;
/**
* The owning bean (used for lazy fetch).
*/
protected EntityBean ownerBean;
/**
* The name of this property in the owning bean (used for lazy fetch).
*/
protected String propertyName;
protected ModifyHolder<E> modifyHolder;
protected ModifyListenMode modifyListenMode;
protected boolean modifyListening;
/**
@@ -70,17 +59,17 @@ abstract class AbstractBeanCollection<E> implements BeanCollection<E> {
}
@Override
public EntityBean getOwnerBean() {
public EntityBean owner() {
return ownerBean;
}
@Override
public String getPropertyName() {
public String propertyName() {
return propertyName;
}
@Override
public ExpressionList<?> getFilterMany() {
public ExpressionList<?> filterMany() {
return filterMany;
}
@@ -126,8 +115,7 @@ abstract class AbstractBeanCollection<E> implements BeanCollection<E> {
void checkReadOnly() {
if (readOnly) {
String msg = "This collection is in ReadOnly mode";
throw new IllegalStateException(msg);
throw new IllegalStateException("This collection is in ReadOnly mode");
}
}
@@ -141,7 +129,7 @@ abstract class AbstractBeanCollection<E> implements BeanCollection<E> {
}
@Override
public ModifyListenMode getModifyListening() {
public ModifyListenMode modifyListening() {
return modifyListenMode;
}
@@ -194,7 +182,7 @@ abstract class AbstractBeanCollection<E> implements BeanCollection<E> {
}
@Override
public Set<E> getModifyAdditions() {
public Set<E> modifyAdditions() {
if (modifyHolder == null) {
return null;
} else {
@@ -203,7 +191,7 @@ abstract class AbstractBeanCollection<E> implements BeanCollection<E> {
}
@Override
public Set<E> getModifyRemovals() {
public Set<E> modifyRemovals() {
if (modifyHolder == null) {
return null;
} else {
@@ -225,7 +213,7 @@ abstract class AbstractBeanCollection<E> implements BeanCollection<E> {
}
/**
* Copies all relevant properties for a clone. See {@link #getShallowCopy()}
* Copies all relevant properties for a clone. See {@link #shallowCopy()}
*/
protected void setFromOriginal(AbstractBeanCollection<E> other) {
this.disableLazyLoad = other.disableLazyLoad;
@@ -3,15 +3,10 @@ package io.ebean.common;
import io.ebean.bean.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.*;
/**
* List capable of lazy loading.
* List capable of lazy loading and modification awareness.
*/
public final class BeanList<E> extends AbstractBeanCollection<E> implements List<E>, BeanCollectionAdd {
@@ -73,7 +68,7 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
if (list == null) {
list = new ArrayList<>();
}
list.addAll((Collection<? extends E>) other.getActualDetails());
list.addAll((Collection<? extends E>) other.actualDetails());
}
@Override
@@ -150,7 +145,6 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
* Set the actual underlying list.
* <p>
* This is primarily for the deferred fetching function.
* </p>
*/
@SuppressWarnings("unchecked")
public void setActualList(List<?> list) {
@@ -160,17 +154,17 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
/**
* Return the actual underlying list.
*/
public List<E> getActualList() {
public List<E> actualList() {
return list;
}
@Override
public Collection<E> getActualDetails() {
public Collection<E> actualDetails() {
return list;
}
@Override
public Collection<?> getActualEntries() {
public Collection<?> actualEntries() {
return list;
}
@@ -206,12 +200,11 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
* Specifically obj does not need to be a BeanList but any list. This does not
* use the FindMany, fetchedMaxRows or finishedFetch properties in the equals
* test.
* </p>
*/
@Override
public boolean equals(Object obj) {
public boolean equals(Object other) {
init();
return list.equals(obj);
return list.equals(other);
}
@Override
@@ -244,40 +237,40 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
}
@Override
public boolean add(E o) {
public boolean add(E bean) {
checkReadOnly();
init();
if (modifyListening) {
if (list.add(o)) {
modifyAddition(o);
if (list.add(bean)) {
modifyAddition(bean);
return true;
} else {
return false;
}
}
return list.add(o);
return list.add(bean);
}
@Override
public boolean addAll(Collection<? extends E> c) {
public boolean addAll(Collection<? extends E> beans) {
checkReadOnly();
init();
if (modifyListening) {
// all elements in c are added (no contains checking)
getModifyHolder().modifyAdditionAll(c);
getModifyHolder().modifyAdditionAll(beans);
}
return list.addAll(c);
return list.addAll(beans);
}
@Override
public boolean addAll(int index, Collection<? extends E> c) {
public boolean addAll(int index, Collection<? extends E> beans) {
checkReadOnly();
init();
if (modifyListening) {
// all elements in c are added (no contains checking)
getModifyHolder().modifyAdditionAll(c);
getModifyHolder().modifyAdditionAll(beans);
}
return list.addAll(index, c);
return list.addAll(index, beans);
}
@Override
@@ -287,23 +280,23 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
// and fetch just the Id's
initClear();
if (modifyListening) {
for (E aList : list) {
getModifyHolder().modifyRemoval(aList);
for (E element : list) {
getModifyHolder().modifyRemoval(element);
}
}
list.clear();
}
@Override
public boolean contains(Object o) {
public boolean contains(Object bean) {
init();
return list.contains(o);
return list.contains(bean);
}
@Override
public boolean containsAll(Collection<?> c) {
public boolean containsAll(Collection<?> beans) {
init();
return list.containsAll(c);
return list.containsAll(beans);
}
@Override
@@ -313,9 +306,9 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
}
@Override
public int indexOf(Object o) {
public int indexOf(Object bean) {
init();
return list.indexOf(o);
return list.indexOf(bean);
}
@Override
@@ -327,31 +320,29 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
@Override
public Iterator<E> iterator() {
init();
if (isReadOnly()) {
if (readOnly) {
return new ReadOnlyListIterator<>(list.listIterator());
}
if (modifyListening) {
Iterator<E> it = list.iterator();
return new ModifyIterator<>(this, it);
return new ModifyIterator<>(this, list.iterator());
}
return list.iterator();
}
@Override
public int lastIndexOf(Object o) {
public int lastIndexOf(Object bean) {
init();
return list.lastIndexOf(o);
return list.lastIndexOf(bean);
}
@Override
public ListIterator<E> listIterator() {
init();
if (isReadOnly()) {
if (readOnly) {
return new ReadOnlyListIterator<>(list.listIterator());
}
if (modifyListening) {
ListIterator<E> it = list.listIterator();
return new ModifyListIterator<>(this, it);
return new ModifyListIterator<>(this, list.listIterator());
}
return list.listIterator();
}
@@ -359,12 +350,11 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
@Override
public ListIterator<E> listIterator(int index) {
init();
if (isReadOnly()) {
if (readOnly) {
return new ReadOnlyListIterator<>(list.listIterator(index));
}
if (modifyListening) {
ListIterator<E> it = list.listIterator(index);
return new ModifyListIterator<>(this, it);
return new ModifyListIterator<>(this, list.listIterator(index));
}
return list.listIterator(index);
}
@@ -389,17 +379,17 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
}
@Override
public boolean remove(Object o) {
public boolean remove(Object bean) {
checkReadOnly();
init();
if (modifyListening) {
boolean isRemove = list.remove(o);
boolean isRemove = list.remove(bean);
if (isRemove) {
modifyRemoval(o);
modifyRemoval(bean);
}
return isRemove;
}
return list.remove(o);
return list.remove(bean);
}
@Override
@@ -463,7 +453,7 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
@Override
public List<E> subList(int fromIndex, int toIndex) {
init();
if (isReadOnly()) {
if (readOnly) {
return Collections.unmodifiableList(list.subList(fromIndex, toIndex));
}
if (modifyListening) {
@@ -479,13 +469,13 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
}
@Override
public <T> T[] toArray(T[] a) {
public <T> T[] toArray(T[] array) {
init();
//noinspection SuspiciousToArrayCall
return list.toArray(a);
return list.toArray(array);
}
private static class ReadOnlyListIterator<E> implements ListIterator<E>, Serializable {
private static final class ReadOnlyListIterator<E> implements ListIterator<E>, Serializable {
private static final long serialVersionUID = 3097271091406323699L;
@@ -543,7 +533,7 @@ public final class BeanList<E> extends AbstractBeanCollection<E> implements List
}
@Override
public BeanCollection<E> getShallowCopy() {
public BeanCollection<E> shallowCopy() {
BeanList<E> copy = new BeanList<>(new CopyOnFirstWriteList<>(list));
copy.setFromOriginal(this);
return copy;
@@ -5,14 +5,10 @@ import io.ebean.bean.BeanCollectionLoader;
import io.ebean.bean.EntityBean;
import io.ebean.bean.ToStringBuilder;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.*;
/**
* Map capable of lazy loading.
* Map capable of lazy loading and modification aware.
*/
public final class BeanMap<K, E> extends AbstractBeanCollection<E> implements Map<K, E> {
@@ -71,7 +67,7 @@ public final class BeanMap<K, E> extends AbstractBeanCollection<E> implements Ma
public void loadFrom(BeanCollection<?> other) {
BeanMap<K, E> otherMap = (BeanMap<K, E>) other;
internalPutNull();
map.putAll(otherMap.getActualMap());
map.putAll(otherMap.actualMap());
}
public void internalPutNull() {
@@ -175,7 +171,7 @@ public final class BeanMap<K, E> extends AbstractBeanCollection<E> implements Ma
/**
* Return the actual underlying map.
*/
public Map<K, E> getActualMap() {
public Map<K, E> actualMap() {
return map;
}
@@ -183,7 +179,7 @@ public final class BeanMap<K, E> extends AbstractBeanCollection<E> implements Ma
* Returns the collection of beans (map values).
*/
@Override
public Collection<E> getActualDetails() {
public Collection<E> actualDetails() {
return map.values();
}
@@ -191,7 +187,7 @@ public final class BeanMap<K, E> extends AbstractBeanCollection<E> implements Ma
* Returns the map entrySet.
*/
@Override
public Collection<?> getActualEntries() {
public Collection<?> actualEntries() {
return map.entrySet();
}
@@ -247,7 +243,7 @@ public final class BeanMap<K, E> extends AbstractBeanCollection<E> implements Ma
@Override
public Set<Entry<K, E>> entrySet() {
init();
if (isReadOnly()) {
if (readOnly) {
return Collections.unmodifiableSet(map.entrySet());
}
return modifyListening ? new ModifyEntrySet<>(this, map.entrySet()) : map.entrySet();
@@ -268,7 +264,7 @@ public final class BeanMap<K, E> extends AbstractBeanCollection<E> implements Ma
@Override
public Set<K> keySet() {
init();
if (isReadOnly()) {
if (readOnly) {
return Collections.unmodifiableSet(map.keySet());
}
return modifyListening ? new ModifyKeySet<>(this, map.keySet()) : map.keySet();
@@ -339,14 +335,14 @@ public final class BeanMap<K, E> extends AbstractBeanCollection<E> implements Ma
@Override
public Collection<E> values() {
init();
if (isReadOnly()) {
if (readOnly) {
return Collections.unmodifiableCollection(map.values());
}
return modifyListening ? new ModifyCollection<>(this, map.values()) : map.values();
}
@Override
public BeanCollection<E> getShallowCopy() {
public BeanCollection<E> shallowCopy() {
BeanMap<K, E> copy = new BeanMap<>(new LinkedHashMap<>(map));
copy.setFromOriginal(this);
return copy;
@@ -9,7 +9,7 @@ import java.util.LinkedHashSet;
import java.util.Set;
/**
* Set capable of lazy loading.
* Set capable of lazy loading and modification aware.
*/
public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E>, BeanCollectionAdd {
@@ -67,7 +67,7 @@ public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E
if (set == null) {
set = new LinkedHashSet<>();
}
set.addAll((Collection<? extends E>) other.getActualDetails());
set.addAll((Collection<? extends E>) other.actualDetails());
}
@Override
@@ -155,17 +155,17 @@ public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E
/**
* Return the actual underlying set.
*/
public Set<E> getActualSet() {
public Set<E> actualSet() {
return set;
}
@Override
public Collection<E> getActualDetails() {
public Collection<E> actualDetails() {
return set;
}
@Override
public Collection<?> getActualEntries() {
public Collection<?> actualEntries() {
return set;
}
@@ -210,27 +210,27 @@ public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E
// -----------------------------------------------------//
@Override
public boolean add(E o) {
public boolean add(E bean) {
checkReadOnly();
init();
if (modifyListening) {
if (set.add(o)) {
modifyAddition(o);
if (set.add(bean)) {
modifyAddition(bean);
return true;
} else {
return false;
}
}
return set.add(o);
return set.add(bean);
}
@Override
public boolean addAll(Collection<? extends E> addCollection) {
public boolean addAll(Collection<? extends E> beans) {
checkReadOnly();
init();
if (modifyListening) {
boolean changed = false;
for (E bean : addCollection) {
for (E bean : beans) {
if (set.add(bean)) {
// register the addition of the bean
modifyAddition(bean);
@@ -239,7 +239,7 @@ public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E
}
return changed;
}
return set.addAll(addCollection);
return set.addAll(beans);
}
@Override
@@ -255,15 +255,15 @@ public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E
}
@Override
public boolean contains(Object o) {
public boolean contains(Object bean) {
init();
return set.contains(o);
return set.contains(bean);
}
@Override
public boolean containsAll(Collection<?> c) {
public boolean containsAll(Collection<?> beans) {
init();
return set.containsAll(c);
return set.containsAll(beans);
}
@Override
@@ -275,7 +275,7 @@ public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E
@Override
public Iterator<E> iterator() {
init();
if (isReadOnly()) {
if (readOnly) {
return new ReadOnlyIterator<>(set.iterator());
}
if (modifyListening) {
@@ -285,17 +285,17 @@ public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E
}
@Override
public boolean remove(Object o) {
public boolean remove(Object bean) {
checkReadOnly();
init();
if (modifyListening) {
if (set.remove(o)) {
modifyRemoval(o);
if (set.remove(bean)) {
modifyRemoval(bean);
return true;
}
return false;
}
return set.remove(o);
return set.remove(bean);
}
@Override
@@ -349,13 +349,13 @@ public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E
}
@Override
public <T> T[] toArray(T[] a) {
public <T> T[] toArray(T[] array) {
init();
//noinspection SuspiciousToArrayCall
return set.toArray(a);
return set.toArray(array);
}
private static class ReadOnlyIterator<E> implements Iterator<E>, Serializable {
private static final class ReadOnlyIterator<E> implements Iterator<E>, Serializable {
private static final long serialVersionUID = 2577697326745352605L;
@@ -382,7 +382,7 @@ public final class BeanSet<E> extends AbstractBeanCollection<E> implements Set<E
}
@Override
public BeanCollection<E> getShallowCopy() {
public BeanCollection<E> shallowCopy() {
BeanSet<E> copy = new BeanSet<>(new LinkedHashSet<>(set));
copy.setFromOriginal(this);
return copy;
@@ -237,7 +237,7 @@ public abstract class AbstractNamingConvention implements NamingConvention {
}
buffer.append(rhsTableName);
int maxTableNameLength = databasePlatform.getMaxTableNameLength();
int maxTableNameLength = databasePlatform.maxTableNameLength();
// maxConstraintNameLength is used as the max table name length.
if (buffer.length() > maxTableNameLength) {
@@ -6,6 +6,10 @@ import java.util.concurrent.Callable;
* BackgroundExecutorWrapper that can be used to wrap tasks that are sent to background (i.e. another thread).
* It should copy all necessary thread-local variables. See {@link MdcBackgroundExecutorWrapper} for implementation details.
*
* Note: only tasks that are executed immediately (submit, execute) are wrapped. Periodic or scheduled tasks are not wrapped,
* as these may keep copied variables in memory either forever or until the scheduled task is finished.
* The caller is responsible to handle these cases.
*
* @author Roland Praml, FOCONIS AG
*/
public interface BackgroundExecutorWrapper {
@@ -16,6 +16,7 @@ import io.ebean.event.changelog.ChangeLogPrepare;
import io.ebean.event.changelog.ChangeLogRegister;
import io.ebean.event.readaudit.ReadAuditLogger;
import io.ebean.event.readaudit.ReadAuditPrepare;
import io.ebean.meta.MetricNamingMatch;
import io.ebean.util.StringHelper;
import javax.persistence.EnumType;
@@ -24,19 +25,18 @@ import java.time.Clock;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
/**
* The configuration used for creating a Database.
* <p>
* Used to programmatically construct an Database and optionally register it
* with the DB singleton.
* </p>
* <p>
* If you just use DB thout this programmatic configuration Ebean will read
* the application.properties file and take the configuration from there. This usually
* includes searching the class path and automatically registering any entity
* classes and listeners etc.
* </p>
* <pre>{@code
*
* DatabaseConfig config = new DatabaseConfig();
@@ -56,7 +56,6 @@ import java.util.*;
* <p>
* Note that DatabaseConfigProvider provides a standard Java ServiceLoader mechanism that can
* be used to apply configuration to the DatabaseConfig.
* </p>
*
* @author emcgreal
* @author rbygrave
@@ -115,19 +114,19 @@ public class DatabaseConfig {
private TenantCatalogProvider tenantCatalogProvider;
/**
* When true will load entity classes via ModuleInfoLoader.
* When true will load entity classes via EntityClassRegister.
* <p>
* NB: ModuleInfoLoader implementations are generated by querybean generator.
* NB: EntityClassRegister implementations are generated by querybean generator.
* Having this on and registering entity classes means we don't need to manually
* write that code or use classpath scanning to find entity classes.
*/
private boolean loadModuleInfo = true;
/**
* List of interesting classes such as entities, embedded, ScalarTypes,
* Listeners, Finders, Controllers etc.
* Interesting classes such as entities, embedded, ScalarTypes,
* Listeners, Finders, Controllers, AttributeConverters etc.
*/
private List<Class<?>> classes = new ArrayList<>();
private Set<Class<?>> classes = new HashSet<>();
/**
* The packages that are searched for interesting classes. Only used when
@@ -527,11 +526,6 @@ public class DatabaseConfig {
private ProfilingConfig profilingConfig = new ProfilingConfig();
/**
* Controls the default order by id setting of queries. See {@link Query#orderById(boolean)}
*/
private boolean defaultOrderById;
/**
* The mappingLocations for searching xml mapping.
*/
@@ -546,6 +540,8 @@ public class DatabaseConfig {
private String dumpMetricsOptions;
private Function<String, String> metricNaming = MetricNamingMatch.INSTANCE;
/**
* Construct a Database Configuration for programmatically creating an Database.
*/
@@ -594,24 +590,8 @@ public class DatabaseConfig {
this.slowQueryListener = slowQueryListener;
}
/**
* Deprecated - look to have explicit order by. Sets the default orderById setting for queries.
*/
@Deprecated
public void setDefaultOrderById(boolean defaultOrderById) {
this.defaultOrderById = defaultOrderById;
}
/**
* Returns the default orderById setting for queries.
*/
public boolean isDefaultOrderById() {
return defaultOrderById;
}
/**
* Put a service object into configuration such that it can be passed to a plugin.
* Put a service object into configuration such that it can be used by ebean or a plugin.
* <p>
* For example, put IgniteConfiguration in to be passed to the Ignite plugin.
*/
@@ -619,6 +599,23 @@ public class DatabaseConfig {
serviceObject.put(key, configObject);
}
/**
* Put a service object into configuration such that it can be used by ebean or a plugin.
* <p>
* For example, put IgniteConfiguration in to be passed to the Ignite plugin.
* You can also override some SPI objects that should be used for that Database. Currently, the following
* objects are possible.
* <ul>
* <li>DataSourceAlertFactory (e.g. add different alert factories for different ebean instances)</li>
* <li>DocStoreFactory</li>
* <li>SlowQueryListener (e.g. add custom query listener for a certain ebean instance)</li>
* <li>ServerCacheNotifyPlugin</li>
* </ul>
*/
public <T> void putServiceObject(Class<T> iface, T configObject) {
serviceObject.put(serviceObjectKey(iface), configObject);
}
/**
* Return the service object given the key.
*/
@@ -627,7 +624,7 @@ public class DatabaseConfig {
}
/**
* Put a service object into configuration such that it can be passed to a plugin.
* Put a service object into configuration such that it can be used by ebean or a plugin.
*
* <pre>{@code
*
@@ -652,7 +649,7 @@ public class DatabaseConfig {
}
/**
* Used by plugins to obtain service objects.
* Used by ebean or plugins to obtain service objects.
*
* <pre>{@code
*
@@ -2302,19 +2299,15 @@ public class DatabaseConfig {
}
/**
* Programmatically add classes (typically entities) that this server should
* use.
* Programmatically add classes (typically entities) that this server should use.
* <p>
* The class can be an Entity, Embedded type, ScalarType, BeanPersistListener,
* BeanFinder or BeanPersistController.
* <p>
* If no classes are specified then the classes are found automatically via
* searching the class path.
* <p>
* Alternatively the classes can be added via {@link #setClasses(List)}.
*
* @param cls the entity type (or other type) that should be registered by this
* database.
* @param cls the entity type (or other type) that should be registered by this database.
*/
public void addClass(Class<?> cls) {
classes.add(cls);
@@ -2323,7 +2316,7 @@ public class DatabaseConfig {
/**
* Register all the classes (typically entity classes).
*/
public void addAll(List<Class<?>> classList) {
public void addAll(Collection<Class<?>> classList) {
if (classList != null && !classList.isEmpty()) {
classes.addAll(classList);
}
@@ -2365,15 +2358,26 @@ public class DatabaseConfig {
* <p>
* Alternatively the classes can contain added via {@link #addClass(Class)}.
*/
public void setClasses(List<Class<?>> classes) {
this.classes = classes;
public void setClasses(Collection<Class<?>> classes) {
this.classes = new HashSet<>(classes);
}
/**
* Return the classes registered for this database. Typically this includes
* Return the classes registered for this database. Typically, this includes
* entities and perhaps listeners.
*/
public List<Class<?>> getClasses() {
public Set<Class<?>> classes() {
return classes;
}
/**
* Deprecated - migrate to classes().
* <p>
* Sorry if returning Set rather than List breaks code but it feels safer to
* do that than a subtle change to return a shallow copy which you will not detect.
*/
@Deprecated
public Set<Class<?>> getClasses() {
return classes;
}
@@ -2742,8 +2746,6 @@ public class DatabaseConfig {
this.classLoadConfig = classLoadConfig;
}
/**
* Load settings from application.properties, application.yaml and other sources.
* <p>
@@ -2888,7 +2890,7 @@ public class DatabaseConfig {
serverCachePlugin = p.createInstance(ServerCachePlugin.class, "serverCachePlugin", serverCachePlugin);
String packagesProp = p.get("search.packages", p.get("packages", null));
packages = getSearchList(packagesProp, packages);
packages = searchList(packagesProp, packages);
skipCacheAfterWrite = p.getBoolean("skipCacheAfterWrite", skipCacheAfterWrite);
updateAllPropertiesInBatch = p.getBoolean("updateAllPropertiesInBatch", updateAllPropertiesInBatch);
@@ -2917,7 +2919,6 @@ public class DatabaseConfig {
jdbcFetchSizeFindEach = p.getInt("jdbcFetchSizeFindEach", jdbcFetchSizeFindEach);
jdbcFetchSizeFindList = p.getInt("jdbcFetchSizeFindList", jdbcFetchSizeFindList);
databasePlatformName = p.get("databasePlatformName", databasePlatformName);
defaultOrderById = p.getBoolean("defaultOrderById", defaultOrderById);
uuidVersion = p.getEnum(UuidVersion.class, "uuidVersion", uuidVersion);
uuidStateFile = p.get("uuidStateFile", uuidStateFile);
@@ -2964,10 +2965,10 @@ public class DatabaseConfig {
tenantCatalogProvider = p.createInstance(TenantCatalogProvider.class, "tenant.catalogProvider", tenantCatalogProvider);
tenantSchemaProvider = p.createInstance(TenantSchemaProvider.class, "tenant.schemaProvider", tenantSchemaProvider);
tenantPartitionColumn = p.get("tenant.partitionColumn", tenantPartitionColumn);
classes = getClasses(p);
classes = readClasses(p);
String mappingsProp = p.get("mappingLocations", null);
mappingLocations = getSearchList(mappingsProp, mappingLocations);
mappingLocations = searchList(mappingsProp, mappingLocations);
}
private NamingConvention createNamingConvention(PropertiesWrapper properties, NamingConvention namingConvention) {
@@ -2981,13 +2982,13 @@ public class DatabaseConfig {
* @param properties the properties
* @return the classes
*/
private List<Class<?>> getClasses(PropertiesWrapper properties) {
private Set<Class<?>> readClasses(PropertiesWrapper properties) {
String classNames = properties.get("classes", null);
if (classNames == null) {
return classes;
}
List<Class<?>> classList = new ArrayList<>();
Set<Class<?>> classList = new HashSet<>();
String[] split = StringHelper.splitNames(classNames);
for (String cn : split) {
if (!"class".equalsIgnoreCase(cn)) {
@@ -3002,7 +3003,7 @@ public class DatabaseConfig {
return classList;
}
private List<String> getSearchList(String searchNames, List<String> defaultValue) {
private List<String> searchList(String searchNames, List<String> defaultValue) {
if (searchNames != null) {
String[] entries = StringHelper.splitNames(searchNames);
List<String> hitList = new ArrayList<>(entries.length);
@@ -3020,7 +3021,7 @@ public class DatabaseConfig {
public PersistBatch appliedPersistBatchOnCascade() {
if (persistBatchOnCascade == PersistBatch.INHERIT) {
// use the platform default (ALL except SQL Server which has NONE)
return databasePlatform.getPersistBatchOnCascade();
return databasePlatform.persistBatchOnCascade();
}
return persistBatchOnCascade;
}
@@ -3376,13 +3377,21 @@ public class DatabaseConfig {
}
/**
* Return true if entity classes should be loaded and registered via ModuleInfoLoader.
* Return true if entity classes should be loaded and registered via EntityClassRegister.
* <p>
* When false we either register entity classes via application code or use classpath
* scanning to find and register entity classes.
*/
public boolean isLoadModuleInfo() {
return loadModuleInfo;
}
/**
* Deprecated - migrate to isLoadModuleInfo().
*/
@Deprecated
public boolean isAutoLoadModuleInfo() {
return loadModuleInfo && classes.isEmpty();
return loadModuleInfo;
}
/**
@@ -3396,6 +3405,20 @@ public class DatabaseConfig {
this.loadModuleInfo = loadModuleInfo;
}
/**
* Return the naming convention to apply to metrics names.
*/
public Function<String, String> getMetricNaming() {
return metricNaming;
}
/**
* Set the naming convention to apply to metrics names.
*/
public void setMetricNaming(Function<String, String> metricNaming) {
this.metricNaming = metricNaming;
}
public enum UuidVersion {
VERSION4,
VERSION1,
@@ -5,7 +5,7 @@ import java.util.List;
/**
* Loads and returns entity classes to register with Ebean databases.
*/
public interface ModuleInfoLoader {
public interface EntityClassRegister {
/**
* Return entity classes to register for a named DB (not default DB).
@@ -1,20 +1,16 @@
package io.ebean.platform.db2;
package io.ebean.config.dbplatform;
import io.ebean.config.dbplatform.SqlLimitRequest;
import io.ebean.config.dbplatform.SqlLimitResponse;
import io.ebean.config.dbplatform.SqlLimiter;
public class Db2SqlLimiter implements SqlLimiter {
public final class AnsiSqlRowsLimiter implements SqlLimiter {
@Override
public SqlLimitResponse limit(SqlLimitRequest request) {
StringBuilder sb = new StringBuilder(512);
String dbSql = request.getDbSql();
StringBuilder sb = new StringBuilder(50 + dbSql.length());
sb.append("select ");
if (request.isDistinct()) {
sb.append("distinct ");
}
sb.append(request.getDbSql());
sb.append(dbSql);
int firstRow = request.getFirstRow();
if (firstRow > 0) {
sb.append(" offset ").append(firstRow).append(" rows");
@@ -23,7 +19,6 @@ public class Db2SqlLimiter implements SqlLimiter {
if (maxRows > 0) {
sb.append(" fetch next ").append(maxRows).append(" rows only");
}
String sql = request.getDbPlatform().completeSql(sb.toString(), request.getOrmQuery());
return new SqlLimitResponse(sql);
}
@@ -1,49 +1,26 @@
package io.ebean.config.dbplatform;
import io.ebean.BackgroundExecutor;
import io.ebean.EbeanVersion;
import io.ebean.Query;
import io.ebean.annotation.PartitionMode;
import io.ebean.annotation.PersistBatch;
import io.ebean.annotation.Platform;
import io.ebean.config.CustomDbTypeMapping;
import io.ebean.config.PlatformConfig;
import io.ebean.util.JdbcClose;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.PersistenceException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.sql.*;
import static java.lang.System.Logger.Level.*;
/**
* Database platform specific settings.
*/
public class DatabasePlatform {
private static final Logger log = LoggerFactory.getLogger("io.ebean");
/**
* Behavior used when ending a query only transaction (at read committed isolation level).
*/
public enum OnQueryOnly {
/**
* Rollback the transaction.
*/
ROLLBACK,
/**
* Commit the transaction
*/
COMMIT
}
private static final System.Logger log = EbeanVersion.log;
/**
* Set to true for MySql, no other jdbc drivers need this workaround.
@@ -60,16 +37,11 @@ public class DatabasePlatform {
* Can we use native java time API objects in
* {@link ResultSet#getObject(int, Class)} and
* {@link PreparedStatement#setObject(int, Object)}.
*
* <p>
* Not all drivers (DB2 e.g.) will support this.
*/
protected boolean supportsNativeJavaTime = true;
/**
* The behaviour used when ending a read only transaction at read committed isolation level.
*/
protected OnQueryOnly onQueryOnly = OnQueryOnly.COMMIT;
/**
* The open quote used by quoted identifiers.
*/
@@ -146,11 +118,6 @@ public class DatabasePlatform {
*/
protected int clobDbType = Types.CLOB;
/**
* For Oracle treat empty strings as null.
*/
protected boolean treatEmptyStringsAsNull;
/**
* The database platform name.
*/
@@ -165,7 +132,7 @@ public class DatabasePlatform {
* want to use quoted identifiers for. The backticks get converted to the
* appropriate characters in convertQuotedIdentifiers
*/
private static final char[] QUOTED_IDENTIFIERS = new char[] { '"', '\'', '[', ']', '`' };
private static final char[] QUOTED_IDENTIFIERS = new char[]{'"', '\'', '[', ']', '`'};
/**
* The non-escaped like clause (to stop slash being escaped on some platforms).
@@ -299,7 +266,7 @@ public class DatabasePlatform {
/**
* Return the platform key.
*/
public Platform getPlatform() {
public Platform platform() {
return platform;
}
@@ -309,14 +276,14 @@ public class DatabasePlatform {
* "generic" is returned when no specific database platform has been set or found.
* </p>
*/
public String getName() {
public String name() {
return platform.name().toLowerCase();
}
/**
* Return true if we are using Sequence batch mode rather than STEP.
*/
public boolean isSequenceBatchMode() {
public boolean sequenceBatchMode() {
return sequenceBatchMode;
}
@@ -330,52 +297,52 @@ public class DatabasePlatform {
/**
* Return true if this database platform supports native ILIKE expression.
*/
public boolean isSupportsNativeIlike() {
public boolean supportsNativeIlike() {
return supportsNativeIlike;
}
/**
* Return true if the platform supports delete statements with table alias.
*/
public boolean isSupportsDeleteTableAlias() {
public boolean supportsDeleteTableAlias() {
return supportsDeleteTableAlias;
}
/**
* Return true if the collation is case sensitive.
* Return true if the collation is case-sensitive.
* <p>
* This is expected to be used for testing only.
* </p>
*/
public boolean isCaseSensitiveCollation() {
public boolean caseSensitiveCollation() {
return caseSensitiveCollation;
}
/**
* Return true if the platform supports SavepointId values.
*/
public boolean isSupportsSavepointId() {
public boolean supportsSavepointId() {
return supportsSavepointId;
}
/**
* Return true if migrations should use stored procedures.
*/
public boolean isUseMigrationStoredProcedures() {
public boolean useMigrationStoredProcedures() {
return useMigrationStoredProcedures;
}
/**
* Return true if the platform supports LIMIT with sql update.
*/
public boolean isInlineSqlUpdateLimit() {
public boolean inlineSqlUpdateLimit() {
return inlineSqlUpdateLimit;
}
/**
* Return the maximum number of bind values this database platform allows or zero for no limit.
*/
public int getMaxInBinding() {
public int maxInBinding() {
return maxInBinding;
}
@@ -385,14 +352,14 @@ public class DatabasePlatform {
* This is used when deriving names of intersection tables.
* </p>
*/
public int getMaxTableNameLength() {
public int maxTableNameLength() {
return maxTableNameLength;
}
/**
* Return the maximum constraint name allowed for the platform.
*/
public int getMaxConstraintNameLength() {
public int maxConstraintNameLength() {
return maxConstraintNameLength;
}
@@ -420,24 +387,10 @@ public class DatabasePlatform {
return null;
}
/**
* Return the behaviour to use when ending a read only transaction.
*/
public OnQueryOnly getOnQueryOnly() {
return onQueryOnly;
}
/**
* Set the behaviour to use when ending a read only transaction.
*/
public void setOnQueryOnly(OnQueryOnly onQueryOnly) {
this.onQueryOnly = onQueryOnly;
}
/**
* Return the DbEncrypt handler for this DB platform.
*/
public DbEncrypt getDbEncrypt() {
public DbEncrypt dbEncrypt() {
return dbEncrypt;
}
@@ -451,7 +404,7 @@ public class DatabasePlatform {
/**
* Return the history support for this database platform.
*/
public DbHistorySupport getHistorySupport() {
public DbHistorySupport historySupport() {
return historySupport;
}
@@ -465,14 +418,14 @@ public class DatabasePlatform {
/**
* So no except for Postgres and CockroachDB.
*/
public boolean isNativeArrayType() {
public boolean nativeArrayType() {
return false;
}
/**
* Return true if the DB supports native UUID.
*/
public boolean isNativeUuidType() {
public boolean nativeUuidType() {
return nativeUuidType;
}
@@ -481,21 +434,21 @@ public class DatabasePlatform {
*
* @return the db type map
*/
public DbPlatformTypeMapping getDbTypeMap() {
public DbPlatformTypeMapping dbTypeMap() {
return dbTypeMap;
}
/**
* Return the mapping for DB column default values.
*/
public DbDefaultValue getDbDefaultValue() {
public DbDefaultValue dbDefaultValue() {
return dbDefaultValue;
}
/**
* Return the column alias prefix.
*/
public String getColumnAliasPrefix() {
public String columnAliasPrefix() {
return columnAliasPrefix;
}
@@ -509,21 +462,21 @@ public class DatabasePlatform {
/**
* Return the close quote for quoted identifiers.
*/
public String getCloseQuote() {
public String closeQuote() {
return closeQuote;
}
/**
* Return the open quote for quoted identifiers.
*/
public String getOpenQuote() {
public String openQuote() {
return openQuote;
}
/**
* Return the JDBC type used to store booleans.
*/
public int getBooleanDbType() {
public int booleanDbType() {
return booleanDbType;
}
@@ -534,7 +487,7 @@ public class DatabasePlatform {
* example.
* </p>
*/
public int getBlobDbType() {
public int blobDbType() {
return blobDbType;
}
@@ -544,25 +497,16 @@ public class DatabasePlatform {
* This is typically Types.CLOB but for Postgres is Types.VARCHAR.
* </p>
*/
public int getClobDbType() {
public int clobDbType() {
return clobDbType;
}
/**
* Return true if empty strings should be treated as null.
*
* @return true, if checks if is treat empty strings as null
*/
public boolean isTreatEmptyStringsAsNull() {
return treatEmptyStringsAsNull;
}
/**
* Return true if a compound ID in (...) type expression needs to be in
* expanded form of (a=? and b=?) or (a=? and b=?) or ... rather than (a,b) in
* ((?,?),(?,?),...);
*/
public boolean isIdInExpandedForm() {
public boolean idInExpandedForm() {
return idInExpandedForm;
}
@@ -573,7 +517,7 @@ public class DatabasePlatform {
* This specifically is required for MySql when processing large results.
* </p>
*/
public boolean isForwardOnlyHintOnFindIterate() {
public boolean forwardOnlyHintOnFindIterate() {
return forwardOnlyHintOnFindIterate;
}
@@ -591,7 +535,7 @@ public class DatabasePlatform {
* This specifically is required for Hana which doesn't support CONCUR_UPDATABLE
* </p>
*/
public boolean isSupportsResultSetConcurrencyModeUpdatable() {
public boolean supportsResultSetConcurrencyModeUpdatable() {
return supportsResultSetConcurrencyModeUpdatable;
}
@@ -611,7 +555,7 @@ public class DatabasePlatform {
*
* @return the db identity
*/
public DbIdentity getDbIdentity() {
public DbIdentity dbIdentity() {
return dbIdentity;
}
@@ -624,14 +568,14 @@ public class DatabasePlatform {
*
* @return the sql limiter
*/
public SqlLimiter getSqlLimiter() {
public SqlLimiter sqlLimiter() {
return sqlLimiter;
}
/**
* Return the BasicSqlLimiter for limit/offset of SqlQuery queries.
*/
public BasicSqlLimiter getBasicSqlLimiter() {
public BasicSqlLimiter basicSqlLimiter() {
return basicSqlLimiter;
}
@@ -666,7 +610,7 @@ public class DatabasePlatform {
if (isQuote(dbName.charAt(dbName.length() - 1))) {
return openQuote + dbName.substring(1, dbName.length() - 1) + closeQuote;
} else {
log.error("Missing backquote on [" + dbName + "]");
log.log(ERROR, "Missing backquote on [" + dbName + "]");
}
} else if (allQuotedIdentifiers) {
return openQuote + dbName + closeQuote;
@@ -676,8 +620,8 @@ public class DatabasePlatform {
}
private boolean isQuote(char ch) {
for (char identifer : QUOTED_IDENTIFIERS) {
if (identifer == ch) {
for (char identifier : QUOTED_IDENTIFIERS) {
if (identifier == ch) {
return true;
}
}
@@ -700,14 +644,14 @@ public class DatabasePlatform {
/**
* Set to true if select count against anonymous view requires an alias.
*/
public boolean isSelectCountWithAlias() {
public boolean selectCountWithAlias() {
return selectCountWithAlias;
}
/**
* Return true if select count with subquery needs column alias (SQL Server).
*/
public boolean isSelectCountWithColumnAlias() {
public boolean selectCountWithColumnAlias() {
return selectCountWithColumnAlias;
}
@@ -729,7 +673,7 @@ public class DatabasePlatform {
protected String withForUpdate(String sql, Query.LockWait lockWait, Query.LockType lockType) {
// silently assume the database does not support the "for update" clause.
log.info("it seems your database does not support the 'for update' clause");
log.log(INFO, "it seems your database does not support the ''for update'' clause");
return sql;
}
@@ -738,14 +682,14 @@ public class DatabasePlatform {
* <p>
* This may include an escape clause to disable a default escape character.
*/
public String getLikeClause(boolean rawLikeExpression) {
public String likeClause(boolean rawLikeExpression) {
return rawLikeExpression ? likeClauseRaw : likeClauseEscaped;
}
/**
* Return the platform default JDBC batch mode for persist cascade.
*/
public PersistBatch getPersistBatchOnCascade() {
public PersistBatch persistBatchOnCascade() {
return persistBatchOnCascade;
}
@@ -763,7 +707,7 @@ public class DatabasePlatform {
if (!schemaExists(dbSchema, connection)) {
Statement query = connection.createStatement();
try {
log.debug("create schema:{}", dbSchema);
log.log(DEBUG, "create schema:{0}", dbSchema);
query.executeUpdate("create schema " + dbSchema);
} finally {
JdbcClose.close(query);
@@ -789,33 +733,6 @@ public class DatabasePlatform {
return false;
}
/**
* Return true if the table exists.
*/
public boolean tableExists(Connection connection, String catalog, String schema, String table) throws SQLException {
DatabaseMetaData metaData = connection.getMetaData();
ResultSet tables = metaData.getTables(catalog, schema, table, null);
try {
return tables.next();
} finally {
JdbcClose.close(tables);
}
}
/**
* Return true if partitions exist for the given table.
*/
public boolean tablePartitionsExist(Connection connection, String table) throws SQLException {
return true;
}
/**
* Return the SQL to create an initial partition for the given table.
*/
public String tablePartitionInit(String tableName, PartitionMode mode, String property, String singlePrimaryKey) {
return null;
}
/**
* Escapes the like string for this DB-Platform
*/
@@ -3,42 +3,25 @@ package io.ebean.config.dbplatform;
/**
* Adds LIMIT OFFSET clauses to a SQL query.
*/
public class LimitOffsetSqlLimiter implements SqlLimiter {
/**
* LIMIT keyword.
*/
private static final String LIMIT = "limit";
/**
* OFFSET keyword.
*/
private static final String OFFSET = "offset";
public final class LimitOffsetSqlLimiter implements SqlLimiter {
@Override
public SqlLimitResponse limit(SqlLimitRequest request) {
String dbSql = request.getDbSql();
StringBuilder sb = new StringBuilder(50 + dbSql.length());
sb.append("select ");
if (request.isDistinct()) {
sb.append("distinct ");
}
sb.append(dbSql);
int firstRow = request.getFirstRow();
int maxRows = request.getMaxRows();
if (maxRows > 0 || firstRow > 0) {
sb.append(" ").append(LIMIT).append(" ").append(maxRows);
if (firstRow > 0) {
sb.append(" ").append(OFFSET).append(" ");
sb.append(firstRow);
}
if (maxRows > 0) {
sb.append(" limit ").append(maxRows);
}
int firstRow = request.getFirstRow();
if (firstRow > 0) {
sb.append(" offset ").append(firstRow);
}
String sql = request.getDbPlatform().completeSql(sb.toString(), request.getOrmQuery());
return new SqlLimitResponse(sql);
}
@@ -1,10 +1,9 @@
package io.ebean.config.dbplatform;
import io.avaje.applog.AppLog;
import io.ebean.BackgroundExecutor;
import io.ebean.Transaction;
import io.ebean.util.JdbcClose;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.PersistenceException;
import javax.sql.DataSource;
@@ -19,12 +18,15 @@ import java.util.TreeSet;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.System.Logger.Level.DEBUG;
import static java.lang.System.Logger.Level.ERROR;
/**
* Database sequence based IdGenerator.
*/
public abstract class SequenceIdGenerator implements PlatformIdGenerator {
protected static final Logger log = LoggerFactory.getLogger("io.ebean.SEQ");
protected static final System.Logger log = AppLog.getLogger("io.ebean.SEQ");
private final ReentrantLock lock = new ReentrantLock();
protected final String seqName;
@@ -120,7 +122,7 @@ public abstract class SequenceIdGenerator implements PlatformIdGenerator {
protected void loadInBackground(final int requestSize) {
if (currentlyBackgroundLoading.get()) {
// skip as already background loading
log.debug("... skip background sequence load (another load in progress)");
log.log(DEBUG, "... skip background sequence load (another load in progress)");
return;
}
currentlyBackgroundLoading.set(true);
@@ -152,9 +154,6 @@ public abstract class SequenceIdGenerator implements PlatformIdGenerator {
resultSet = statement.executeQuery();
List<Long> newIds = readIds(resultSet, requestSize);
if (log.isTraceEnabled()) {
log.trace("seq:{} loaded:{} sql:{}", seqName, newIds.size(), sql);
}
if (newIds.isEmpty()) {
throw new PersistenceException("Always expecting more than 1 row from " + sql);
}
@@ -164,7 +163,7 @@ public abstract class SequenceIdGenerator implements PlatformIdGenerator {
} catch (SQLException e) {
if (e.getMessage().contains("Database is already closed")) {
String msg = "Error getting SEQ when DB shutting down " + e.getMessage();
log.error(msg);
log.log(ERROR, msg);
System.out.println(msg);
return Collections.emptyList();
} else {
@@ -32,7 +32,12 @@ public class SqlCodeTranslator implements SqlExceptionTranslator {
}
private DataErrorType getErrorType(SQLException e) {
DataErrorType errorType = map.get(e.getSQLState());
String sqlState = e.getSQLState();
while (sqlState == null && e.getCause() instanceof SQLException) {
e = (SQLException)e.getCause();
sqlState = e.getSQLState();
}
DataErrorType errorType = map.get(sqlState);
if (errorType == null) {
// fall back to error code
errorType = map.get(String.valueOf(e.getErrorCode()));
@@ -5,14 +5,6 @@ package io.ebean.config.dbplatform;
*/
public interface SqlLimiter {
/**
* the new line character used.
* <p>
* Note that this is removed for logging sql to the transaction log.
* </p>
*/
char NEW_LINE = '\n';
/**
* Add the SQL limiting statements around the query.
*/
@@ -1,9 +1,8 @@
package io.ebean.event;
import io.ebean.Database;
import io.ebean.EbeanVersion;
import io.ebean.service.SpiContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Driver;
import java.sql.DriverManager;
@@ -13,6 +12,8 @@ import java.util.Enumeration;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.System.Logger.Level.*;
/**
* Manages the shutdown of Ebean.
* <p>
@@ -20,13 +21,14 @@ import java.util.concurrent.locks.ReentrantLock;
*/
public final class ShutdownManager {
private static final Logger log = LoggerFactory.getLogger("io.ebean");
private static final System.Logger log = EbeanVersion.log;
private static final ReentrantLock lock = new ReentrantLock();
private static final List<Database> databases = new ArrayList<>();
private static final ShutdownHook shutdownHook = new ShutdownHook();
private static boolean stopping;
private static SpiContainer container;
static {
// Register the Shutdown hook
registerShutdownHook();
@@ -120,9 +122,7 @@ public final class ShutdownManager {
// Already run shutdown...
return;
}
if (log.isDebugEnabled()) {
log.debug("Ebean shutting down");
}
log.log(DEBUG, "Ebean shutting down");
stopping = true;
deregisterShutdownHook();
@@ -133,7 +133,7 @@ public final class ShutdownManager {
Runnable r = (Runnable) ClassUtil.newInstance(shutdownRunner);
r.run();
} catch (Exception e) {
log.error("Error running custom shutdown runnable", e);
log.log(ERROR, "Error running custom shutdown runnable", e);
}
}
@@ -143,11 +143,11 @@ public final class ShutdownManager {
}
// shutdown any registered servers that have not
// already been shutdown manually
for (Database server : databases) {
for (Database server : new ArrayList<>(databases)) {
try {
server.shutdown();
} catch (Exception ex) {
log.error("Error executing shutdown runnable", ex);
log.log(ERROR, "Error executing shutdown runnable", ex);
ex.printStackTrace();
}
}
@@ -165,10 +165,10 @@ public final class ShutdownManager {
while (drivers.hasMoreElements()) {
Driver driver = drivers.nextElement();
try {
log.info("De-registering jdbc driver: " + driver);
log.log(INFO, "De-registering jdbc driver: " + driver);
DriverManager.deregisterDriver(driver);
} catch (SQLException e) {
log.error("Error de-registering driver " + driver, e);
log.log(ERROR, "Error de-registering driver " + driver, e);
}
}
}
@@ -204,6 +204,7 @@ public final class ShutdownManager {
private ShutdownHook() {
super("EbeanHook");
}
@Override
public void run() {
ShutdownManager.shutdown();
@@ -2,28 +2,57 @@ package io.ebean.meta;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
/**
* A simple MetricVisitor that can collect the desired metrics into lists.
*/
public class BasicMetricVisitor extends AbstractMetricVisitor implements ServerMetrics {
private final String name;
private final Function<String,String> naming;
private final List<MetaTimedMetric> timed = new ArrayList<>();
private final List<MetaQueryMetric> query = new ArrayList<>();
private final List<MetaCountMetric> count = new ArrayList<>();
public BasicMetricVisitor() {
this("db", MetricNamingMatch.INSTANCE);
}
/**
* Construct to reset and collect everything.
*/
public BasicMetricVisitor() {
super(true, true, true, true);
public BasicMetricVisitor(String name, Function<String,String> naming) {
this(name, naming, true, true, true, true);
}
/**
* Construct specifying reset and what to collect.
*/
public BasicMetricVisitor(boolean reset, boolean collectTransactionMetrics, boolean collectQueryMetrics, boolean collectL2Metrics) {
public BasicMetricVisitor(String name, Function<String,String> naming, boolean reset, boolean collectTransactionMetrics, boolean collectQueryMetrics, boolean collectL2Metrics) {
super(reset, collectTransactionMetrics, collectQueryMetrics, collectL2Metrics);
this.name = name;
this.naming = naming;
}
@Override
public String name() {
return name;
}
@Override
public Function<String, String> namingConvention() {
return naming;
}
@Override
public ServerMetricsAsJson asJson() {
return new MetricsAsJson(this);
}
@Override
public List<MetricData> asData() {
return new MetricsAsData(this).data();
}
@Override
@@ -16,23 +16,6 @@ public interface MetaInfoManager {
*/
ServerMetrics collectMetrics();
/**
* Collect the metrics in raw JSON form.
* <pre>{@code
*
* String metricsJson = database.getMetaInfoManager()
* .collectMetricsAsJson()
* .json();
*
* }</pre>
*/
ServerMetricsAsJson collectMetricsAsJson();
/**
* Return the metrics as a list of MetricData.
*/
List<MetricData> collectMetricsAsData();
/**
* Visit the metrics resetting and collecting/reporting as desired.
*/
@@ -2,6 +2,8 @@ package io.ebean.meta;
import io.ebean.ProfileLocation;
import java.time.Instant;
/**
* Meta data for captured query plan.
*/
@@ -51,4 +53,14 @@ public interface MetaQueryPlan {
* Return the total count of times bind capture has occurred.
*/
long captureCount();
/**
* Return the time taken to capture this plan in microseconds.
*/
long captureMicros();
/**
* Return the instant when the bind values were captured.
*/
Instant whenCaptured();
}
@@ -0,0 +1,16 @@
package io.ebean.meta;
import java.util.function.Function;
/**
* Metric naming convention that is exact match.
*/
public final class MetricNamingMatch implements Function<String, String> {
public static final Function<String, String> INSTANCE = new MetricNamingMatch();
@Override
public String apply(String name) {
return name;
}
}
@@ -1,10 +1,17 @@
package io.ebean.meta;
import java.util.function.Function;
/**
* Defines visitor to read and report the transaction and query metrics.
*/
public interface MetricVisitor {
/**
* Return the naming convention that should be applied to the reported metric names.
*/
Function<String, String> namingConvention();
/**
* Return true if the metrics should be reset.
*/
@@ -1,12 +1,4 @@
package io.ebeaninternal.server.core;
import io.ebean.Database;
import io.ebean.meta.MetaCountMetric;
import io.ebean.meta.MetaMetric;
import io.ebean.meta.MetaQueryMetric;
import io.ebean.meta.MetaTimedMetric;
import io.ebean.meta.MetricData;
import io.ebean.meta.ServerMetrics;
package io.ebean.meta;
import java.util.ArrayList;
import java.util.List;
@@ -14,34 +6,26 @@ import java.util.List;
/**
* Dump the metrics into a list of MetricData.
*/
final class DumpMetricsData {
final class MetricsAsData {
private final Database database;
private final ServerMetrics metrics;
private final List<MetricData> list = new ArrayList<>();
DumpMetricsData(Database database) {
this.database = database;
MetricsAsData(ServerMetrics metrics) {
this.metrics = metrics;
}
List<MetricData> data() {
collect(database.metaInfo().collectMetrics());
return list;
}
private void collect(ServerMetrics serverMetrics) {
final List<MetaTimedMetric> timedMetrics = serverMetrics.timedMetrics();
final List<MetaCountMetric> countMetrics = serverMetrics.countMetrics();
final List<MetaQueryMetric> queryMetrics = serverMetrics.queryMetrics();
for (MetaTimedMetric metric : timedMetrics) {
for (MetaTimedMetric metric : metrics.timedMetrics()) {
add(metric);
}
for (MetaCountMetric metric : countMetrics) {
for (MetaCountMetric metric : metrics.countMetrics()) {
addCount(metric);
}
for (MetaQueryMetric metric : queryMetrics) {
for (MetaQueryMetric metric : metrics.queryMetrics()) {
addQuery(metric);
}
return list;
}
private MetricData create(MetaMetric metric) {
@@ -1,25 +1,16 @@
package io.ebeaninternal.server.core;
import io.ebean.Database;
import io.ebean.meta.MetaCountMetric;
import io.ebean.meta.MetaMetric;
import io.ebean.meta.MetaQueryMetric;
import io.ebean.meta.MetaTimedMetric;
import io.ebean.meta.ServerMetrics;
import io.ebean.meta.ServerMetricsAsJson;
import io.ebean.meta.SortMetric;
package io.ebean.meta;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Comparator;
import java.util.List;
final class DumpMetricsJson implements ServerMetricsAsJson {
final class MetricsAsJson implements ServerMetricsAsJson {
private final Database database;
private final ServerMetrics metrics;
private Appendable writer;
/**
* By default include sql and location attributes for the initial collection only.
* By default, include sql and location attributes for the initial collection only.
*/
private int includeExtraAttributes = 1;
private boolean withHeader = true;
@@ -29,8 +20,8 @@ final class DumpMetricsJson implements ServerMetricsAsJson {
private int listCounter;
private int objKeyCounter;
DumpMetricsJson(Database database) {
this.database = database;
MetricsAsJson(ServerMetrics metrics) {
this.metrics = metrics;
}
@Override
@@ -66,24 +57,24 @@ final class DumpMetricsJson implements ServerMetricsAsJson {
@Override
public String json() {
writer = new StringWriter();
collect(database.metaInfo().collectMetrics());
collect();
return writer.toString();
}
@Override
public void write(Appendable buffer) {
writer = buffer;
collect(database.metaInfo().collectMetrics());
collect();
}
private void collect(ServerMetrics serverMetrics) {
private void collect() {
try {
start();
for (MetaTimedMetric metric : serverMetrics.timedMetrics()) {
for (MetaTimedMetric metric : metrics.timedMetrics()) {
logTimed(metric);
}
List<MetaCountMetric> countMetrics = serverMetrics.countMetrics();
List<MetaCountMetric> countMetrics = metrics.countMetrics();
if (!countMetrics.isEmpty()) {
if (sortBy != null) {
countMetrics.sort(SortMetric.COUNT_NAME);
@@ -93,7 +84,7 @@ final class DumpMetricsJson implements ServerMetricsAsJson {
}
}
List<MetaQueryMetric> queryMetrics = serverMetrics.queryMetrics();
List<MetaQueryMetric> queryMetrics = metrics.queryMetrics();
if (!queryMetrics.isEmpty()) {
if (sortBy != null) {
queryMetrics.sort(sortBy);
@@ -112,7 +103,7 @@ final class DumpMetricsJson implements ServerMetricsAsJson {
if (withHeader) {
objStart();
key("db");
val(database.name());
val(metrics.name());
key("metrics");
listStart();
}
@@ -7,6 +7,21 @@ import java.util.List;
*/
public interface ServerMetrics {
/**
* Return the name of the database these metrics were obtained for.
*/
String name();
/**
* Return ServerMetricsAsJson to build the metrics as JSON content.
*/
ServerMetricsAsJson asJson();
/**
* Return the metrics as a list of MetricData.
*/
List<MetricData> asData();
/**
* Return timed metrics for Transactions, labelled SqlQuery, labelled SqlUpdate.
*/
@@ -39,18 +39,6 @@ public interface ExpressionPath {
*/
StringParser stringParser();
/**
* For DateTime capable scalar types convert the long systemTimeMillis into
* an appropriate java time (Date,Timestamp,Time,Calendar, JODA type etc).
*/
Object parseDateTime(long systemTimeMillis);
/**
* Return true if the last type is "DateTime capable" - can support
* {@link #parseDateTime(long)}.
*/
boolean isDateTimeCapable();
/**
* Return the underlying JDBC type or 0 if this is not a scalar type.
*/
@@ -13,9 +13,16 @@ public interface SpiProfileLocationFactory {
ProfileLocation create();
/**
* Create a profile location with a line number.
* Create a profile location with line numbering.
*/
ProfileLocation create(int lineNumber, String label);
ProfileLocation createWithLine();
/**
* Create with a given label - used only with {@code @Transaction}.
*
* @param label the label for the transaction
*/
ProfileLocation create(String label);
/**
* Create a known location.
@@ -6,6 +6,7 @@ package io.ebean.text;
* Basic interface to support CSV, JSON and XML processing.
* </p>
*/
@FunctionalInterface
public interface StringFormatter {
/**
@@ -5,6 +5,7 @@ package io.ebean.text;
* <p>
* Basic interface to support CSV, JSON and XML processing.
*/
@FunctionalInterface
public interface StringParser {
/**
@@ -1,55 +0,0 @@
package io.ebean.text;
import java.sql.Time;
/**
* Parser for TIME types that supports both HH:mm:ss and HH:mm.
*/
public final class TimeStringParser implements StringParser {
private static final TimeStringParser SHARED = new TimeStringParser();
/**
* Return a shared instance as this is thread safe.
*/
public static TimeStringParser get() {
return SHARED;
}
/**
* Parse the String supporting both HH:mm:ss and HH:mm formats.
*/
@Override
@SuppressWarnings("deprecation")
public Object parse(String value) {
if (value == null || value.trim().isEmpty()) {
return null;
}
String s = value.trim();
int firstColon = s.indexOf(':');
if (firstColon == -1) {
throw new java.lang.IllegalArgumentException("No ':' in value [" + s + "]");
}
try {
int second;
int minute;
int hour = Integer.parseInt(s.substring(0, firstColon));
int secondColon = s.indexOf(':', firstColon + 1);
if (secondColon == -1) {
minute = Integer.parseInt(s.substring(firstColon + 1, s.length()));
second = 0;
} else {
minute = Integer.parseInt(s.substring(firstColon + 1, secondColon));
second = Integer.parseInt(s.substring(secondColon + 1));
}
return new Time(hour, minute, second);
} catch (NumberFormatException e) {
throw new java.lang.IllegalArgumentException("Number format Error parsing time [" + s + "] " + e.getMessage(), e);
}
}
}
@@ -1,78 +0,0 @@
package io.ebean.text.csv;
import io.ebean.Database;
/**
* Provides callback methods for customisation of CSV processing.
* <p>
* You can provide your own CsvCallback implementation to customise the CSV
* processing. It is expected that the DefaultCsvCallback provides a good base
* class that you can extend.
*/
public interface CsvCallback<T> {
/**
* The processing is about to begin.
* <p>
* Typically the callback will create a transaction, set batch mode, batch
* size etc.
* </p>
*/
void begin(Database database);
/**
* Read the header row.
* <p>
* This is only called if {@link CsvReader#setHasHeader(boolean, boolean)} has
* been set to true.
* </p>
*
* @param line the header line content.
*/
void readHeader(String[] line);
/**
* Check that the row should be processed - return true to process the row or
* false to ignore the row. Gives ability to handle bad data... empty rows etc
* and ignore it rather than fail.
*/
boolean processLine(int row, String[] line);
/**
* Called for each bean after it has been loaded from the CSV content.
* <p>
* This allows you to process the bean however you like.
* </p>
* <p>
* When you use a CsvCallback the CsvReader *WILL NOT* create a transaction
* and will not save the bean for you. You have complete control and must do
* these things yourself (if that is want you want).
* </p>
*
* @param row the index of the content being processed
* @param line the content that has been used to load the bean
* @param bean the entity bean after it has been loaded from the csv content
*/
void processBean(int row, String[] line, T bean);
/**
* The processing has ended successfully.
* <p>
* Typically the callback will commit the transaction.
* </p>
*/
void end(int row);
/**
* The processing has ended due to an error.
* <p>
* This gives the callback the opportunity to rollback the transaction if one
* was created.
* </p>
*
* @param row the row that the error has occurred on
* @param e the error that occurred
*/
void endWithError(int row, Exception e);
}
@@ -1,171 +0,0 @@
package io.ebean.text.csv;
import io.ebean.text.StringParser;
import java.io.Reader;
import java.util.Locale;
/**
* Reads CSV data turning it into object graphs that you can be saved (inserted)
* or processed yourself.
* <p>
* This first example doesn't use a {@link CsvCallback} and this means it will
* automatically create a transaction, save the customers and commit the
* transaction when successful.
* </p>
*
* <pre>{@code
* try {
* File f = new File("src/test/resources/test1.csv");
*
* FileReader reader = new FileReader(f, encoding);
*
* CsvReader<Customer> csvReader = DB.createCsvReader(Customer.class);
*
* csvReader.setPersistBatchSize(20);
*
* csvReader.addProperty("status");
* // ignore the next property
* csvReader.addIgnore();
* csvReader.addProperty("name");
* csvReader.addDateTime("anniversary", "dd-MMM-yyyy");
* csvReader.addProperty("billingAddress.line1");
* csvReader.addProperty("billingAddress.city");
*
* csvReader.process(reader);
*
* } catch (Exception e) {
* throw new RuntimeException(e);
* }
* }</pre>
*
* @param <T> the entity bean type
*/
public interface CsvReader<T> {
/**
* Explicitly set the default Locale.
*/
void setDefaultLocale(Locale defaultLocale);
/**
* Set the default format to use for Time types.
*/
void setDefaultTimeFormat(String defaultTimeFormat);
/**
* Set the default format to use for Date types.
*/
void setDefaultDateFormat(String defaultDateFormat);
/**
* Set the default format to use for Timestamp types.
*/
void setDefaultTimestampFormat(String defaultTimestampFormat);
/**
* Set the batch size for using JDBC statement batching.
* <p>
* By default this is set to 20 and setting this to 1 will disable the use of
* JDBC statement batching.
* </p>
*/
void setPersistBatchSize(int persistBatchSize);
/**
* Set to true if there is a header row that should be ignored.
* <p>
* If addPropertiesFromHeader is true then all the properties are added using
* the default time,date and timestamp formats.
* <p>
* If you have a mix of dateTime formats you can not use this method and must
* add the properties yourself.
* </p>
*/
void setHasHeader(boolean hasHeader, boolean addPropertiesFromHeader);
/**
* Same as setHasHeader(true,true);
* <p>
* This will use a header to define all the properties to load using the
* default formats for time, date and datetime types.
* </p>
*/
void setAddPropertiesFromHeader();
/**
* Same as setHasHeader(true, false);
* <p>
* This indicates that there is a header but that it should be ignored.
* </p>
*/
void setIgnoreHeader();
/**
* Set the frequency with which a INFO message will be logged showing the
* progress of the processing. You might set this to 1000 or 10000 etc.
* <p>
* If this is not set then no INFO messages will be logged.
* </p>
*/
void setLogInfoFrequency(int logInfoFrequency);
/**
* Ignore the next column of data.
*/
void addIgnore();
/**
* Define the property which will be loaded from the next column of data.
* <p>
* This takes into account the data type of the property and handles the
* String to object conversion automatically.
* </p>
*/
void addProperty(String propertyName);
/**
* Define the next property and use a custom StringParser to convert the
* string content into the appropriate type for the property.
*/
void addProperty(String propertyName, StringParser parser);
/**
* Add a property with a custom Date/Time/Timestamp format using the default
* Locale. This will convert the string into the appropriate java type for the
* given property (Date, Calendar, SQL Date, Time, Timestamp, JODA etc).
*/
void addDateTime(String propertyName, String dateTimeFormat);
/**
* Add a property with a custom Date/Time/Timestamp format. This will convert
* the string into the appropriate java type for the given property (Date,
* Calendar, SQL Date, Time, Timestamp, JODA etc).
*/
void addDateTime(String propertyName, String dateTimeFormat, Locale locale);
/**
* Automatically create a transaction if required to process all the CSV
* content from the reader.
* <p>
* This will check for a current transaction. If there is no current
* transaction then one is started and will commit (or rollback) at the end of
* processing. This will also set the persistBatchSize on the transaction.
* </p>
*/
void process(Reader reader) throws Exception;
/**
* Process the CSV content passing the bean to the CsvCallback after each row.
* <p>
* This provides you with the ability to modify and process the bean.
* </p>
* <p>
* When using a CsvCallback the reader WILL NOT create a transaction or save
* the bean(s) for you. If you want to insert the processed beans you must
* create your own transaction and save the bean(s) yourself.
* </p>
*/
void process(Reader reader, CsvCallback<T> callback) throws Exception;
}
@@ -1,198 +0,0 @@
package io.ebean.text.csv;
import io.ebean.Database;
import io.ebean.Transaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Provides the default implementation of CsvCallback.
* <p>
* This handles transaction creation (if no current transaction existed) and
* transaction commit or rollback on error.
* </p>
* <p>
* For customising the processing you can extend this object and override the
* appropriate methods.
* </p>
*
* @param <T>
*/
public class DefaultCsvCallback<T> implements CsvCallback<T> {
private static final Logger log = LoggerFactory.getLogger(DefaultCsvCallback.class);
/**
* The transaction to use (if not using CsvCallback).
*/
protected Transaction transaction;
/**
* Flag set when we created the transaction.
*/
protected boolean createdTransaction;
/**
* The EbeanServer used to save the beans.
*/
protected Database server;
/**
* Used to log a message to indicate progress through large files.
*/
protected final int logInfoFrequency;
/**
* The batch size used when saving the beans.
*/
protected final int persistBatchSize;
/**
* The time the process started.
*/
protected long startTime;
/**
* The execution time of the process.
*/
protected long exeTime;
/**
* Construct with a default batch size of 30 and logging info messages every
* 1000 rows.
*/
public DefaultCsvCallback() {
this(30, 1000);
}
/**
* Construct with explicit batch size and logging info frequency.
*/
public DefaultCsvCallback(int persistBatchSize, int logInfoFrequency) {
this.persistBatchSize = persistBatchSize;
this.logInfoFrequency = logInfoFrequency;
}
/**
* Create a transaction if required.
*/
@Override
public void begin(Database server) {
this.server = server;
this.startTime = System.currentTimeMillis();
initTransactionIfRequired();
}
/**
* Override to read the heading line.
* <p>
* This is only called if {@link CsvReader#setHasHeader(boolean, boolean)} is
* set to true.
* <p>
* By default this does nothing (effectively ignoring the heading).
*/
@Override
public void readHeader(String[] line) {
}
/**
* Validate that the content is valid and return false if the row should be
* ignored.
* <p>
* By default this just returns true.
* </p>
* <p>
* Override this to add custom validation logic returning false if you want
* the row to be ignored. For example, if all the content is empty return
* false to ignore the row (rather than having the processing fail with some
* error).
* </p>
*/
@Override
public boolean processLine(int row, String[] line) {
return true;
}
/**
* Will save the bean.
* <p>
* Override this method to customise the bean (set additional properties etc)
* or to control the saving of other related beans (when you can't/don't want
* to use Cascade.PERSIST etc).
* </p>
*/
@Override
public void processBean(int row, String[] line, T bean) {
// assumes single bean or Cascade.PERSIST will save any
// related beans (e.g. customer -> customer.billingAddress
server.save(bean, transaction);
if (logInfoFrequency > 0 && (row % logInfoFrequency == 0)) {
log.debug("processed {} rows", row);
}
}
/**
* Commit the transaction if one was created.
*/
@Override
public void end(int row) {
commitTransactionIfCreated();
exeTime = System.currentTimeMillis() - startTime;
log.info("Csv finished, rows[{}] exeMillis[{}]", row, exeTime);
}
/**
* Rollback the transaction if one was created.
*/
@Override
public void endWithError(int row, Exception e) {
rollbackTransactionIfCreated(e);
}
/**
* Create a transaction if one is not already active and set its batch mode
* and batch size.
*/
protected void initTransactionIfRequired() {
transaction = server.currentTransaction();
if (transaction == null || !transaction.isActive()) {
transaction = server.beginTransaction();
createdTransaction = true;
if (persistBatchSize > 1) {
log.debug("Creating transaction, batchSize[{}]", persistBatchSize);
transaction.setBatchMode(true);
transaction.setBatchSize(persistBatchSize);
transaction.setGetGeneratedKeys(false);
} else {
// explicitly turn off JDBC batching in case
// is has been turned on globally
transaction.setBatchMode(false);
log.debug("Creating transaction with no JDBC batching");
}
}
}
/**
* If we created a transaction commit it. We have successfully processed all
* the rows.
*/
protected void commitTransactionIfCreated() {
if (createdTransaction) {
transaction.commit();
log.debug("Committed transaction");
}
}
/**
* Rollback the transaction if we where not successful in processing all the
* rows.
*/
protected void rollbackTransactionIfCreated(Throwable e) {
if (createdTransaction) {
transaction.rollback(e);
log.debug("Rolled back transaction");
}
}
}
@@ -1,4 +0,0 @@
/**
* CSV processing objects.
*/
package io.ebean.text.csv;
@@ -1,19 +1,20 @@
package io.ebean.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.ebean.EbeanVersion;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import static java.lang.System.Logger.Level.WARNING;
/**
* Utility for closing raw Jdbc resources.
*/
public final class JdbcClose {
private static final Logger log = LoggerFactory.getLogger("io.ebean");
private static final System.Logger log = EbeanVersion.log;
/**
* Close the resultSet logging if an error occurs.
@@ -24,7 +25,7 @@ public final class JdbcClose {
statement.close();
}
} catch (SQLException e) {
log.warn("Error closing statement", e);
log.log(WARNING, "Error closing statement", e);
}
}
@@ -37,7 +38,7 @@ public final class JdbcClose {
resultSet.close();
}
} catch (SQLException e) {
log.warn("Error closing resultSet", e);
log.log(WARNING, "Error closing resultSet", e);
}
}
@@ -50,7 +51,7 @@ public final class JdbcClose {
connection.close();
}
} catch (SQLException e) {
log.warn("Error closing connection", e);
log.log(WARNING, "Error closing connection", e);
}
}
@@ -63,7 +64,7 @@ public final class JdbcClose {
connection.rollback();
}
} catch (SQLException e) {
log.warn("Error on connection rollback", e);
log.log(WARNING, "Error on connection rollback", e);
}
}
@@ -76,7 +77,7 @@ public final class JdbcClose {
stmt.cancel();
}
} catch (SQLException e) {
log.warn("Error on cancelling statement", e);
log.log(WARNING, "Error on cancelling statement", e);
}
}
}

Some files were not shown because too many files have changed in this diff Show More