From ee1b19d3f6eb8c07405ee6783379d4c2c20ad8c8 Mon Sep 17 00:00:00 2001 From: sboikov Date: Wed, 26 Apr 2017 14:18:01 +0300 Subject: [PATCH] ignite-1794 Refactored hibernate modules, switched to hibernate 5.1 --- assembly/dependencies-fabric.xml | 5 +- examples/pom-standalone-lgpl.xml | 2 +- examples/pom-standalone.xml | 2 +- examples/pom.xml | 38 +- .../hibernate/HibernateL2CacheExample.java | 12 +- .../{hibernate => hibernate-4.2}/README.txt | 2 +- .../licenses/apache-2.0.txt | 0 modules/{hibernate => hibernate-4.2}/pom.xml | 17 +- ...HibernateAbstractRegionAccessStrategy.java | 16 +- .../hibernate/HibernateCollectionRegion.java | 2 +- .../hibernate/HibernateEntityRegion.java | 4 +- .../hibernate/HibernateGeneralDataRegion.java | 9 +- .../cache/hibernate/HibernateKeyWrapper.java | 3 +- .../hibernate/HibernateNaturalIdRegion.java | 9 +- .../HibernateQueryResultsRegion.java | 4 +- .../cache/hibernate/HibernateRegion.java | 2 +- .../hibernate/HibernateRegionFactory.java | 167 +--- .../hibernate/HibernateTimestampsRegion.java | 0 .../HibernateTransactionalDataRegion.java | 35 +- .../ignite/cache/hibernate/package-info.java | 0 .../hibernate/CacheHibernateBlobStore.java | 0 .../CacheHibernateBlobStoreEntry.hbm.xml | 0 .../CacheHibernateBlobStoreEntry.java | 0 .../CacheHibernateBlobStoreFactory.java | 0 .../CacheHibernateStoreSessionListener.java | 0 .../cache/store/hibernate/package-info.java | 0 .../src/test/config/factory-cache.xml | 0 .../src/test/config/factory-cache1.xml | 0 .../config/factory-incorrect-store-cache.xml | 0 ...HibernateL2CacheConfigurationSelfTest.java | 13 +- .../HibernateL2CacheMultiJvmTest.java | 440 ++++++++++ .../hibernate/HibernateL2CacheSelfTest.java | 45 +- ...HibernateL2CacheTransactionalSelfTest.java | 0 ...teL2CacheTransactionalUseSyncSelfTest.java | 0 ...acheHibernateBlobStoreNodeRestartTest.java | 0 .../CacheHibernateBlobStoreSelfTest.java | 8 +- .../CacheHibernateStoreFactorySelfTest.java | 17 +- ...HibernateStoreSessionListenerSelfTest.java | 0 .../cache/store/hibernate/hibernate.cfg.xml | 0 .../cache/store/hibernate/package-info.java | 0 .../IgniteBinaryHibernateTestSuite.java | 0 .../testsuites/IgniteHibernateTestSuite.java | 0 .../{hibernate5 => hibernate-5.1}/README.txt | 2 +- .../licenses/apache-2.0.txt | 0 modules/{hibernate5 => hibernate-5.1}/pom.xml | 17 +- ...HibernateAbstractRegionAccessStrategy.java | 26 +- .../hibernate/HibernateCollectionRegion.java | 0 .../hibernate/HibernateEntityRegion.java | 13 +- .../hibernate/HibernateGeneralDataRegion.java | 21 +- .../cache/hibernate/HibernateKeyWrapper.java | 3 +- .../hibernate/HibernateNaturalIdRegion.java | 14 +- .../HibernateQueryResultsRegion.java | 0 .../cache/hibernate/HibernateRegion.java | 0 .../hibernate/HibernateRegionFactory.java | 168 ++++ .../hibernate/HibernateTimestampsRegion.java | 0 .../HibernateTransactionalDataRegion.java | 35 +- .../ignite/cache/hibernate/package-info.java | 0 .../hibernate/CacheHibernateBlobStore.java | 5 +- .../CacheHibernateBlobStoreEntry.hbm.xml | 0 .../CacheHibernateBlobStoreEntry.java | 0 .../CacheHibernateBlobStoreFactory.java | 0 .../CacheHibernateStoreSessionListener.java | 5 +- .../cache/store/hibernate/package-info.java | 0 .../src/test/config/factory-cache.xml | 0 .../src/test/config/factory-cache1.xml | 0 .../config/factory-incorrect-store-cache.xml | 0 ...HibernateL2CacheConfigurationSelfTest.java | 14 +- .../HibernateL2CacheMultiJvmTest.java | 429 ++++++++++ .../hibernate/HibernateL2CacheSelfTest.java | 56 +- ...HibernateL2CacheTransactionalSelfTest.java | 0 ...teL2CacheTransactionalUseSyncSelfTest.java | 0 ...acheHibernateBlobStoreNodeRestartTest.java | 0 .../CacheHibernateBlobStoreSelfTest.java | 11 +- .../CacheHibernateStoreFactorySelfTest.java | 82 +- ...HibernateStoreSessionListenerSelfTest.java | 5 +- .../cache/store/hibernate/hibernate.cfg.xml | 0 .../cache/store/hibernate/package-info.java | 0 .../IgniteBinaryHibernate5TestSuite.java | 0 .../testsuites/IgniteHibernate5TestSuite.java | 0 modules/hibernate-core/pom.xml | 76 ++ .../HibernateAccessStrategyAdapter.java | 151 ++-- .../HibernateAccessStrategyFactory.java | 235 +++++ .../cache/hibernate/HibernateCacheProxy.java | 2 +- .../HibernateExceptionConverter.java} | 15 +- .../hibernate/HibernateKeyTransformer.java | 1 + .../HibernateNonStrictAccessStrategy.java | 50 +- .../HibernateReadOnlyAccessStrategy.java | 34 +- .../HibernateReadWriteAccessStrategy.java | 50 +- .../HibernateTransactionalAccessStrategy.java | 42 +- .../ignite/cache/hibernate/package-info.java | 24 + .../HibernateAccessStrategyAdapter.java | 379 --------- .../HibernateReadOnlyAccessStrategy.java | 107 --- .../HibernateTransactionalAccessStrategy.java | 141 --- .../cache/hibernate/HibernateCacheProxy.java | 801 ------------------ .../HibernateNonStrictAccessStrategy.java | 222 ----- .../HibernateReadWriteAccessStrategy.java | 328 ------- .../hibernate/HibernateRegionFactory.java | 255 ------ .../src/main/resources/features.xml | 2 +- pom.xml | 9 +- 99 files changed, 1831 insertions(+), 2851 deletions(-) rename modules/{hibernate => hibernate-4.2}/README.txt (96%) rename modules/{hibernate => hibernate-4.2}/licenses/apache-2.0.txt (100%) rename modules/{hibernate => hibernate-4.2}/pom.xml (90%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java (91%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java (98%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java (96%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java (89%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java (96%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java (93%) rename modules/{hibernate5 => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java (93%) rename modules/{hibernate5 => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java (95%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java (51%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/HibernateTimestampsRegion.java (100%) rename modules/{hibernate5 => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java (57%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/hibernate/package-info.java (100%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java (100%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.hbm.xml (100%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.java (100%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreFactory.java (100%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java (100%) rename modules/{hibernate => hibernate-4.2}/src/main/java/org/apache/ignite/cache/store/hibernate/package-info.java (100%) rename modules/{hibernate => hibernate-4.2}/src/test/config/factory-cache.xml (100%) rename modules/{hibernate => hibernate-4.2}/src/test/config/factory-cache1.xml (100%) rename modules/{hibernate => hibernate-4.2}/src/test/config/factory-incorrect-store-cache.xml (100%) rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java (95%) create mode 100644 modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java (97%) rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalSelfTest.java (100%) rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalUseSyncSelfTest.java (100%) rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreNodeRestartTest.java (100%) rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java (90%) rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java (93%) rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java (100%) rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml (100%) rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/cache/store/hibernate/package-info.java (100%) rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/testsuites/IgniteBinaryHibernateTestSuite.java (100%) rename modules/{hibernate => hibernate-4.2}/src/test/java/org/apache/ignite/testsuites/IgniteHibernateTestSuite.java (100%) rename modules/{hibernate5 => hibernate-5.1}/README.txt (96%) rename modules/{hibernate5 => hibernate-5.1}/licenses/apache-2.0.txt (100%) rename modules/{hibernate5 => hibernate-5.1}/pom.xml (90%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java (71%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java (100%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java (85%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java (77%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java (97%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java (84%) rename modules/{hibernate => hibernate-5.1}/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java (100%) rename modules/{hibernate => hibernate-5.1}/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java (100%) create mode 100644 modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/hibernate/HibernateTimestampsRegion.java (100%) rename modules/{hibernate => hibernate-5.1}/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java (57%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/hibernate/package-info.java (100%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java (98%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.hbm.xml (100%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.java (100%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreFactory.java (100%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java (97%) rename modules/{hibernate5 => hibernate-5.1}/src/main/java/org/apache/ignite/cache/store/hibernate/package-info.java (100%) rename modules/{hibernate5 => hibernate-5.1}/src/test/config/factory-cache.xml (100%) rename modules/{hibernate5 => hibernate-5.1}/src/test/config/factory-cache1.xml (100%) rename modules/{hibernate5 => hibernate-5.1}/src/test/config/factory-incorrect-store-cache.xml (100%) rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java (94%) create mode 100644 modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java (97%) rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalSelfTest.java (100%) rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalUseSyncSelfTest.java (100%) rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreNodeRestartTest.java (100%) rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java (86%) rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java (76%) rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java (96%) rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml (100%) rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/cache/store/hibernate/package-info.java (100%) rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/testsuites/IgniteBinaryHibernate5TestSuite.java (100%) rename modules/{hibernate5 => hibernate-5.1}/src/test/java/org/apache/ignite/testsuites/IgniteHibernate5TestSuite.java (100%) create mode 100644 modules/hibernate-core/pom.xml rename modules/{hibernate5 => hibernate-core}/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyAdapter.java (64%) create mode 100644 modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyFactory.java rename modules/{hibernate => hibernate-core}/src/main/java/org/apache/ignite/cache/hibernate/HibernateCacheProxy.java (99%) rename modules/{hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyTransformer.java => hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateExceptionConverter.java} (63%) rename modules/{hibernate => hibernate-core}/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyTransformer.java (97%) rename modules/{hibernate => hibernate-core}/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java (81%) rename modules/{hibernate5 => hibernate-core}/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadOnlyAccessStrategy.java (72%) rename modules/{hibernate => hibernate-core}/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadWriteAccessStrategy.java (82%) rename modules/{hibernate5 => hibernate-core}/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalAccessStrategy.java (72%) create mode 100644 modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/package-info.java delete mode 100644 modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyAdapter.java delete mode 100644 modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadOnlyAccessStrategy.java delete mode 100644 modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalAccessStrategy.java delete mode 100644 modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateCacheProxy.java delete mode 100644 modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java delete mode 100644 modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadWriteAccessStrategy.java delete mode 100644 modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java diff --git a/assembly/dependencies-fabric.xml b/assembly/dependencies-fabric.xml index 23a1731b26c28..be68d0aeb0994 100644 --- a/assembly/dependencies-fabric.xml +++ b/assembly/dependencies-fabric.xml @@ -127,8 +127,9 @@ org.apache.ignite:ignite-hadoop org.apache.ignite:ignite-codegen org.apache.ignite:ignite-apache-license-gen - org.apache.ignite:ignite-hibernate - org.apache.ignite:ignite-hibernate5 + org.apache.ignite:ignite-hibernate-core + org.apache.ignite:ignite-hibernate_4.2 + org.apache.ignite:ignite-hibernate_5.1 org.apache.ignite:ignite-schedule org.apache.ignite:ignite-geospatial org.apache.ignite:ignite-appserver-test diff --git a/examples/pom-standalone-lgpl.xml b/examples/pom-standalone-lgpl.xml index 5fbb4ea477bd8..4798d0335a728 100644 --- a/examples/pom-standalone-lgpl.xml +++ b/examples/pom-standalone-lgpl.xml @@ -191,7 +191,7 @@ org.apache.ignite - ignite-hibernate + ignite-hibernate_5.1 to_be_replaced_by_ignite_version diff --git a/examples/pom-standalone.xml b/examples/pom-standalone.xml index 0183563781c00..e74082c2f4a5c 100644 --- a/examples/pom-standalone.xml +++ b/examples/pom-standalone.xml @@ -192,7 +192,7 @@ org.apache.ignite - ignite-hibernate + ignite-hibernate_5.1 to_be_replaced_by_ignite_version diff --git a/examples/pom.xml b/examples/pom.xml index 895519b76de3b..26f653d88e941 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -62,24 +62,6 @@ ${project.version} - - org.apache.ignite - ignite-hibernate - ${project.version} - - - - org.apache.ignite - ignite-schedule - ${project.version} - - - - org.apache.ignite - ignite-geospatial - ${project.version} - - org.apache.ignite ignite-spring-data @@ -288,6 +270,26 @@ src/main/java-lgpl src/test/java-lgpl + + + + org.apache.ignite + ignite-hibernate_5.1 + ${project.version} + + + + org.apache.ignite + ignite-schedule + ${project.version} + + + + org.apache.ignite + ignite-geospatial + ${project.version} + + diff --git a/examples/src/main/java-lgpl/org/apache/ignite/examples/datagrid/hibernate/HibernateL2CacheExample.java b/examples/src/main/java-lgpl/org/apache/ignite/examples/datagrid/hibernate/HibernateL2CacheExample.java index a31d394b75538..28aa6ca5e8a39 100644 --- a/examples/src/main/java-lgpl/org/apache/ignite/examples/datagrid/hibernate/HibernateL2CacheExample.java +++ b/examples/src/main/java-lgpl/org/apache/ignite/examples/datagrid/hibernate/HibernateL2CacheExample.java @@ -31,9 +31,9 @@ import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cache.spi.access.AccessType; -import org.hibernate.cfg.Configuration; -import org.hibernate.service.ServiceRegistryBuilder; import org.hibernate.stat.SecondLevelCacheStatistics; import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC; @@ -226,14 +226,14 @@ private static IgniteCache createCache(String name, CacheAtomicityMode atomicity * @return New Hibernate {@link SessionFactory}. */ private static SessionFactory createHibernateSessionFactory(URL hibernateCfg) { - ServiceRegistryBuilder builder = new ServiceRegistryBuilder(); + StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); builder.applySetting("hibernate.connection.url", JDBC_URL); builder.applySetting("hibernate.show_sql", true); - return new Configuration() - .configure(hibernateCfg) - .buildSessionFactory(builder.buildServiceRegistry()); + builder.configure(hibernateCfg); + + return new MetadataSources(builder.build()).buildMetadata().buildSessionFactory(); } /** diff --git a/modules/hibernate/README.txt b/modules/hibernate-4.2/README.txt similarity index 96% rename from modules/hibernate/README.txt rename to modules/hibernate-4.2/README.txt index 8e90dab2ffc25..096b9d71867c8 100644 --- a/modules/hibernate/README.txt +++ b/modules/hibernate-4.2/README.txt @@ -24,7 +24,7 @@ interested in): ... org.apache.ignite - ignite-hibernate + ignite-hibernate_4.2 ${ignite.version} ... diff --git a/modules/hibernate/licenses/apache-2.0.txt b/modules/hibernate-4.2/licenses/apache-2.0.txt similarity index 100% rename from modules/hibernate/licenses/apache-2.0.txt rename to modules/hibernate-4.2/licenses/apache-2.0.txt diff --git a/modules/hibernate/pom.xml b/modules/hibernate-4.2/pom.xml similarity index 90% rename from modules/hibernate/pom.xml rename to modules/hibernate-4.2/pom.xml index 75dacb14c3c07..c597b21ab9810 100644 --- a/modules/hibernate/pom.xml +++ b/modules/hibernate-4.2/pom.xml @@ -30,7 +30,7 @@ ../../parent - ignite-hibernate + ignite-hibernate_4.2 2.0.0-SNAPSHOT http://ignite.apache.org @@ -41,10 +41,16 @@ ${project.version} + + org.apache.ignite + ignite-hibernate-core + ${project.version} + + org.hibernate hibernate-core - 4.2.6.Final + 4.2.21.Final @@ -117,6 +123,13 @@ ${spring.version} test + + + com.thoughtworks.xstream + xstream + 1.4.8 + test + diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java similarity index 91% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java index 7186cfb42c6a3..8bf4e9bfe9e7f 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java +++ b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java @@ -27,12 +27,12 @@ */ public abstract class HibernateAbstractRegionAccessStrategy implements RegionAccessStrategy { /** */ - protected final HibernateAccessStrategyAdapter stgy; + final HibernateAccessStrategyAdapter stgy; /** * @param stgy Access strategy implementation. */ - protected HibernateAbstractRegionAccessStrategy(HibernateAccessStrategyAdapter stgy) { + HibernateAbstractRegionAccessStrategy(HibernateAccessStrategyAdapter stgy) { this.stgy = stgy; } @@ -58,22 +58,26 @@ protected HibernateAbstractRegionAccessStrategy(HibernateAccessStrategyAdapter s /** {@inheritDoc} */ @Nullable @Override public SoftLock lockItem(Object key, Object ver) throws CacheException { - return stgy.lock(key); + stgy.lock(key); + + return null; } /** {@inheritDoc} */ @Nullable @Override public SoftLock lockRegion() throws CacheException { - return stgy.lockRegion(); + stgy.lockRegion(); + + return null; } /** {@inheritDoc} */ @Override public void unlockRegion(SoftLock lock) throws CacheException { - stgy.unlockRegion(lock); + stgy.unlockRegion(); } /** {@inheritDoc} */ @Override public void unlockItem(Object key, SoftLock lock) throws CacheException { - stgy.unlock(key, lock); + stgy.unlock(key); } /** {@inheritDoc} */ diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java similarity index 98% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java index eb35a2c4709d7..dae476c6823bc 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java +++ b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java @@ -70,7 +70,7 @@ public class HibernateCollectionRegion extends HibernateTransactionalDataRegion * @param cache Region cache. * @param dataDesc Region data description. */ - public HibernateCollectionRegion(HibernateRegionFactory factory, String name, + HibernateCollectionRegion(HibernateRegionFactory factory, String name, Ignite ignite, HibernateCacheProxy cache, CacheDataDescription dataDesc) { super(factory, name, ignite, cache, dataDesc); } diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java similarity index 96% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java index ad5b1919f51b3..db921dcbd67c2 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java +++ b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java @@ -60,7 +60,7 @@ public class HibernateEntityRegion extends HibernateTransactionalDataRegion impl * @param cache Region cache, * @param dataDesc Region data description. */ - public HibernateEntityRegion(HibernateRegionFactory factory, String name, Ignite ignite, + HibernateEntityRegion(HibernateRegionFactory factory, String name, Ignite ignite, HibernateCacheProxy cache, CacheDataDescription dataDesc) { super(factory, name, ignite, cache, dataDesc); } @@ -106,7 +106,7 @@ private AccessStrategy(HibernateAccessStrategyAdapter stgy) { /** {@inheritDoc} */ @Override public boolean afterUpdate(Object key, Object val, Object currVer, Object previousVer, SoftLock lock) throws CacheException { - return stgy.afterUpdate(key, val, lock); + return stgy.afterUpdate(key, val); } } } \ No newline at end of file diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java similarity index 89% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java index 2f1a11dc8baa3..578d88bd83a8b 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java +++ b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java @@ -36,7 +36,7 @@ public class HibernateGeneralDataRegion extends HibernateRegion implements Gener * @param ignite Grid. * @param cache Region cache. */ - public HibernateGeneralDataRegion(HibernateRegionFactory factory, String name, + HibernateGeneralDataRegion(HibernateRegionFactory factory, String name, Ignite ignite, HibernateCacheProxy cache) { super(factory, name, ignite, cache); } @@ -66,6 +66,11 @@ public HibernateGeneralDataRegion(HibernateRegionFactory factory, String name, /** {@inheritDoc} */ @Override public void evictAll() throws CacheException { - HibernateAccessStrategyAdapter.evictAll(cache); + try { + HibernateAccessStrategyAdapter.evictAll(cache); + } + catch (IgniteCheckedException e) { + throw HibernateRegionFactory.EXCEPTION_CONVERTER.convert(e); + } } } \ No newline at end of file diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java similarity index 96% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java index 7de440ebb032c..64de3951a015c 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java +++ b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java @@ -17,12 +17,13 @@ package org.apache.ignite.cache.hibernate; +import java.io.Serializable; import org.apache.ignite.internal.util.typedef.internal.S; /** * Hibernate cache key wrapper. */ -public class HibernateKeyWrapper { +public class HibernateKeyWrapper implements Serializable { /** Key. */ private final Object key; diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java similarity index 93% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java index 862a4228f2767..ae1099da55445 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java +++ b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java @@ -50,8 +50,11 @@ public class HibernateNaturalIdRegion extends HibernateTransactionalDataRegion i * @param cache Region cache, * @param dataDesc Region data description. */ - public HibernateNaturalIdRegion(HibernateRegionFactory factory, String name, - Ignite ignite, HibernateCacheProxy cache, CacheDataDescription dataDesc) { + HibernateNaturalIdRegion(HibernateRegionFactory factory, + String name, + Ignite ignite, + HibernateCacheProxy cache, + CacheDataDescription dataDesc) { super(factory, name, ignite, cache, dataDesc); } @@ -94,7 +97,7 @@ private AccessStrategy(HibernateAccessStrategyAdapter stgy) { /** {@inheritDoc} */ @Override public boolean afterUpdate(Object key, Object val, SoftLock lock) throws CacheException { - return stgy.afterUpdate(key, val, lock); + return stgy.afterUpdate(key, val); } } } \ No newline at end of file diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java similarity index 93% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java index 0b9a43d6a13d6..fccbb5efdc177 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java +++ b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java @@ -56,14 +56,14 @@ * values. For this reason, the query cache should always be used in conjunction with * the second-level cache for those entities expected to be cached as part of a query result cache */ -public class HibernateQueryResultsRegion extends HibernateGeneralDataRegion implements QueryResultsRegion { +class HibernateQueryResultsRegion extends HibernateGeneralDataRegion implements QueryResultsRegion { /** * @param factory Region factory. * @param name Region name. * @param ignite Grid. * @param cache Region cache. */ - public HibernateQueryResultsRegion(HibernateRegionFactory factory, String name, + HibernateQueryResultsRegion(HibernateRegionFactory factory, String name, Ignite ignite, HibernateCacheProxy cache) { super(factory, name, ignite, cache); } diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java similarity index 95% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java index 11a96d09096fb..366673215a065 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java +++ b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java @@ -45,7 +45,7 @@ public class HibernateRegion implements Region { * @param ignite Grid. * @param cache Region cache. */ - public HibernateRegion(HibernateRegionFactory factory, String name, Ignite ignite, HibernateCacheProxy cache) { + HibernateRegion(HibernateRegionFactory factory, String name, Ignite ignite, HibernateCacheProxy cache) { this.factory = factory; this.name = name; this.ignite = ignite; diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java similarity index 51% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java index 263359b0e6e40..5667eb2e7e7c3 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java +++ b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java @@ -17,16 +17,8 @@ package org.apache.ignite.cache.hibernate; -import java.util.HashMap; -import java.util.Map; import java.util.Properties; -import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteException; -import org.apache.ignite.IgniteLogger; -import org.apache.ignite.Ignition; -import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.processors.cache.IgniteInternalCache; -import org.apache.ignite.internal.util.typedef.G; import org.hibernate.cache.CacheException; import org.hibernate.cache.spi.CacheDataDescription; import org.hibernate.cache.spi.CacheKey; @@ -39,6 +31,7 @@ import org.hibernate.cache.spi.access.AccessType; import org.hibernate.cfg.Settings; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.DFLT_ACCESS_TYPE_PROPERTY; import static org.hibernate.cache.spi.access.AccessType.NONSTRICT_READ_WRITE; /** @@ -70,45 +63,16 @@ public class HibernateRegionFactory implements RegionFactory { /** */ private static final long serialVersionUID = 0L; - /** - * Hibernate L2 cache grid name property name. - * - * @deprecated Use {@link #IGNITE_INSTANCE_NAME_PROPERTY}. - * If {@link #IGNITE_INSTANCE_NAME_PROPERTY} is specified it takes precedence. - */ - @Deprecated - public static final String GRID_NAME_PROPERTY = "org.apache.ignite.hibernate.grid_name"; - - /** Hibernate L2 cache Ignite instance name property name. */ - public static final String IGNITE_INSTANCE_NAME_PROPERTY = "org.apache.ignite.hibernate.ignite_instance_name"; - - /** Default cache property name. */ - public static final String DFLT_CACHE_NAME_PROPERTY = "org.apache.ignite.hibernate.default_cache"; - - /** Property prefix used to specify region name to cache name mapping. */ - public static final String REGION_CACHE_PROPERTY = "org.apache.ignite.hibernate.region_cache."; - /** */ - public static final String DFLT_ACCESS_TYPE_PROPERTY = "org.apache.ignite.hibernate.default_access_type"; - - /** */ - public static final String GRID_CONFIG_PROPERTY = "org.apache.ignite.hibernate.grid_config"; - - /** Grid providing caches. */ - private Ignite ignite; - - /** Default cache. */ - private HibernateCacheProxy dfltCache; + static final HibernateExceptionConverter EXCEPTION_CONVERTER = new HibernateExceptionConverter() { + @Override public RuntimeException convert(Exception e) { + return new CacheException(e); + } + }; /** Default region access type. */ private AccessType dfltAccessType; - /** Region name to cache name mapping. */ - private final Map regionCaches = new HashMap<>(); - - /** Map needed to provide the same transaction context for different regions. */ - private final ThreadLocal threadLoc = new ThreadLocal(); - /** Key transformer. */ private final HibernateKeyTransformer hibernate4transformer = new HibernateKeyTransformer() { @Override public Object transform(Object key) { @@ -126,60 +90,24 @@ public class HibernateRegionFactory implements RegionFactory { } }; + /** */ + private final HibernateAccessStrategyFactory accessStgyFactory = + new HibernateAccessStrategyFactory(hibernate4transformer, EXCEPTION_CONVERTER); + /** {@inheritDoc} */ @Override public void start(Settings settings, Properties props) throws CacheException { - String gridCfg = props.getProperty(GRID_CONFIG_PROPERTY); - String igniteInstanceName = props.getProperty(IGNITE_INSTANCE_NAME_PROPERTY); - - if (igniteInstanceName == null) - igniteInstanceName = props.getProperty(GRID_NAME_PROPERTY); - - if (gridCfg != null) { - try { - ignite = G.start(gridCfg); - } - catch (IgniteException e) { - throw new CacheException(e); - } - } - else - ignite = Ignition.ignite(igniteInstanceName); - String accessType = props.getProperty(DFLT_ACCESS_TYPE_PROPERTY, NONSTRICT_READ_WRITE.name()); dfltAccessType = AccessType.valueOf(accessType); - for (Map.Entry prop : props.entrySet()) { - String key = prop.getKey().toString(); - - if (key.startsWith(REGION_CACHE_PROPERTY)) { - String regionName = key.substring(REGION_CACHE_PROPERTY.length()); - - String cacheName = prop.getValue().toString(); - - if (((IgniteKernal)ignite).getCache(cacheName) == null) - throw new CacheException("Cache '" + cacheName + "' specified for region '" + regionName + "' " + - "is not configured."); - - regionCaches.put(regionName, cacheName); - } - } - - String dfltCacheName = props.getProperty(DFLT_CACHE_NAME_PROPERTY); - - if (dfltCacheName != null) { - IgniteInternalCache dfltCache = ((IgniteKernal)ignite).getCache(dfltCacheName); - - if (dfltCache == null) - throw new CacheException("Cache specified as default is not configured: " + dfltCacheName); - - this.dfltCache = new HibernateCacheProxy(dfltCache, hibernate4transformer); - } - - IgniteLogger log = ignite.log().getLogger(HibernateRegionFactory.class); + accessStgyFactory.start(props); + } - if (log.isDebugEnabled()) - log.debug("HibernateRegionFactory started [igniteInstanceName=" + igniteInstanceName + ']'); + /** + * @return Access strategy factory. + */ + HibernateAccessStrategyFactory accessStrategyFactory() { + return accessStgyFactory; } /** {@inheritDoc} */ @@ -205,62 +133,47 @@ public class HibernateRegionFactory implements RegionFactory { /** {@inheritDoc} */ @Override public EntityRegion buildEntityRegion(String regionName, Properties props, CacheDataDescription metadata) throws CacheException { - return new HibernateEntityRegion(this, regionName, ignite, regionCache(regionName), metadata); + return new HibernateEntityRegion(this, + regionName, + accessStgyFactory.node(), + accessStgyFactory.regionCache(regionName), + metadata); } /** {@inheritDoc} */ @Override public NaturalIdRegion buildNaturalIdRegion(String regionName, Properties props, CacheDataDescription metadata) throws CacheException { - return new HibernateNaturalIdRegion(this, regionName, ignite, regionCache(regionName), metadata); + return new HibernateNaturalIdRegion(this, + regionName, + accessStgyFactory.node(), + accessStgyFactory.regionCache(regionName), + metadata); } /** {@inheritDoc} */ @Override public CollectionRegion buildCollectionRegion(String regionName, Properties props, CacheDataDescription metadata) throws CacheException { - return new HibernateCollectionRegion(this, regionName, ignite, regionCache(regionName), metadata); + return new HibernateCollectionRegion(this, + regionName, + accessStgyFactory.node(), + accessStgyFactory.regionCache(regionName), + metadata); } /** {@inheritDoc} */ @Override public QueryResultsRegion buildQueryResultsRegion(String regionName, Properties props) throws CacheException { - return new HibernateQueryResultsRegion(this, regionName, ignite, regionCache(regionName)); + return new HibernateQueryResultsRegion(this, + regionName, + accessStgyFactory.node(), + accessStgyFactory.regionCache(regionName)); } /** {@inheritDoc} */ @Override public TimestampsRegion buildTimestampsRegion(String regionName, Properties props) throws CacheException { - return new HibernateTimestampsRegion(this, regionName, ignite, regionCache(regionName)); - } - - /** - * Reuse same thread local for the same cache across different regions. - * - * @param cacheName Cache name. - * @return Thread local instance used to track updates done during one Hibernate transaction. - */ - ThreadLocal threadLocalForCache(String cacheName) { - return threadLoc; - } - - /** - * @param regionName L2 cache region name. - * @return Cache for given region. - * @throws CacheException If cache for given region is not configured. - */ - private HibernateCacheProxy regionCache(String regionName) throws CacheException { - String cacheName = regionCaches.get(regionName); - - if (cacheName == null) { - if (dfltCache != null) - return dfltCache; - - cacheName = regionName; - } - - IgniteInternalCache cache = ((IgniteKernal)ignite).getCache(cacheName); - - if (cache == null) - throw new CacheException("Cache '" + cacheName + "' for region '" + regionName + "' is not configured."); - - return new HibernateCacheProxy(cache, hibernate4transformer); + return new HibernateTimestampsRegion(this, + regionName, + accessStgyFactory.node(), + accessStgyFactory.regionCache(regionName)); } } \ No newline at end of file diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTimestampsRegion.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateTimestampsRegion.java similarity index 100% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTimestampsRegion.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateTimestampsRegion.java diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java similarity index 57% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java index 581076a3fdbb6..275ea9ed69705 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java +++ b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java @@ -18,8 +18,6 @@ package org.apache.ignite.cache.hibernate; import org.apache.ignite.Ignite; -import org.apache.ignite.configuration.TransactionConfiguration; -import org.hibernate.cache.CacheException; import org.hibernate.cache.spi.CacheDataDescription; import org.hibernate.cache.spi.CollectionRegion; import org.hibernate.cache.spi.EntityRegion; @@ -27,8 +25,6 @@ import org.hibernate.cache.spi.TransactionalDataRegion; import org.hibernate.cache.spi.access.AccessType; -import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; - /** * Implementation of {@link TransactionalDataRegion} (transactional means that * data in the region is updated in connection with database transaction). @@ -46,7 +42,7 @@ public class HibernateTransactionalDataRegion extends HibernateRegion implements * @param cache Region cache. * @param dataDesc Region data description. */ - public HibernateTransactionalDataRegion(HibernateRegionFactory factory, String name, + HibernateTransactionalDataRegion(HibernateRegionFactory factory, String name, Ignite ignite, HibernateCacheProxy cache, CacheDataDescription dataDesc) { super(factory, name, ignite, cache); @@ -67,38 +63,19 @@ public HibernateTransactionalDataRegion(HibernateRegionFactory factory, String n * @param accessType Hibernate L2 cache access type. * @return Access strategy for given access type. */ - protected HibernateAccessStrategyAdapter createAccessStrategy(AccessType accessType) { + HibernateAccessStrategyAdapter createAccessStrategy(AccessType accessType) { switch (accessType) { case READ_ONLY: - return new HibernateReadOnlyAccessStrategy(ignite, cache); + return factory.accessStrategyFactory().createReadOnlyStrategy(cache); case NONSTRICT_READ_WRITE: - return new HibernateNonStrictAccessStrategy(ignite, cache, factory.threadLocalForCache(cache.name())); + return factory.accessStrategyFactory().createNonStrictReadWriteStrategy(cache); case READ_WRITE: - if (cache.configuration().getAtomicityMode() != TRANSACTIONAL) - throw new CacheException("Hibernate READ-WRITE access strategy must have Ignite cache with " + - "'TRANSACTIONAL' atomicity mode: " + cache.name()); - - return new HibernateReadWriteAccessStrategy(ignite, cache, factory.threadLocalForCache(cache.name())); + return factory.accessStrategyFactory().createReadWriteStrategy(cache); case TRANSACTIONAL: - if (cache.configuration().getAtomicityMode() != TRANSACTIONAL) - throw new CacheException("Hibernate TRANSACTIONAL access strategy must have Ignite cache with " + - "'TRANSACTIONAL' atomicity mode: " + cache.name()); - - TransactionConfiguration txCfg = ignite.configuration().getTransactionConfiguration(); - - if (txCfg == null || - (txCfg.getTxManagerFactory() == null - && txCfg.getTxManagerLookupClassName() == null - && cache.configuration().getTransactionManagerLookupClassName() == null)) { - throw new CacheException("Hibernate TRANSACTIONAL access strategy must have Ignite with " + - "Factory configured (see IgniteConfiguration." + - "getTransactionConfiguration().setTxManagerFactory()): " + cache.name()); - } - - return new HibernateTransactionalAccessStrategy(ignite, cache); + return factory.accessStrategyFactory().createTransactionalStrategy(cache); default: throw new IllegalArgumentException("Unknown Hibernate access type: " + accessType); diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/package-info.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/package-info.java similarity index 100% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/package-info.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/hibernate/package-info.java diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java similarity index 100% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.hbm.xml b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.hbm.xml similarity index 100% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.hbm.xml rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.hbm.xml diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.java similarity index 100% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.java diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreFactory.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreFactory.java similarity index 100% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreFactory.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreFactory.java diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java similarity index 100% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/package-info.java b/modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/package-info.java similarity index 100% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/store/hibernate/package-info.java rename to modules/hibernate-4.2/src/main/java/org/apache/ignite/cache/store/hibernate/package-info.java diff --git a/modules/hibernate/src/test/config/factory-cache.xml b/modules/hibernate-4.2/src/test/config/factory-cache.xml similarity index 100% rename from modules/hibernate/src/test/config/factory-cache.xml rename to modules/hibernate-4.2/src/test/config/factory-cache.xml diff --git a/modules/hibernate/src/test/config/factory-cache1.xml b/modules/hibernate-4.2/src/test/config/factory-cache1.xml similarity index 100% rename from modules/hibernate/src/test/config/factory-cache1.xml rename to modules/hibernate-4.2/src/test/config/factory-cache1.xml diff --git a/modules/hibernate/src/test/config/factory-incorrect-store-cache.xml b/modules/hibernate-4.2/src/test/config/factory-incorrect-store-cache.xml similarity index 100% rename from modules/hibernate/src/test/config/factory-incorrect-store-cache.xml rename to modules/hibernate-4.2/src/test/config/factory-incorrect-store-cache.xml diff --git a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java similarity index 95% rename from modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java index b018d0b20f1af..cb179c46d2f46 100644 --- a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java +++ b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java @@ -43,10 +43,10 @@ import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC; import static org.apache.ignite.cache.CacheMode.PARTITIONED; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.DFLT_ACCESS_TYPE_PROPERTY; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.DFLT_CACHE_NAME_PROPERTY; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.IGNITE_INSTANCE_NAME_PROPERTY; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.REGION_CACHE_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.DFLT_ACCESS_TYPE_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.DFLT_CACHE_NAME_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.IGNITE_INSTANCE_NAME_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.REGION_CACHE_PROPERTY; import static org.hibernate.cfg.AvailableSettings.CACHE_REGION_FACTORY; import static org.hibernate.cfg.AvailableSettings.GENERATE_STATISTICS; import static org.hibernate.cfg.AvailableSettings.HBM2DDL_AUTO; @@ -130,6 +130,7 @@ private CacheConfiguration cacheConfiguration(String cacheName) { return cfg; } + /** * @param igniteInstanceName Ignite instance name. * @return Hibernate configuration. @@ -170,14 +171,14 @@ protected Configuration hibernateConfiguration(String igniteInstanceName) { } /** - * Tests property {@link HibernateRegionFactory#REGION_CACHE_PROPERTY}. + * Tests property {@link HibernateAccessStrategyFactory#REGION_CACHE_PROPERTY}. */ public void testPerRegionCacheProperty() { testCacheUsage(1, 1, 0, 1, 1); } /** - * Tests property {@link HibernateRegionFactory#DFLT_CACHE_NAME_PROPERTY}. + * Tests property {@link HibernateAccessStrategyFactory#DFLT_CACHE_NAME_PROPERTY}. */ public void testDefaultCache() { dfltCache = true; diff --git a/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java new file mode 100644 index 0000000000000..5160220e2a7dd --- /dev/null +++ b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java @@ -0,0 +1,440 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.cache.hibernate; + +import java.util.Map; +import javax.persistence.Cacheable; +import javax.persistence.Id; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCompute; +import org.apache.ignite.IgniteLogger; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.binary.BinaryMarshaller; +import org.apache.ignite.lang.IgniteRunnable; +import org.apache.ignite.resources.IgniteInstanceResource; +import org.apache.ignite.resources.LoggerResource; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.cfg.Configuration; +import org.hibernate.service.ServiceRegistryBuilder; + +import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.DFLT_CACHE_NAME_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateL2CacheSelfTest.CONNECTION_URL; +import static org.apache.ignite.cache.hibernate.HibernateL2CacheSelfTest.hibernateProperties; +import static org.hibernate.cache.spi.access.AccessType.NONSTRICT_READ_WRITE; + +/** + * + */ +public class HibernateL2CacheMultiJvmTest extends GridCommonAbstractTest { + /** */ + private static final String CACHE_NAME = "hibernateCache"; + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + if (!getTestIgniteInstanceName(0).equals(igniteInstanceName)) + cfg.setClientMode(true); + + CacheConfiguration ccfg = new CacheConfiguration(); + + ccfg.setName(CACHE_NAME); + ccfg.setWriteSynchronizationMode(FULL_SYNC); + + cfg.setCacheConfiguration(ccfg); + + cfg.setMarshaller(new BinaryMarshaller()); + + cfg.setPeerClassLoadingEnabled(false); + + return cfg; + } + + /** {@inheritDoc} */ + @Override protected boolean isMultiJvm() { + return true; + } + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + super.beforeTestsStarted(); + + startGrid(0); + + startGrid(1); + startGrid(2); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + stopAllGrids(); + + super.afterTestsStopped(); + } + + /** + * @throws Exception If failed. + */ + public void testL2Cache() throws Exception { + Ignite srv = ignite(0); + + { + IgniteCompute client1Compute = + srv.compute(srv.cluster().forNodeId(ignite(1).cluster().localNode().id())); + + client1Compute.run(new HibernateInsertRunnable()); + } + + { + IgniteCompute client2Compute = + srv.compute(srv.cluster().forNodeId(ignite(2).cluster().localNode().id())); + + client2Compute.run(new HibernateLoadRunnable()); + } + + { + IgniteCompute srvCompute = srv.compute(srv.cluster().forLocal()); + + srvCompute.run(new HibernateLoadRunnable()); + } + } + + /** + * + */ + private static class HibernateInsertRunnable extends HibernateBaseRunnable { + /** {@inheritDoc} */ + @Override public void run() { + SessionFactory sesFactory = startHibernate(ignite.name()); + + Session ses = sesFactory.openSession(); + + try { + Transaction tx = ses.beginTransaction(); + + for (int i = 0; i < 1; i++) { + { + Entity1 e = new Entity1(); + e.setId(i); + e.setName("name-" + i); + + ses.save(e); + } + + { + Entity2 e = new Entity2(); + e.setId(String.valueOf(i)); + e.setName("name-" + i); + + ses.save(e); + } + + { + Entity3 e = new Entity3(); + e.setId(i); + e.setName("name-" + i); + + ses.save(e); + } + } + + tx.commit(); + } + finally { + ses.close(); + } + } + } + + /** + * + */ + private static class HibernateLoadRunnable extends HibernateBaseRunnable { + /** {@inheritDoc} */ + @Override public void run() { + SessionFactory sesFactory = startHibernate(ignite.name()); + + Session ses = sesFactory.openSession(); + + try { + Transaction tx = ses.beginTransaction(); + + for (int i = 0; i < 1; i++) { + { + Entity1 e = (Entity1)ses.load(Entity1.class, i); + + log.info("Found: " + e.getName()); + } + { + Entity2 e = (Entity2)ses.load(Entity2.class, String.valueOf(i)); + + log.info("Found: " + e.getName()); + } + { + Entity3 e = (Entity3)ses.load(Entity3.class, (double)i); + + log.info("Found: " + e.getName()); + } + } + + tx.commit(); + } + finally { + ses.close(); + } + } + } + + /** + * + */ + private abstract static class HibernateBaseRunnable implements IgniteRunnable { + /** */ + @IgniteInstanceResource + protected Ignite ignite; + + /** */ + @LoggerResource + IgniteLogger log; + + /** + * @param igniteInstanceName Name of the grid providing caches. + * @return Session factory. + */ + SessionFactory startHibernate(String igniteInstanceName) { + log.info("Start hibernate on node: " + igniteInstanceName); + + Configuration cfg = hibernateConfiguration(igniteInstanceName); + + ServiceRegistryBuilder builder = new ServiceRegistryBuilder(); + + builder.applySetting("hibernate.connection.url", CONNECTION_URL); + + return cfg.buildSessionFactory(builder.buildServiceRegistry()); + } + + /** + * @param nodeName Ignite instance name. + * @return Hibernate configuration. + */ + private Configuration hibernateConfiguration(String nodeName) { + Configuration cfg = new Configuration(); + + cfg.addAnnotatedClass(Entity1.class); + cfg.addAnnotatedClass(Entity2.class); + cfg.addAnnotatedClass(Entity3.class); + + for (Map.Entry e : hibernateProperties(nodeName, NONSTRICT_READ_WRITE.name()).entrySet()) + cfg.setProperty(e.getKey(), e.getValue()); + + cfg.setProperty(DFLT_CACHE_NAME_PROPERTY, CACHE_NAME); + + return cfg; + } + } + + /** + * Test Hibernate entity1. + */ + @javax.persistence.Entity + @Cacheable + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + public static class Entity1 { + /** */ + @Id + private int id; + + /** */ + private String name; + + /** + * @return ID. + */ + public int getId() { + return id; + } + + /** + * @param id ID. + */ + public void setId(int id) { + this.id = id; + } + + /** + * @return Name. + */ + public String getName() { + return name; + } + + /** + * @param name Name. + */ + public void setName(String name) { + this.name = name; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + Entity1 entity1 = (Entity1)o; + + return id == entity1.id; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return id; + } + } + + /** + * Test Hibernate entity1. + */ + @javax.persistence.Entity + @Cacheable + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + public static class Entity2 { + /** */ + @Id + private String id; + + /** */ + private String name; + + /** + * @return ID. + */ + public String getId() { + return id; + } + + /** + * @param id ID. + */ + public void setId(String id) { + this.id = id; + } + + /** + * @return Name. + */ + public String getName() { + return name; + } + + /** + * @param name Name. + */ + public void setName(String name) { + this.name = name; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + Entity2 entity2 = (Entity2)o; + + return id.equals(entity2.id); + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return id.hashCode(); + } + } + + /** + * Test Hibernate entity1. + */ + @javax.persistence.Entity + @Cacheable + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + public static class Entity3 { + /** */ + @Id + private double id; + + /** */ + private String name; + + /** + * @return ID. + */ + public double getId() { + return id; + } + + /** + * @param id ID. + */ + public void setId(double id) { + this.id = id; + } + + /** + * @return Name. + */ + public String getName() { + return name; + } + + /** + * @param name Name. + */ + public void setName(String name) { + this.name = name; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + Entity3 entity3 = (Entity3)o; + + return Double.compare(entity3.id, id) == 0; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + long temp = Double.doubleToLongBits(id); + return (int)(temp ^ (temp >>> 32)); + } + } +} diff --git a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java similarity index 97% rename from modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java index 13956dc28b1c9..7ac790c1782b8 100644 --- a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java +++ b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java @@ -60,9 +60,9 @@ import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; import static org.apache.ignite.cache.CacheMode.PARTITIONED; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.DFLT_ACCESS_TYPE_PROPERTY; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.IGNITE_INSTANCE_NAME_PROPERTY; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.REGION_CACHE_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.DFLT_ACCESS_TYPE_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.IGNITE_INSTANCE_NAME_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.REGION_CACHE_PROPERTY; import static org.hibernate.cfg.Environment.CACHE_REGION_FACTORY; import static org.hibernate.cfg.Environment.GENERATE_STATISTICS; import static org.hibernate.cfg.Environment.HBM2DDL_AUTO; @@ -495,25 +495,12 @@ private Configuration hibernateConfiguration(AccessType accessType, cfg.setCacheConcurrencyStrategy(PARENT_ENTITY_NAME, accessType.getExternalName()); cfg.setCollectionCacheConcurrencyStrategy(CHILD_COLLECTION_REGION, accessType.getExternalName()); - cfg.setProperty(HBM2DDL_AUTO, "create"); - - cfg.setProperty(GENERATE_STATISTICS, "true"); - - cfg.setProperty(USE_SECOND_LEVEL_CACHE, "true"); - - cfg.setProperty(USE_QUERY_CACHE, "true"); - - cfg.setProperty(CACHE_REGION_FACTORY, HibernateRegionFactory.class.getName()); - - cfg.setProperty(RELEASE_CONNECTIONS, "on_close"); - - cfg.setProperty(IGNITE_INSTANCE_NAME_PROPERTY, igniteInstanceName); + for (Map.Entry e : hibernateProperties(igniteInstanceName, accessType.name()).entrySet()) + cfg.setProperty(e.getKey(), e.getValue()); // Use the same cache for Entity and Entity2. cfg.setProperty(REGION_CACHE_PROPERTY + ENTITY2_NAME, ENTITY_NAME); - cfg.setProperty(DFLT_ACCESS_TYPE_PROPERTY, accessType.name()); - return cfg; } @@ -1147,8 +1134,6 @@ private void testVersionedEntity(AccessType accessType) throws Exception { * @throws Exception If failed. */ public void testNaturalIdCache() throws Exception { - fail("https://issues.apache.org/jira/browse/IGNITE-1084"); - for (AccessType accessType : accessTypes()) testNaturalIdCache(accessType); } @@ -1946,4 +1931,24 @@ private void cleanup() throws Exception { for (IgniteCacheProxy cache : ((IgniteKernal)grid(0)).caches()) cache.clear(); } + + /** + * @param igniteInstanceName Node name. + * @param dfltAccessType Default cache access type. + * @return Properties map. + */ + static Map hibernateProperties(String igniteInstanceName, String dfltAccessType) { + Map map = new HashMap<>(); + + map.put(HBM2DDL_AUTO, "create"); + map.put(GENERATE_STATISTICS, "true"); + map.put(USE_SECOND_LEVEL_CACHE, "true"); + map.put(USE_QUERY_CACHE, "true"); + map.put(CACHE_REGION_FACTORY, HibernateRegionFactory.class.getName()); + map.put(RELEASE_CONNECTIONS, "on_close"); + map.put(IGNITE_INSTANCE_NAME_PROPERTY, igniteInstanceName); + map.put(DFLT_ACCESS_TYPE_PROPERTY, dfltAccessType); + + return map; + } } \ No newline at end of file diff --git a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalSelfTest.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalSelfTest.java similarity index 100% rename from modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalSelfTest.java rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalSelfTest.java diff --git a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalUseSyncSelfTest.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalUseSyncSelfTest.java similarity index 100% rename from modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalUseSyncSelfTest.java rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalUseSyncSelfTest.java diff --git a/modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreNodeRestartTest.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreNodeRestartTest.java similarity index 100% rename from modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreNodeRestartTest.java rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreNodeRestartTest.java diff --git a/modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java similarity index 90% rename from modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java index d3d2b52082d50..77025a1ea294c 100644 --- a/modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java +++ b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java @@ -69,8 +69,8 @@ public CacheHibernateBlobStoreSelfTest() throws Exception { * @throws Exception If failed. */ public void testConfigurationByUrl() throws Exception { - URL url = U.resolveIgniteUrl( - "modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml"); + URL url = U.resolveIgniteUrl(CacheHibernateStoreFactorySelfTest.MODULE_PATH + + "/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml"); assert url != null; @@ -84,8 +84,8 @@ public void testConfigurationByUrl() throws Exception { * @throws Exception If failed. */ public void testConfigurationByFile() throws Exception { - URL url = U.resolveIgniteUrl( - "modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml"); + URL url = U.resolveIgniteUrl(CacheHibernateStoreFactorySelfTest.MODULE_PATH + + "/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml"); assert url != null; diff --git a/modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java similarity index 93% rename from modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java index 3a2244e0e5cf4..f6c8a2d99978c 100644 --- a/modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java +++ b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java @@ -51,6 +51,9 @@ public class CacheHibernateStoreFactorySelfTest extends GridCommonAbstractTest { /** Cache name. */ private static final String CACHE_NAME = "test"; + /** */ + static final String MODULE_PATH = "modules/hibernate-4.2/"; + /** * @throws Exception If failed. */ @@ -66,8 +69,8 @@ public void testCacheConfiguration() throws Exception { * @throws Exception If failed. */ public void testXmlConfiguration() throws Exception { - try (Ignite ignite = Ignition.start("modules/hibernate/src/test/config/factory-cache.xml")) { - try(Ignite ignite1 = Ignition.start("modules/hibernate/src/test/config/factory-cache1.xml")) { + try (Ignite ignite = Ignition.start(MODULE_PATH + "/src/test/config/factory-cache.xml")) { + try(Ignite ignite1 = Ignition.start(MODULE_PATH + "/src/test/config/factory-cache1.xml")) { checkStore(ignite.cache(CACHE_NAME), DummySessionFactoryExt.class); checkStore(ignite1.cache(CACHE_NAME), DummySessionFactory.class); @@ -83,7 +86,7 @@ public void testIncorrectBeanConfiguration() throws Exception { GridTestUtils.assertThrows(log, new Callable() { @Override public Object call() throws Exception { try(Ignite ignite = - Ignition.start("modules/hibernate/src/test/config/factory-incorrect-store-cache.xml")) { + Ignition.start(MODULE_PATH + "/src/test/config/factory-incorrect-store-cache.xml")) { ignite.cache(CACHE_NAME).getConfiguration(CacheConfiguration.class). getCacheStoreFactory().create(); } @@ -177,12 +180,12 @@ public static class DummySessionFactory implements SessionFactory { } /** {@inheritDoc} */ - @Override public StatelessSession openStatelessSession(Connection connection) { + @Override public StatelessSession openStatelessSession(Connection conn) { return null; } /** {@inheritDoc} */ - @Override public ClassMetadata getClassMetadata(Class entityClass) { + @Override public ClassMetadata getClassMetadata(Class entityCls) { return null; } @@ -226,11 +229,11 @@ public static class DummySessionFactory implements SessionFactory { } /** {@inheritDoc} */ - @Override public void evict(Class persistentClass) throws HibernateException { + @Override public void evict(Class persistentCls) throws HibernateException { } /** {@inheritDoc} */ - @Override public void evict(Class persistentClass, Serializable id) throws HibernateException { + @Override public void evict(Class persistentCls, Serializable id) throws HibernateException { } /** {@inheritDoc} */ diff --git a/modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java similarity index 100% rename from modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java diff --git a/modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml similarity index 100% rename from modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml diff --git a/modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/package-info.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/package-info.java similarity index 100% rename from modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/package-info.java rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/cache/store/hibernate/package-info.java diff --git a/modules/hibernate/src/test/java/org/apache/ignite/testsuites/IgniteBinaryHibernateTestSuite.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/testsuites/IgniteBinaryHibernateTestSuite.java similarity index 100% rename from modules/hibernate/src/test/java/org/apache/ignite/testsuites/IgniteBinaryHibernateTestSuite.java rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/testsuites/IgniteBinaryHibernateTestSuite.java diff --git a/modules/hibernate/src/test/java/org/apache/ignite/testsuites/IgniteHibernateTestSuite.java b/modules/hibernate-4.2/src/test/java/org/apache/ignite/testsuites/IgniteHibernateTestSuite.java similarity index 100% rename from modules/hibernate/src/test/java/org/apache/ignite/testsuites/IgniteHibernateTestSuite.java rename to modules/hibernate-4.2/src/test/java/org/apache/ignite/testsuites/IgniteHibernateTestSuite.java diff --git a/modules/hibernate5/README.txt b/modules/hibernate-5.1/README.txt similarity index 96% rename from modules/hibernate5/README.txt rename to modules/hibernate-5.1/README.txt index 370258b71bfe6..53c5d181e3248 100644 --- a/modules/hibernate5/README.txt +++ b/modules/hibernate-5.1/README.txt @@ -24,7 +24,7 @@ interested in): ... org.apache.ignite - ignite-hibernate5 + ignite-hibernate_5.1 ${ignite.version} ... diff --git a/modules/hibernate5/licenses/apache-2.0.txt b/modules/hibernate-5.1/licenses/apache-2.0.txt similarity index 100% rename from modules/hibernate5/licenses/apache-2.0.txt rename to modules/hibernate-5.1/licenses/apache-2.0.txt diff --git a/modules/hibernate5/pom.xml b/modules/hibernate-5.1/pom.xml similarity index 90% rename from modules/hibernate5/pom.xml rename to modules/hibernate-5.1/pom.xml index 13a0c40d18496..80299bc656a01 100644 --- a/modules/hibernate5/pom.xml +++ b/modules/hibernate-5.1/pom.xml @@ -30,7 +30,7 @@ ../../parent - ignite-hibernate5 + ignite-hibernate_5.1 2.0.0-SNAPSHOT http://ignite.apache.org @@ -41,10 +41,16 @@ ${project.version} + + org.apache.ignite + ignite-hibernate-core + ${project.version} + + org.hibernate hibernate-core - 5.2.9.Final + 5.1.5.Final @@ -117,6 +123,13 @@ ${spring.version} test + + + com.thoughtworks.xstream + xstream + 1.4.8 + test + diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java similarity index 71% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java index efb90563a5b99..c5829bf1cd6ed 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java +++ b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateAbstractRegionAccessStrategy.java @@ -20,7 +20,7 @@ import org.hibernate.cache.CacheException; import org.hibernate.cache.spi.access.RegionAccessStrategy; import org.hibernate.cache.spi.access.SoftLock; -import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.engine.spi.SessionImplementor; import org.jetbrains.annotations.Nullable; /** @@ -38,19 +38,19 @@ protected HibernateAbstractRegionAccessStrategy(HibernateAccessStrategyAdapter s } /** {@inheritDoc} */ - @Nullable @Override public Object get(SharedSessionContractImplementor ses, Object key, long txTs) throws CacheException { + @Nullable @Override public Object get(SessionImplementor ses, Object key, long txTs) throws CacheException { return stgy.get(key); } /** {@inheritDoc} */ - @Override public boolean putFromLoad(SharedSessionContractImplementor ses, Object key, Object val, long txTs, Object ver) throws CacheException { + @Override public boolean putFromLoad(SessionImplementor ses, Object key, Object val, long txTs, Object ver) throws CacheException { stgy.putFromLoad(key, val); return true; } /** {@inheritDoc} */ - @Override public boolean putFromLoad(SharedSessionContractImplementor ses, Object key, Object val, long txTs, Object ver, boolean minimalPutOverride) + @Override public boolean putFromLoad(SessionImplementor ses, Object key, Object val, long txTs, Object ver, boolean minimalPutOverride) throws CacheException { stgy.putFromLoad(key, val, minimalPutOverride); @@ -58,27 +58,31 @@ protected HibernateAbstractRegionAccessStrategy(HibernateAccessStrategyAdapter s } /** {@inheritDoc} */ - @Nullable @Override public SoftLock lockItem(SharedSessionContractImplementor ses, Object key, Object ver) throws CacheException { - return stgy.lock(key); + @Nullable @Override public SoftLock lockItem(SessionImplementor ses, Object key, Object ver) throws CacheException { + stgy.lock(key); + + return null; } /** {@inheritDoc} */ @Nullable @Override public SoftLock lockRegion() throws CacheException { - return stgy.lockRegion(); + stgy.lockRegion(); + + return null; } /** {@inheritDoc} */ @Override public void unlockRegion(SoftLock lock) throws CacheException { - stgy.unlockRegion(lock); + stgy.unlockRegion(); } /** {@inheritDoc} */ - @Override public void unlockItem(SharedSessionContractImplementor ses, Object key, SoftLock lock) throws CacheException { - stgy.unlock(key, lock); + @Override public void unlockItem(SessionImplementor ses, Object key, SoftLock lock) throws CacheException { + stgy.unlock(key); } /** {@inheritDoc} */ - @Override public void remove(SharedSessionContractImplementor ses, Object key) throws CacheException { + @Override public void remove(SessionImplementor ses, Object key) throws CacheException { stgy.remove(key); } diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java similarity index 100% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateCollectionRegion.java diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java similarity index 85% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java index 1842a63470167..c669400c9e35e 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java +++ b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateEntityRegion.java @@ -19,14 +19,13 @@ import org.apache.ignite.Ignite; import org.hibernate.cache.CacheException; -import org.hibernate.cache.internal.DefaultCacheKeysFactory; import org.hibernate.cache.spi.CacheDataDescription; import org.hibernate.cache.spi.EntityRegion; import org.hibernate.cache.spi.access.AccessType; import org.hibernate.cache.spi.access.EntityRegionAccessStrategy; import org.hibernate.cache.spi.access.SoftLock; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.persister.entity.EntityPersister; /** @@ -105,25 +104,25 @@ private AccessStrategy(HibernateAccessStrategyAdapter stgy) { } /** {@inheritDoc} */ - @Override public boolean insert(SharedSessionContractImplementor ses, Object key, Object val, Object ver) throws CacheException { + @Override public boolean insert(SessionImplementor ses, Object key, Object val, Object ver) throws CacheException { return stgy.insert(key, val); } /** {@inheritDoc} */ - @Override public boolean afterInsert(SharedSessionContractImplementor ses, Object key, Object val, Object ver) throws CacheException { + @Override public boolean afterInsert(SessionImplementor ses, Object key, Object val, Object ver) throws CacheException { return stgy.afterInsert(key, val); } /** {@inheritDoc} */ - @Override public boolean update(SharedSessionContractImplementor ses, Object key, Object val, Object currVer, Object previousVer) + @Override public boolean update(SessionImplementor ses, Object key, Object val, Object currVer, Object previousVer) throws CacheException { return stgy.update(key, val); } /** {@inheritDoc} */ - @Override public boolean afterUpdate(SharedSessionContractImplementor ses, Object key, Object val, Object currVer, Object previousVer, SoftLock lock) + @Override public boolean afterUpdate(SessionImplementor ses, Object key, Object val, Object currVer, Object previousVer, SoftLock lock) throws CacheException { - return stgy.afterUpdate(key, val, lock); + return stgy.afterUpdate(key, val); } } } \ No newline at end of file diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java similarity index 77% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java index 2b34804bc8d5a..9365157a95aa2 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java +++ b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateGeneralDataRegion.java @@ -23,7 +23,7 @@ import org.hibernate.cache.spi.GeneralDataRegion; import org.hibernate.cache.spi.QueryResultsRegion; import org.hibernate.cache.spi.TimestampsRegion; -import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.engine.spi.SessionImplementor; import org.jetbrains.annotations.Nullable; /** @@ -37,25 +37,27 @@ public class HibernateGeneralDataRegion extends HibernateRegion implements Gener * @param ignite Grid. * @param cache Region cache. */ - public HibernateGeneralDataRegion(HibernateRegionFactory factory, String name, + HibernateGeneralDataRegion(HibernateRegionFactory factory, String name, Ignite ignite, HibernateCacheProxy cache) { super(factory, name, ignite, cache); } /** {@inheritDoc} */ - @Nullable @Override public Object get(SharedSessionContractImplementor ses, Object key) throws CacheException { + @Nullable @Override public Object get(SessionImplementor ses, Object key) throws CacheException { try { return cache.get(key); - } catch (IgniteCheckedException e) { + } + catch (IgniteCheckedException e) { throw new CacheException(e); } } /** {@inheritDoc} */ - @Override public void put(SharedSessionContractImplementor ses, Object key, Object val) throws CacheException { + @Override public void put(SessionImplementor ses, Object key, Object val) throws CacheException { try { cache.put(key, val); - } catch (IgniteCheckedException e) { + } + catch (IgniteCheckedException e) { throw new CacheException(e); } } @@ -67,6 +69,11 @@ public HibernateGeneralDataRegion(HibernateRegionFactory factory, String name, /** {@inheritDoc} */ @Override public void evictAll() throws CacheException { - HibernateAccessStrategyAdapter.evictAll(cache); + try { + HibernateAccessStrategyAdapter.evictAll(cache); + } + catch (IgniteCheckedException e) { + throw HibernateRegionFactory.EXCEPTION_CONVERTER.convert(e); + } } } \ No newline at end of file diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java similarity index 97% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java index ff5212439e185..45d00e40cb499 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java +++ b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyWrapper.java @@ -17,6 +17,7 @@ package org.apache.ignite.cache.hibernate; +import java.io.Serializable; import org.apache.ignite.internal.util.typedef.internal.S; import org.hibernate.cache.internal.DefaultCacheKeysFactory; import org.hibernate.engine.spi.SessionFactoryImplementor; @@ -26,7 +27,7 @@ /** * Hibernate cache key wrapper. */ -public class HibernateKeyWrapper { +public class HibernateKeyWrapper implements Serializable { /** Key. */ private final Object key; diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java similarity index 84% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java index 73ed23a2a00ff..68816ded16ade 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java +++ b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateNaturalIdRegion.java @@ -25,7 +25,7 @@ import org.hibernate.cache.spi.access.AccessType; import org.hibernate.cache.spi.access.NaturalIdRegionAccessStrategy; import org.hibernate.cache.spi.access.SoftLock; -import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.persister.entity.EntityPersister; /** @@ -76,7 +76,7 @@ private AccessStrategy(HibernateAccessStrategyAdapter stgy) { } /** {@inheritDoc} */ - @Override public Object generateCacheKey(Object[] naturalIdValues, EntityPersister persister, SharedSessionContractImplementor ses) { + @Override public Object generateCacheKey(Object[] naturalIdValues, EntityPersister persister, SessionImplementor ses) { return DefaultCacheKeysFactory.staticCreateNaturalIdKey(naturalIdValues, persister, ses); } @@ -91,23 +91,23 @@ private AccessStrategy(HibernateAccessStrategyAdapter stgy) { } /** {@inheritDoc} */ - @Override public boolean insert(SharedSessionContractImplementor ses, Object key, Object val) throws CacheException { + @Override public boolean insert(SessionImplementor ses, Object key, Object val) throws CacheException { return stgy.insert(key, val); } /** {@inheritDoc} */ - @Override public boolean afterInsert(SharedSessionContractImplementor ses, Object key, Object val) throws CacheException { + @Override public boolean afterInsert(SessionImplementor ses, Object key, Object val) throws CacheException { return stgy.afterInsert(key, val); } /** {@inheritDoc} */ - @Override public boolean update(SharedSessionContractImplementor ses, Object key, Object val) throws CacheException { + @Override public boolean update(SessionImplementor ses, Object key, Object val) throws CacheException { return stgy.update(key, val); } /** {@inheritDoc} */ - @Override public boolean afterUpdate(SharedSessionContractImplementor ses, Object key, Object val, SoftLock lock) throws CacheException { - return stgy.afterUpdate(key, val, lock); + @Override public boolean afterUpdate(SessionImplementor ses, Object key, Object val, SoftLock lock) throws CacheException { + return stgy.afterUpdate(key, val); } } } \ No newline at end of file diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java similarity index 100% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateQueryResultsRegion.java diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java similarity index 100% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegion.java diff --git a/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java new file mode 100644 index 0000000000000..bf7d7e9028699 --- /dev/null +++ b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java @@ -0,0 +1,168 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.cache.hibernate; + +import java.util.Properties; +import org.apache.ignite.internal.processors.cache.IgniteInternalCache; +import org.hibernate.boot.spi.SessionFactoryOptions; +import org.hibernate.cache.CacheException; +import org.hibernate.cache.spi.CacheDataDescription; +import org.hibernate.cache.spi.CollectionRegion; +import org.hibernate.cache.spi.EntityRegion; +import org.hibernate.cache.spi.NaturalIdRegion; +import org.hibernate.cache.spi.QueryResultsRegion; +import org.hibernate.cache.spi.RegionFactory; +import org.hibernate.cache.spi.TimestampsRegion; +import org.hibernate.cache.spi.access.AccessType; + +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.DFLT_ACCESS_TYPE_PROPERTY; +import static org.hibernate.cache.spi.access.AccessType.NONSTRICT_READ_WRITE; + +/** + * Hibernate L2 cache region factory. + *

+ * Following Hibernate settings should be specified to enable second level cache and to use this + * region factory for caching: + *

+ * hibernate.cache.use_second_level_cache=true
+ * hibernate.cache.region.factory_class=org.apache.ignite.cache.hibernate.HibernateRegionFactory
+ * 
+ * Note that before region factory is started you need to start properly configured Ignite node in the same JVM. + * For example to start Ignite node one of loader provided in {@code org.apache.ignite.grid.startup} package can be used. + *

+ * Name of Ignite instance to be used for region factory must be specified as following Hibernate property: + *

+ * org.apache.ignite.hibernate.ignite_instance_name=<Ignite instance name>
+ * 
+ * Each Hibernate cache region must be associated with some {@link IgniteInternalCache}, by default it is assumed that + * for each cache region there is a {@link IgniteInternalCache} with the same name. Also it is possible to define + * region to cache mapping using properties with prefix {@code org.apache.ignite.hibernate.region_cache}. + * For example if for region with name "region1" cache with name "cache1" should be used then following + * Hibernate property should be specified: + *
+ * org.apache.ignite.hibernate.region_cache.region1=cache1
+ * 
+ */ +public class HibernateRegionFactory implements RegionFactory { + /** */ + private static final long serialVersionUID = 0L; + + /** */ + static final HibernateExceptionConverter EXCEPTION_CONVERTER = new HibernateExceptionConverter() { + @Override public RuntimeException convert(Exception e) { + return new CacheException(e); + } + }; + + /** Default region access type. */ + private AccessType dfltAccessType; + + /** Key transformer. */ + private final HibernateKeyTransformer hibernate4transformer = new HibernateKeyTransformer() { + @Override public Object transform(Object key) { + return key; + } + }; + + /** */ + private final HibernateAccessStrategyFactory accessStgyFactory = + new HibernateAccessStrategyFactory(hibernate4transformer, EXCEPTION_CONVERTER); + + /** {@inheritDoc} */ + @Override public void start(SessionFactoryOptions settings, Properties props) throws CacheException { + String accessType = props.getProperty(DFLT_ACCESS_TYPE_PROPERTY, NONSTRICT_READ_WRITE.name()); + + dfltAccessType = AccessType.valueOf(accessType); + + accessStgyFactory.start(props); + } + + /** + * @return Access strategy factory. + */ + HibernateAccessStrategyFactory accessStrategyFactory() { + return accessStgyFactory; + } + + /** {@inheritDoc} */ + @Override public void stop() { + // No-op. + } + + /** {@inheritDoc} */ + @Override public boolean isMinimalPutsEnabledByDefault() { + return false; + } + + /** {@inheritDoc} */ + @Override public AccessType getDefaultAccessType() { + return dfltAccessType; + } + + /** {@inheritDoc} */ + @Override public long nextTimestamp() { + return System.currentTimeMillis(); + } + + /** {@inheritDoc} */ + @Override public EntityRegion buildEntityRegion(String regionName, Properties props, CacheDataDescription metadata) + throws CacheException { + return new HibernateEntityRegion(this, + regionName, + accessStgyFactory.node(), + accessStgyFactory.regionCache(regionName), + metadata); + } + + /** {@inheritDoc} */ + @Override public NaturalIdRegion buildNaturalIdRegion(String regionName, Properties props, + CacheDataDescription metadata) throws CacheException { + return new HibernateNaturalIdRegion(this, + regionName, + accessStgyFactory.node(), + accessStgyFactory.regionCache(regionName), + metadata); + } + + /** {@inheritDoc} */ + @Override public CollectionRegion buildCollectionRegion(String regionName, Properties props, + CacheDataDescription metadata) throws CacheException { + return new HibernateCollectionRegion(this, + regionName, + accessStgyFactory.node(), + accessStgyFactory.regionCache(regionName), + metadata); + } + + /** {@inheritDoc} */ + @Override public QueryResultsRegion buildQueryResultsRegion(String regionName, Properties props) + throws CacheException { + return new HibernateQueryResultsRegion(this, + regionName, + accessStgyFactory.node(), + accessStgyFactory.regionCache(regionName)); + } + + /** {@inheritDoc} */ + @Override public TimestampsRegion buildTimestampsRegion(String regionName, Properties props) throws CacheException { + return new HibernateTimestampsRegion(this, + regionName, + accessStgyFactory.node(), + accessStgyFactory.regionCache(regionName)); + } +} \ No newline at end of file diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateTimestampsRegion.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateTimestampsRegion.java similarity index 100% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateTimestampsRegion.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateTimestampsRegion.java diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java similarity index 57% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java index 581076a3fdbb6..275ea9ed69705 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java +++ b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java @@ -18,8 +18,6 @@ package org.apache.ignite.cache.hibernate; import org.apache.ignite.Ignite; -import org.apache.ignite.configuration.TransactionConfiguration; -import org.hibernate.cache.CacheException; import org.hibernate.cache.spi.CacheDataDescription; import org.hibernate.cache.spi.CollectionRegion; import org.hibernate.cache.spi.EntityRegion; @@ -27,8 +25,6 @@ import org.hibernate.cache.spi.TransactionalDataRegion; import org.hibernate.cache.spi.access.AccessType; -import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; - /** * Implementation of {@link TransactionalDataRegion} (transactional means that * data in the region is updated in connection with database transaction). @@ -46,7 +42,7 @@ public class HibernateTransactionalDataRegion extends HibernateRegion implements * @param cache Region cache. * @param dataDesc Region data description. */ - public HibernateTransactionalDataRegion(HibernateRegionFactory factory, String name, + HibernateTransactionalDataRegion(HibernateRegionFactory factory, String name, Ignite ignite, HibernateCacheProxy cache, CacheDataDescription dataDesc) { super(factory, name, ignite, cache); @@ -67,38 +63,19 @@ public HibernateTransactionalDataRegion(HibernateRegionFactory factory, String n * @param accessType Hibernate L2 cache access type. * @return Access strategy for given access type. */ - protected HibernateAccessStrategyAdapter createAccessStrategy(AccessType accessType) { + HibernateAccessStrategyAdapter createAccessStrategy(AccessType accessType) { switch (accessType) { case READ_ONLY: - return new HibernateReadOnlyAccessStrategy(ignite, cache); + return factory.accessStrategyFactory().createReadOnlyStrategy(cache); case NONSTRICT_READ_WRITE: - return new HibernateNonStrictAccessStrategy(ignite, cache, factory.threadLocalForCache(cache.name())); + return factory.accessStrategyFactory().createNonStrictReadWriteStrategy(cache); case READ_WRITE: - if (cache.configuration().getAtomicityMode() != TRANSACTIONAL) - throw new CacheException("Hibernate READ-WRITE access strategy must have Ignite cache with " + - "'TRANSACTIONAL' atomicity mode: " + cache.name()); - - return new HibernateReadWriteAccessStrategy(ignite, cache, factory.threadLocalForCache(cache.name())); + return factory.accessStrategyFactory().createReadWriteStrategy(cache); case TRANSACTIONAL: - if (cache.configuration().getAtomicityMode() != TRANSACTIONAL) - throw new CacheException("Hibernate TRANSACTIONAL access strategy must have Ignite cache with " + - "'TRANSACTIONAL' atomicity mode: " + cache.name()); - - TransactionConfiguration txCfg = ignite.configuration().getTransactionConfiguration(); - - if (txCfg == null || - (txCfg.getTxManagerFactory() == null - && txCfg.getTxManagerLookupClassName() == null - && cache.configuration().getTransactionManagerLookupClassName() == null)) { - throw new CacheException("Hibernate TRANSACTIONAL access strategy must have Ignite with " + - "Factory configured (see IgniteConfiguration." + - "getTransactionConfiguration().setTxManagerFactory()): " + cache.name()); - } - - return new HibernateTransactionalAccessStrategy(ignite, cache); + return factory.accessStrategyFactory().createTransactionalStrategy(cache); default: throw new IllegalArgumentException("Unknown Hibernate access type: " + accessType); diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/package-info.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/package-info.java similarity index 100% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/package-info.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/hibernate/package-info.java diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java similarity index 98% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java index c87f08f3fb716..6e546b04a7d2d 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java +++ b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStore.java @@ -52,6 +52,7 @@ import org.hibernate.SessionFactory; import org.hibernate.SharedSessionContract; import org.hibernate.cfg.Configuration; +import org.hibernate.resource.transaction.spi.TransactionStatus; import org.jetbrains.annotations.Nullable; /** @@ -239,7 +240,7 @@ private void rollback(SharedSessionContract ses, Transaction tx) { if (tx == null) { org.hibernate.Transaction hTx = ses.getTransaction(); - if (hTx != null && hTx.isActive()) + if (hTx != null && hTx.getStatus().canRollback()) hTx.rollback(); } } @@ -256,7 +257,7 @@ private void end(Session ses, Transaction tx) { if (tx == null) { org.hibernate.Transaction hTx = ses.getTransaction(); - if (hTx != null && hTx.isActive()) + if (hTx != null && hTx.getStatus() == TransactionStatus.ACTIVE) hTx.commit(); ses.close(); diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.hbm.xml b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.hbm.xml similarity index 100% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.hbm.xml rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.hbm.xml diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.java similarity index 100% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreEntry.java diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreFactory.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreFactory.java similarity index 100% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreFactory.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreFactory.java diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java similarity index 97% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java index 0f5a33c23f89d..8db956892a79b 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java +++ b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListener.java @@ -35,6 +35,7 @@ import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; +import org.hibernate.resource.transaction.spi.TransactionStatus; /** * Hibernate-based cache store session listener. @@ -206,10 +207,10 @@ public String getHibernateConfigurationPath() { if (hibSes.isDirty()) hibSes.flush(); - if (tx.isActive()) + if (tx.getStatus() == TransactionStatus.ACTIVE) tx.commit(); } - else if (tx.isActive()) + else if (tx.getStatus().canRollback()) tx.rollback(); } catch (HibernateException e) { diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/package-info.java b/modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/package-info.java similarity index 100% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/store/hibernate/package-info.java rename to modules/hibernate-5.1/src/main/java/org/apache/ignite/cache/store/hibernate/package-info.java diff --git a/modules/hibernate5/src/test/config/factory-cache.xml b/modules/hibernate-5.1/src/test/config/factory-cache.xml similarity index 100% rename from modules/hibernate5/src/test/config/factory-cache.xml rename to modules/hibernate-5.1/src/test/config/factory-cache.xml diff --git a/modules/hibernate5/src/test/config/factory-cache1.xml b/modules/hibernate-5.1/src/test/config/factory-cache1.xml similarity index 100% rename from modules/hibernate5/src/test/config/factory-cache1.xml rename to modules/hibernate-5.1/src/test/config/factory-cache1.xml diff --git a/modules/hibernate5/src/test/config/factory-incorrect-store-cache.xml b/modules/hibernate-5.1/src/test/config/factory-incorrect-store-cache.xml similarity index 100% rename from modules/hibernate5/src/test/config/factory-incorrect-store-cache.xml rename to modules/hibernate-5.1/src/test/config/factory-incorrect-store-cache.xml diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java similarity index 94% rename from modules/hibernate5/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java index 0cb36e9967266..0363c419509e0 100644 --- a/modules/hibernate5/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java +++ b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheConfigurationSelfTest.java @@ -43,10 +43,8 @@ import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC; import static org.apache.ignite.cache.CacheMode.PARTITIONED; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.DFLT_ACCESS_TYPE_PROPERTY; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.DFLT_CACHE_NAME_PROPERTY; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.IGNITE_INSTANCE_NAME_PROPERTY; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.REGION_CACHE_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.DFLT_CACHE_NAME_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.REGION_CACHE_PROPERTY; import static org.hibernate.cfg.AvailableSettings.CACHE_REGION_FACTORY; import static org.hibernate.cfg.AvailableSettings.GENERATE_STATISTICS; import static org.hibernate.cfg.AvailableSettings.HBM2DDL_AUTO; @@ -142,7 +140,7 @@ protected Configuration hibernateConfiguration(String igniteInstanceName) { cfg.addAnnotatedClass(Entity3.class); cfg.addAnnotatedClass(Entity4.class); - cfg.setProperty(DFLT_ACCESS_TYPE_PROPERTY, AccessType.NONSTRICT_READ_WRITE.name()); + cfg.setProperty(HibernateAccessStrategyFactory.DFLT_ACCESS_TYPE_PROPERTY, AccessType.NONSTRICT_READ_WRITE.name()); cfg.setProperty(HBM2DDL_AUTO, "create"); @@ -156,7 +154,7 @@ protected Configuration hibernateConfiguration(String igniteInstanceName) { cfg.setProperty(RELEASE_CONNECTIONS, "on_close"); - cfg.setProperty(IGNITE_INSTANCE_NAME_PROPERTY, igniteInstanceName); + cfg.setProperty(HibernateAccessStrategyFactory.IGNITE_INSTANCE_NAME_PROPERTY, igniteInstanceName); cfg.setProperty(REGION_CACHE_PROPERTY + ENTITY1_NAME, "cache1"); cfg.setProperty(REGION_CACHE_PROPERTY + ENTITY2_NAME, "cache2"); @@ -170,14 +168,14 @@ protected Configuration hibernateConfiguration(String igniteInstanceName) { } /** - * Tests property {@link HibernateRegionFactory#REGION_CACHE_PROPERTY}. + * Tests property {@link HibernateAccessStrategyFactory#REGION_CACHE_PROPERTY}. */ public void testPerRegionCacheProperty() { testCacheUsage(1, 1, 0, 1, 1); } /** - * Tests property {@link HibernateRegionFactory#DFLT_CACHE_NAME_PROPERTY}. + * Tests property {@link HibernateAccessStrategyFactory#DFLT_CACHE_NAME_PROPERTY}. */ public void testDefaultCache() { dfltCache = true; diff --git a/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java new file mode 100644 index 0000000000000..57a3f71138efa --- /dev/null +++ b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheMultiJvmTest.java @@ -0,0 +1,429 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.cache.hibernate; + +import java.util.Map; +import javax.persistence.Cacheable; +import javax.persistence.Id; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCompute; +import org.apache.ignite.IgniteLogger; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.binary.BinaryMarshaller; +import org.apache.ignite.lang.IgniteRunnable; +import org.apache.ignite.resources.IgniteInstanceResource; +import org.apache.ignite.resources.LoggerResource; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; + +import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.DFLT_CACHE_NAME_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateL2CacheSelfTest.CONNECTION_URL; +import static org.apache.ignite.cache.hibernate.HibernateL2CacheSelfTest.hibernateProperties; +import static org.hibernate.cache.spi.access.AccessType.NONSTRICT_READ_WRITE; + +/** + * + */ +public class HibernateL2CacheMultiJvmTest extends GridCommonAbstractTest { + /** */ + private static final String CACHE_NAME = "hibernateCache"; + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + if (!getTestIgniteInstanceName(0).equals(igniteInstanceName)) + cfg.setClientMode(true); + + CacheConfiguration ccfg = new CacheConfiguration(); + + ccfg.setName(CACHE_NAME); + ccfg.setWriteSynchronizationMode(FULL_SYNC); + + cfg.setCacheConfiguration(ccfg); + + cfg.setMarshaller(new BinaryMarshaller()); + + cfg.setPeerClassLoadingEnabled(false); + + return cfg; + } + + /** {@inheritDoc} */ + @Override protected boolean isMultiJvm() { + return true; + } + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + super.beforeTestsStarted(); + + startGrid(0); + + startGrid(1); + startGrid(2); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + stopAllGrids(); + + super.afterTestsStopped(); + } + + /** + * @throws Exception If failed. + */ + public void testL2Cache() throws Exception { + Ignite srv = ignite(0); + + { + IgniteCompute client1Compute = + srv.compute(srv.cluster().forNodeId(ignite(1).cluster().localNode().id())); + + client1Compute.run(new HibernateInsertRunnable()); + } + + { + IgniteCompute client2Compute = + srv.compute(srv.cluster().forNodeId(ignite(2).cluster().localNode().id())); + + client2Compute.run(new HibernateLoadRunnable()); + } + + { + IgniteCompute srvCompute = srv.compute(srv.cluster().forLocal()); + + srvCompute.run(new HibernateLoadRunnable()); + } + } + + /** + * + */ + private static class HibernateInsertRunnable extends HibernateBaseRunnable { + /** {@inheritDoc} */ + @Override public void run() { + SessionFactory sesFactory = startHibernate(ignite.name()); + + Session ses = sesFactory.openSession(); + + try { + Transaction tx = ses.beginTransaction(); + + for (int i = 0; i < 1; i++) { + { + Entity1 e = new Entity1(); + e.setId(i); + e.setName("name-" + i); + + ses.save(e); + } + + { + Entity2 e = new Entity2(); + e.setId(String.valueOf(i)); + e.setName("name-" + i); + + ses.save(e); + } + + { + Entity3 e = new Entity3(); + e.setId(i); + e.setName("name-" + i); + + ses.save(e); + } + } + + tx.commit(); + } + finally { + ses.close(); + } + } + } + + /** + * + */ + private static class HibernateLoadRunnable extends HibernateBaseRunnable { + /** {@inheritDoc} */ + @Override public void run() { + SessionFactory sesFactory = startHibernate(ignite.name()); + + Session ses = sesFactory.openSession(); + + try { + Transaction tx = ses.beginTransaction(); + + for (int i = 0; i < 1; i++) { + { + Entity1 e = (Entity1)ses.load(Entity1.class, i); + + log.info("Found: " + e.getName()); + } + { + Entity2 e = (Entity2)ses.load(Entity2.class, String.valueOf(i)); + + log.info("Found: " + e.getName()); + } + { + Entity3 e = (Entity3)ses.load(Entity3.class, (double)i); + + log.info("Found: " + e.getName()); + } + } + + tx.commit(); + } + finally { + ses.close(); + } + } + } + + /** + * + */ + private abstract static class HibernateBaseRunnable implements IgniteRunnable { + /** */ + @IgniteInstanceResource + protected Ignite ignite; + + /** */ + @LoggerResource + IgniteLogger log; + + /** + * @param nodeName Name of the grid providing caches. + * @return Session factory. + */ + SessionFactory startHibernate(String nodeName) { + log.info("Start hibernate on node: " + nodeName); + + StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); + + for (Map.Entry e : hibernateProperties(nodeName, NONSTRICT_READ_WRITE.name()).entrySet()) + builder.applySetting(e.getKey(), e.getValue()); + + builder.applySetting("hibernate.connection.url", CONNECTION_URL); + builder.applySetting(DFLT_CACHE_NAME_PROPERTY, CACHE_NAME); + + MetadataSources metadataSources = new MetadataSources(builder.build()); + + metadataSources.addAnnotatedClass(Entity1.class); + metadataSources.addAnnotatedClass(Entity2.class); + metadataSources.addAnnotatedClass(Entity3.class); + + return metadataSources.buildMetadata().buildSessionFactory(); + } + } + + /** + * Test Hibernate entity1. + */ + @javax.persistence.Entity + @Cacheable + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + public static class Entity1 { + /** */ + @Id + private int id; + + /** */ + private String name; + + /** + * @return ID. + */ + public int getId() { + return id; + } + + /** + * @param id ID. + */ + public void setId(int id) { + this.id = id; + } + + /** + * @return Name. + */ + public String getName() { + return name; + } + + /** + * @param name Name. + */ + public void setName(String name) { + this.name = name; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + Entity1 entity1 = (Entity1)o; + + return id == entity1.id; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return id; + } + } + + /** + * Test Hibernate entity1. + */ + @javax.persistence.Entity + @Cacheable + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + public static class Entity2 { + /** */ + @Id + private String id; + + /** */ + private String name; + + /** + * @return ID. + */ + public String getId() { + return id; + } + + /** + * @param id ID. + */ + public void setId(String id) { + this.id = id; + } + + /** + * @return Name. + */ + public String getName() { + return name; + } + + /** + * @param name Name. + */ + public void setName(String name) { + this.name = name; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + Entity2 entity2 = (Entity2)o; + + return id.equals(entity2.id); + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return id.hashCode(); + } + } + + /** + * Test Hibernate entity1. + */ + @javax.persistence.Entity + @Cacheable + @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) + public static class Entity3 { + /** */ + @Id + private double id; + + /** */ + private String name; + + /** + * @return ID. + */ + public double getId() { + return id; + } + + /** + * @param id ID. + */ + public void setId(double id) { + this.id = id; + } + + /** + * @return Name. + */ + public String getName() { + return name; + } + + /** + * @param name Name. + */ + public void setName(String name) { + this.name = name; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + Entity3 entity3 = (Entity3)o; + + return Double.compare(entity3.id, id) == 0; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + long temp = Double.doubleToLongBits(id); + return (int)(temp ^ (temp >>> 32)); + } + } +} diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java similarity index 97% rename from modules/hibernate5/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java index f847c975b4e8b..f227af1661664 100644 --- a/modules/hibernate5/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java +++ b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheSelfTest.java @@ -29,7 +29,6 @@ import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.OneToOne; -import javax.persistence.PersistenceException; import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; @@ -44,6 +43,7 @@ import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.hibernate.StaleStateException; import org.hibernate.Transaction; import org.hibernate.annotations.NaturalId; import org.hibernate.annotations.NaturalIdCache; @@ -65,9 +65,10 @@ import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; import static org.apache.ignite.cache.CacheMode.PARTITIONED; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.DFLT_ACCESS_TYPE_PROPERTY; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.IGNITE_INSTANCE_NAME_PROPERTY; -import static org.apache.ignite.cache.hibernate.HibernateRegionFactory.REGION_CACHE_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.DFLT_ACCESS_TYPE_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.IGNITE_INSTANCE_NAME_PROPERTY; +import static org.apache.ignite.cache.hibernate.HibernateAccessStrategyFactory.REGION_CACHE_PROPERTY; +import static org.hibernate.cache.spi.access.AccessType.NONSTRICT_READ_WRITE; import static org.hibernate.cfg.Environment.CACHE_REGION_FACTORY; import static org.hibernate.cfg.Environment.GENERATE_STATISTICS; import static org.hibernate.cfg.Environment.HBM2DDL_AUTO; @@ -936,7 +937,7 @@ private void testTwoEntitiesSameCache(AccessType accessType) throws Exception { fail("Commit must fail."); } - catch (PersistenceException e) { + catch (ConstraintViolationException e) { log.info("Expected exception: " + e); tx.rollback(); @@ -1077,7 +1078,7 @@ private void testVersionedEntity(AccessType accessType) throws Exception { fail("Commit must fail."); } - catch (PersistenceException e) { + catch (StaleStateException e) { log.info("Expected exception: " + e); } finally { @@ -1113,8 +1114,6 @@ private void testVersionedEntity(AccessType accessType) throws Exception { * @throws Exception If failed. */ public void testNaturalIdCache() throws Exception { - fail("https://issues.apache.org/jira/browse/IGNITE-1084"); - for (AccessType accessType : accessTypes()) testNaturalIdCache(accessType); } @@ -1319,7 +1318,7 @@ private void testEntityCacheTransactionFails(AccessType accessType) throws Excep fail("Commit must fail."); } - catch (PersistenceException e) { + catch (ConstraintViolationException e) { log.info("Expected exception: " + e); tx.rollback(); @@ -1352,7 +1351,7 @@ private void testEntityCacheTransactionFails(AccessType accessType) throws Excep fail("Commit must fail."); } - catch (PersistenceException e) { + catch (ConstraintViolationException e) { log.info("Expected exception: " + e); tx.rollback(); @@ -1396,7 +1395,7 @@ private void testEntityCacheTransactionFails(AccessType accessType) throws Excep fail("Commit must fail."); } - catch (PersistenceException e) { + catch (ConstraintViolationException e) { log.info("Expected exception: " + e); tx.rollback(); @@ -1423,7 +1422,7 @@ private void testEntityCacheTransactionFails(AccessType accessType) throws Excep fail("Commit must fail."); } - catch (PersistenceException e) { + catch (ConstraintViolationException e) { log.info("Expected exception: " + e); tx.rollback(); @@ -1886,18 +1885,11 @@ private void createSessionFactories(AccessType accessType) { private SessionFactory startHibernate(org.hibernate.cache.spi.access.AccessType accessType, String igniteInstanceName) { StandardServiceRegistryBuilder builder = registryBuilder(); - builder.applySetting(HBM2DDL_AUTO, "create"); - builder.applySetting(GENERATE_STATISTICS, "true"); - builder.applySetting(USE_SECOND_LEVEL_CACHE, "true"); - builder.applySetting(USE_QUERY_CACHE, "true"); - builder.applySetting(CACHE_REGION_FACTORY, HibernateRegionFactory.class.getName()); - builder.applySetting(RELEASE_CONNECTIONS, "on_close"); - builder.applySetting(IGNITE_INSTANCE_NAME_PROPERTY, igniteInstanceName); + for (Map.Entry e : hibernateProperties(igniteInstanceName, accessType.name()).entrySet()) + builder.applySetting(e.getKey(), e.getValue()); + // Use the same cache for Entity and Entity2. builder.applySetting(REGION_CACHE_PROPERTY + ENTITY2_NAME, ENTITY_NAME); - builder.applySetting(DFLT_ACCESS_TYPE_PROPERTY, accessType.name()); - builder.applySetting(Environment.DIALECT, "org.hibernate.dialect.H2Dialect"); - builder.applySetting("hibernate.show_sql", false); StandardServiceRegistry srvcRegistry = builder.build(); @@ -1945,4 +1937,24 @@ private void cleanup() throws Exception { for (IgniteCacheProxy cache : ((IgniteKernal)grid(0)).caches()) cache.clear(); } + + /** + * @param igniteInstanceName Node name. + * @param dfltAccessType Default cache access type. + * @return Properties map. + */ + static Map hibernateProperties(String igniteInstanceName, String dfltAccessType) { + Map map = new HashMap<>(); + + map.put(HBM2DDL_AUTO, "create"); + map.put(GENERATE_STATISTICS, "true"); + map.put(USE_SECOND_LEVEL_CACHE, "true"); + map.put(USE_QUERY_CACHE, "true"); + map.put(CACHE_REGION_FACTORY, HibernateRegionFactory.class.getName()); + map.put(RELEASE_CONNECTIONS, "on_close"); + map.put(IGNITE_INSTANCE_NAME_PROPERTY, igniteInstanceName); + map.put(DFLT_ACCESS_TYPE_PROPERTY, dfltAccessType); + + return map; + } } \ No newline at end of file diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalSelfTest.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalSelfTest.java similarity index 100% rename from modules/hibernate5/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalSelfTest.java rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalSelfTest.java diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalUseSyncSelfTest.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalUseSyncSelfTest.java similarity index 100% rename from modules/hibernate5/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalUseSyncSelfTest.java rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/hibernate/HibernateL2CacheTransactionalUseSyncSelfTest.java diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreNodeRestartTest.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreNodeRestartTest.java similarity index 100% rename from modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreNodeRestartTest.java rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreNodeRestartTest.java diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java similarity index 86% rename from modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java index d3d2b52082d50..c62db4ab619c2 100644 --- a/modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java +++ b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateBlobStoreSelfTest.java @@ -24,6 +24,7 @@ import org.hibernate.FlushMode; import org.hibernate.Session; import org.hibernate.Transaction; +import org.hibernate.resource.transaction.spi.TransactionStatus; /** * Cache store test. @@ -52,7 +53,7 @@ public CacheHibernateBlobStoreSelfTest() throws Exception { Transaction hTx = s.getTransaction(); - if (hTx != null && hTx.isActive()) + if (hTx != null && hTx.getStatus() == TransactionStatus.ACTIVE) hTx.commit(); } finally { @@ -69,8 +70,8 @@ public CacheHibernateBlobStoreSelfTest() throws Exception { * @throws Exception If failed. */ public void testConfigurationByUrl() throws Exception { - URL url = U.resolveIgniteUrl( - "modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml"); + URL url = U.resolveIgniteUrl(CacheHibernateStoreFactorySelfTest.MODULE_PATH + + "/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml"); assert url != null; @@ -84,8 +85,8 @@ public void testConfigurationByUrl() throws Exception { * @throws Exception If failed. */ public void testConfigurationByFile() throws Exception { - URL url = U.resolveIgniteUrl( - "modules/hibernate/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml"); + URL url = U.resolveIgniteUrl(CacheHibernateStoreFactorySelfTest.MODULE_PATH + + "/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml"); assert url != null; diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java similarity index 76% rename from modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java index d158f819b88c7..7d4f28005dc4a 100644 --- a/modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java +++ b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreFactorySelfTest.java @@ -18,18 +18,11 @@ package org.apache.ignite.cache.store.hibernate; import java.sql.Connection; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; import javax.naming.NamingException; import javax.naming.Reference; -import javax.persistence.EntityGraph; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceUnitUtil; -import javax.persistence.Query; -import javax.persistence.SynchronizationType; -import javax.persistence.criteria.CriteriaBuilder; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteException; @@ -39,7 +32,6 @@ import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.hibernate.Cache; import org.hibernate.HibernateException; -import org.hibernate.Metamodel; import org.hibernate.Session; import org.hibernate.SessionBuilder; import org.hibernate.SessionFactory; @@ -59,6 +51,9 @@ public class CacheHibernateStoreFactorySelfTest extends GridCommonAbstractTest { /** Cache name. */ private static final String CACHE_NAME = "test"; + /** */ + static final String MODULE_PATH = "modules/hibernate-5.1/"; + /** * @throws Exception If failed. */ @@ -74,8 +69,8 @@ public void testCacheConfiguration() throws Exception { * @throws Exception If failed. */ public void testXmlConfiguration() throws Exception { - try (Ignite ignite = Ignition.start("modules/hibernate/src/test/config/factory-cache.xml")) { - try(Ignite ignite1 = Ignition.start("modules/hibernate/src/test/config/factory-cache1.xml")) { + try (Ignite ignite = Ignition.start(MODULE_PATH + "/src/test/config/factory-cache.xml")) { + try(Ignite ignite1 = Ignition.start(MODULE_PATH + "/src/test/config/factory-cache1.xml")) { checkStore(ignite.cache(CACHE_NAME), DummySessionFactoryExt.class); checkStore(ignite1.cache(CACHE_NAME), DummySessionFactory.class); @@ -91,7 +86,7 @@ public void testIncorrectBeanConfiguration() throws Exception { GridTestUtils.assertThrows(log, new Callable() { @Override public Object call() throws Exception { try(Ignite ignite = - Ignition.start("modules/hibernate/src/test/config/factory-incorrect-store-cache.xml")) { + Ignition.start(MODULE_PATH + "/src/test/config/factory-incorrect-store-cache.xml")) { ignite.cache(CACHE_NAME).getConfiguration(CacheConfiguration.class). getCacheStoreFactory().create(); } @@ -257,70 +252,5 @@ public static class DummySessionFactory implements SessionFactory { @Override public Reference getReference() throws NamingException { return null; } - - /** {@inheritDoc} */ - @Override public EntityManager createEntityManager() { - return null; - } - - /** {@inheritDoc} */ - @Override public EntityManager createEntityManager(Map map) { - return null; - } - - /** {@inheritDoc} */ - @Override public EntityManager createEntityManager(SynchronizationType synchronizationType) { - return null; - } - - /** {@inheritDoc} */ - @Override public EntityManager createEntityManager(SynchronizationType synchronizationType, Map map) { - return null; - } - - /** {@inheritDoc} */ - @Override public CriteriaBuilder getCriteriaBuilder() { - return null; - } - - /** {@inheritDoc} */ - @Override public boolean isOpen() { - return false; - } - - /** {@inheritDoc} */ - @Override public Map getProperties() { - return null; - } - - /** {@inheritDoc} */ - @Override public PersistenceUnitUtil getPersistenceUnitUtil() { - return null; - } - - /** {@inheritDoc} */ - @Override public void addNamedQuery(String s, Query qry) { - // No-op. - } - - /** {@inheritDoc} */ - @Override public T unwrap(Class aCls) { - return null; - } - - /** {@inheritDoc} */ - @Override public void addNamedEntityGraph(String s, EntityGraph entityGraph) { - // No-op. - } - - /** {@inheritDoc} */ - @Override public List> findEntityGraphsByType(Class entityCls) { - return null; - } - - /** {@inheritDoc} */ - @Override public Metamodel getMetamodel() { - return null; - } } } \ No newline at end of file diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java similarity index 96% rename from modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java index c4d6120356854..0010425f2ea12 100644 --- a/modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java +++ b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/CacheHibernateStoreSessionListenerSelfTest.java @@ -41,6 +41,7 @@ import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; +import org.hibernate.resource.transaction.spi.TransactionStatus; /** * Tests for {@link CacheJdbcStoreSessionListener}. @@ -156,9 +157,9 @@ private void checkSession() { assertNotNull(tx); if (ses.isWithinTransaction()) - assertTrue(tx.isActive()); + assertEquals(TransactionStatus.ACTIVE, tx.getStatus()); else - assertFalse(tx.isActive()); + assertFalse("Unexpected status: " + tx.getStatus(), tx.getStatus() == TransactionStatus.ACTIVE); verifySameInstance(hibSes); } diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml similarity index 100% rename from modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/hibernate.cfg.xml diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/package-info.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/package-info.java similarity index 100% rename from modules/hibernate5/src/test/java/org/apache/ignite/cache/store/hibernate/package-info.java rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/cache/store/hibernate/package-info.java diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/testsuites/IgniteBinaryHibernate5TestSuite.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/testsuites/IgniteBinaryHibernate5TestSuite.java similarity index 100% rename from modules/hibernate5/src/test/java/org/apache/ignite/testsuites/IgniteBinaryHibernate5TestSuite.java rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/testsuites/IgniteBinaryHibernate5TestSuite.java diff --git a/modules/hibernate5/src/test/java/org/apache/ignite/testsuites/IgniteHibernate5TestSuite.java b/modules/hibernate-5.1/src/test/java/org/apache/ignite/testsuites/IgniteHibernate5TestSuite.java similarity index 100% rename from modules/hibernate5/src/test/java/org/apache/ignite/testsuites/IgniteHibernate5TestSuite.java rename to modules/hibernate-5.1/src/test/java/org/apache/ignite/testsuites/IgniteHibernate5TestSuite.java diff --git a/modules/hibernate-core/pom.xml b/modules/hibernate-core/pom.xml new file mode 100644 index 0000000000000..91ec68bfaf207 --- /dev/null +++ b/modules/hibernate-core/pom.xml @@ -0,0 +1,76 @@ + + + + + + + 4.0.0 + + + org.apache.ignite + ignite-parent + 1 + ../../parent + + + ignite-hibernate-core + 2.0.0-SNAPSHOT + http://ignite.apache.org + + + + org.apache.ignite + ignite-core + ${project.version} + + + + org.apache.ignite + ignite-jta + ${project.version} + test + + + + + + + src/main/java + + **/*.java + + + + src/test/java + + **/*.java + + + + + + + + org.apache.felix + maven-bundle-plugin + + + + diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyAdapter.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyAdapter.java similarity index 64% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyAdapter.java rename to modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyAdapter.java index f6c1d0e15eb43..557b018ebb4b7 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyAdapter.java +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyAdapter.java @@ -23,24 +23,16 @@ import java.io.ObjectOutput; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.processors.cache.IgniteInternalCache; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteCallable; import org.apache.ignite.resources.IgniteInstanceResource; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.access.CollectionRegionAccessStrategy; -import org.hibernate.cache.spi.access.EntityRegionAccessStrategy; -import org.hibernate.cache.spi.access.NaturalIdRegionAccessStrategy; -import org.hibernate.cache.spi.access.RegionAccessStrategy; -import org.hibernate.cache.spi.access.SoftLock; import org.jetbrains.annotations.Nullable; /** - * Common interface used to implement Hibernate L2 cache access strategies ({@link RegionAccessStrategy}, - * {@link EntityRegionAccessStrategy} and {@link CollectionRegionAccessStrategy}). + * Common interface used to implement Hibernate L2 cache access strategies. *

* The expected sequences of steps related to various CRUD operations executed by Hibernate are: *

@@ -94,6 +86,9 @@ public abstract class HibernateAccessStrategyAdapter { /** */ protected final HibernateCacheProxy cache; + /** */ + private final HibernateExceptionConverter eConverter; + /** Grid. */ protected final Ignite ignite; @@ -101,187 +96,164 @@ public abstract class HibernateAccessStrategyAdapter { protected final IgniteLogger log; /** - * @param ignite Grid. + * @param ignite Node. * @param cache Cache. + * @param eConverter Exception converter. */ - protected HibernateAccessStrategyAdapter(Ignite ignite, HibernateCacheProxy cache) { + protected HibernateAccessStrategyAdapter(Ignite ignite, + HibernateCacheProxy cache, + HibernateExceptionConverter eConverter) { this.cache = cache; this.ignite = ignite; + this.eConverter = eConverter; - log = ignite.log(); + log = ignite.log().getLogger(getClass()); + } + + /** + * @param e Exception. + * @return Runtime exception to be thrown. + */ + final RuntimeException convertException(Exception e) { + return eConverter.convert(e); } /** - * Gets value from cache. Used by {@link RegionAccessStrategy#get}. - * * @param key Key. * @return Cached value. - * @throws CacheException If failed. */ - @Nullable protected Object get(Object key) throws CacheException { + @Nullable public Object get(Object key) { try { return cache.get(key); } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } } /** - * Puts in cache value loaded from the database. Used by {@link RegionAccessStrategy#putFromLoad}. - * * @param key Key. * @param val Value. * @param minimalPutOverride MinimalPut flag - * @throws CacheException If failed. */ - protected void putFromLoad(Object key, Object val, boolean minimalPutOverride) throws CacheException { + public void putFromLoad(Object key, Object val, boolean minimalPutOverride) { putFromLoad(key, val); } /** - * Puts in cache value loaded from the database. Used by {@link RegionAccessStrategy#putFromLoad}. + * Puts in cache value loaded from the database. * * @param key Key. * @param val Value. - * @throws CacheException If failed. */ - protected void putFromLoad(Object key, Object val) throws CacheException { + public void putFromLoad(Object key, Object val) { try { cache.put(key, val); } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } } /** * Called during database transaction execution before Hibernate attempts to update or remove given key. - * Used by {@link RegionAccessStrategy#lockItem}. * * @param key Key. - * @return Lock representation or {@code null}. - * @throws CacheException If failed. */ - @Nullable protected abstract SoftLock lock(Object key) throws CacheException; + public abstract void lock(Object key); /** * Called after Hibernate failed to update or successfully removed given key. - * Used by {@link RegionAccessStrategy#unlockItem}. * * @param key Key. - * @param lock The lock previously obtained from {@link #lock} - * @throws CacheException If failed. */ - protected abstract void unlock(Object key, SoftLock lock) throws CacheException; + public abstract void unlock(Object key); /** * Called after Hibernate updated object in the database but before transaction completed. - * Used by {@link EntityRegionAccessStrategy#update} and {@link NaturalIdRegionAccessStrategy#update}. * * @param key Key. * @param val Value. * @return {@code True} if operation updated cache. - * @throws CacheException If failed. */ - protected abstract boolean update(Object key, Object val) throws CacheException; + public abstract boolean update(Object key, Object val); /** * Called after Hibernate updated object in the database and transaction successfully completed. - * Used by {@link EntityRegionAccessStrategy#afterUpdate} and {@link NaturalIdRegionAccessStrategy#afterUpdate}. * * @param key Key. * @param val Value. - * @param lock The lock previously obtained from {@link #lock} * @return {@code True} if operation updated cache. - * @throws CacheException If failed. */ - protected abstract boolean afterUpdate(Object key, Object val, SoftLock lock) throws CacheException; + public abstract boolean afterUpdate(Object key, Object val); /** * Called after Hibernate inserted object in the database but before transaction completed. - * Used by {@link EntityRegionAccessStrategy#insert} and {@link NaturalIdRegionAccessStrategy#insert}. * * @param key Key. * @param val Value. * @return {@code True} if operation updated cache. - * @throws CacheException If failed. */ - protected abstract boolean insert(Object key, Object val) throws CacheException; + public abstract boolean insert(Object key, Object val); /** * Called after Hibernate inserted object in the database and transaction successfully completed. - * Used by {@link EntityRegionAccessStrategy#afterInsert} and {@link NaturalIdRegionAccessStrategy#afterInsert}. * * @param key Key. * @param val Value. * @return {@code True} if operation updated cache. - * @throws CacheException If failed. */ - protected abstract boolean afterInsert(Object key, Object val) throws CacheException; + public abstract boolean afterInsert(Object key, Object val); /** * Called after Hibernate removed object from database but before transaction completed. - * Used by {@link RegionAccessStrategy#remove}. * * @param key Key, - * @throws CacheException If failed. */ - protected abstract void remove(Object key) throws CacheException; + public abstract void remove(Object key); /** * Called to remove object from cache without regard to transaction. - * Used by {@link RegionAccessStrategy#evict}. * * @param key Key. - * @throws CacheException If failed. */ - protected void evict(Object key) throws CacheException { + public void evict(Object key) { evict(ignite, cache, key); } /** * Called to remove all data from cache without regard to transaction. - * Used by {@link RegionAccessStrategy#evictAll}. - * - * @throws CacheException If failed. */ - protected void evictAll() throws CacheException { - evictAll(cache); + public void evictAll() { + try { + evictAll(cache); + } + catch (IgniteCheckedException e) { + throw convertException(e); + } } /** - * Called during database transaction execution before Hibernate executed - * update operation which should invalidate entire cache region. - * Used by {@link RegionAccessStrategy#lockRegion}. - * - * @throws CacheException If failed. - * @return Lock representation or {@code null}. + * Called during database transaction execution to clear entire cache region after + * Hibernate executed database update, but before transaction completed. */ - @Nullable protected SoftLock lockRegion() throws CacheException { - return null; + public final void removeAll() { + evictAll(); } /** - * Called after transaction clearing entire cache region completed. - * Used by {@link RegionAccessStrategy#unlockRegion}. - * - * @param lock The lock previously obtained from {@link #lockRegion} - * @throws CacheException If failed. + * Called during database transaction execution before Hibernate executed + * update operation which should invalidate entire cache region. */ - protected void unlockRegion(SoftLock lock) throws CacheException { + public void lockRegion() { // No-op. } /** - * Called during database transaction execution to clear entire cache region after - * Hibernate executed database update, but before transaction completed. - * Used by {@link RegionAccessStrategy#removeAll}. - * - * @throws CacheException If failed. + * Called after transaction clearing entire cache region completed. */ - protected final void removeAll() throws CacheException { - evictAll(); + public void unlockRegion() { + // No-op. } /** @@ -290,32 +262,21 @@ protected final void removeAll() throws CacheException { * @param ignite Grid. * @param cache Cache. * @param key Key. - * @throws CacheException If failed. */ - static void evict(Ignite ignite, HibernateCacheProxy cache, Object key) throws CacheException { - try { - key = cache.keyTransformer().transform(key); + public static void evict(Ignite ignite, HibernateCacheProxy cache, Object key) { + key = cache.keyTransformer().transform(key); - ignite.compute(ignite.cluster()).call(new ClearKeyCallable(key, cache.name())); - } - catch (IgniteException e) { - throw new CacheException(e); - } + ignite.compute(ignite.cluster()).call(new ClearKeyCallable(key, cache.name())); } /** * Called to remove all data from cache without regard to transaction. * * @param cache Cache. - * @throws CacheException If failed. + * @throws IgniteCheckedException If failed. */ - static void evictAll(IgniteInternalCache cache) throws CacheException { - try { - cache.clear(); - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } + public static void evictAll(IgniteInternalCache cache) throws IgniteCheckedException { + cache.clear(); } /** diff --git a/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyFactory.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyFactory.java new file mode 100644 index 0000000000000..0226c1ca8c2de --- /dev/null +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyFactory.java @@ -0,0 +1,235 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.cache.hibernate; + +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteException; +import org.apache.ignite.IgniteLogger; +import org.apache.ignite.Ignition; +import org.apache.ignite.configuration.TransactionConfiguration; +import org.apache.ignite.internal.IgniteKernal; +import org.apache.ignite.internal.processors.cache.IgniteInternalCache; +import org.apache.ignite.internal.util.typedef.G; + +import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; + +/** + * Access strategy factory. + */ +public class HibernateAccessStrategyFactory { + /** */ + private final HibernateKeyTransformer keyTransformer; + + /** */ + private final HibernateExceptionConverter eConverter; + + /** + * Hibernate L2 cache grid name property name. + * + * @deprecated Use {@link #IGNITE_INSTANCE_NAME_PROPERTY}. + * If {@link #IGNITE_INSTANCE_NAME_PROPERTY} is specified it takes precedence. + */ + @Deprecated + public static final String GRID_NAME_PROPERTY = "org.apache.ignite.hibernate.grid_name"; + + /** Hibernate L2 cache Ignite instance name property name. */ + public static final String IGNITE_INSTANCE_NAME_PROPERTY = "org.apache.ignite.hibernate.ignite_instance_name"; + + /** Default cache property name. */ + public static final String DFLT_CACHE_NAME_PROPERTY = "org.apache.ignite.hibernate.default_cache"; + + /** Property prefix used to specify region name to cache name mapping. */ + public static final String REGION_CACHE_PROPERTY = "org.apache.ignite.hibernate.region_cache."; + + /** */ + public static final String DFLT_ACCESS_TYPE_PROPERTY = "org.apache.ignite.hibernate.default_access_type"; + + /** */ + public static final String GRID_CONFIG_PROPERTY = "org.apache.ignite.hibernate.grid_config"; + + /** Grid providing caches. */ + private Ignite ignite; + + /** Default cache. */ + private HibernateCacheProxy dfltCache; + + /** Region name to cache name mapping. */ + private final Map regionCaches = new HashMap<>(); + + /** */ + private final ThreadLocal threadLoc = new ThreadLocal(); + + /** */ + private final ConcurrentHashMap threadLocMap = new ConcurrentHashMap<>(); + + /** + * @param keyTransformer Key transformer. + * @param eConverter Exception converter. + */ + HibernateAccessStrategyFactory(HibernateKeyTransformer keyTransformer, HibernateExceptionConverter eConverter) { + this.keyTransformer = keyTransformer; + this.eConverter = eConverter; + } + + /** + * @param props Properties. + */ + public void start(Properties props) { + String gridCfg = props.getProperty(GRID_CONFIG_PROPERTY); + String igniteInstanceName = props.getProperty(IGNITE_INSTANCE_NAME_PROPERTY); + + if (igniteInstanceName == null) + igniteInstanceName = props.getProperty(GRID_NAME_PROPERTY); + + if (gridCfg != null) { + try { + ignite = G.start(gridCfg); + } + catch (IgniteException e) { + throw eConverter.convert(e); + } + } + else + ignite = Ignition.ignite(igniteInstanceName); + + for (Map.Entry prop : props.entrySet()) { + String key = prop.getKey().toString(); + + if (key.startsWith(REGION_CACHE_PROPERTY)) { + String regionName = key.substring(REGION_CACHE_PROPERTY.length()); + + String cacheName = prop.getValue().toString(); + + if (((IgniteKernal)ignite).getCache(cacheName) == null) + throw new IllegalArgumentException("Cache '" + cacheName + "' specified for region '" + regionName + "' " + + "is not configured."); + + regionCaches.put(regionName, cacheName); + } + } + + String dfltCacheName = props.getProperty(DFLT_CACHE_NAME_PROPERTY); + + if (dfltCacheName != null) { + IgniteInternalCache dfltCache = ((IgniteKernal)ignite).getCache(dfltCacheName); + + if (dfltCache == null) + throw new IllegalArgumentException("Cache specified as default is not configured: " + dfltCacheName); + + this.dfltCache = new HibernateCacheProxy(dfltCache, keyTransformer); + } + + IgniteLogger log = ignite.log().getLogger(getClass()); + + if (log.isDebugEnabled()) + log.debug("HibernateRegionFactory started [igniteInstanceName=" + igniteInstanceName + ']'); + } + + /** + * @return Ignite node. + */ + public Ignite node() { + return ignite; + } + + /** + * @param regionName L2 cache region name. + * @return Cache for given region. + */ + HibernateCacheProxy regionCache(String regionName) { + String cacheName = regionCaches.get(regionName); + + if (cacheName == null) { + if (dfltCache != null) + return dfltCache; + + cacheName = regionName; + } + + IgniteInternalCache cache = ((IgniteKernal)ignite).getCache(cacheName); + + if (cache == null) + throw new IllegalArgumentException("Cache '" + cacheName + "' for region '" + regionName + "' is not configured."); + + return new HibernateCacheProxy(cache, keyTransformer); + } + + /** + * @param cache Cache. + * @return Access strategy implementation. + */ + HibernateAccessStrategyAdapter createReadOnlyStrategy(HibernateCacheProxy cache) { + return new HibernateReadOnlyAccessStrategy(ignite, cache, eConverter); + } + + /** + * @param cache Cache. + * @return Access strategy implementation. + */ + HibernateAccessStrategyAdapter createNonStrictReadWriteStrategy(HibernateCacheProxy cache) { + ThreadLocal threadLoc = threadLocMap.get(cache.name()); + + if (threadLoc == null) { + ThreadLocal old = threadLocMap.putIfAbsent(cache.name(), threadLoc = new ThreadLocal()); + + if (old != null) + threadLoc = old; + } + + return new HibernateNonStrictAccessStrategy(ignite, cache, threadLoc, eConverter); + } + + /** + * @param cache Cache. + * @return Access strategy implementation. + */ + HibernateAccessStrategyAdapter createReadWriteStrategy(HibernateCacheProxy cache) { + if (cache.configuration().getAtomicityMode() != TRANSACTIONAL) + throw new IllegalArgumentException("Hibernate READ-WRITE access strategy must have Ignite cache with " + + "'TRANSACTIONAL' atomicity mode: " + cache.name()); + + return new HibernateReadWriteAccessStrategy(ignite, cache, threadLoc, eConverter); + } + + /** + * @param cache Cache. + * @return Access strategy implementation. + */ + HibernateAccessStrategyAdapter createTransactionalStrategy(HibernateCacheProxy cache) { + if (cache.configuration().getAtomicityMode() != TRANSACTIONAL) + throw new IllegalArgumentException("Hibernate TRANSACTIONAL access strategy must have Ignite cache with " + + "'TRANSACTIONAL' atomicity mode: " + cache.name()); + + TransactionConfiguration txCfg = ignite.configuration().getTransactionConfiguration(); + + if (txCfg == null || + (txCfg.getTxManagerFactory() == null + && txCfg.getTxManagerLookupClassName() == null + && cache.configuration().getTransactionManagerLookupClassName() == null)) { + throw new IllegalArgumentException("Hibernate TRANSACTIONAL access strategy must have Ignite with " + + "Factory configured (see IgniteConfiguration." + + "getTransactionConfiguration().setTxManagerFactory()): " + cache.name()); + } + + return new HibernateTransactionalAccessStrategy(ignite, cache, eConverter); + } +} diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateCacheProxy.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateCacheProxy.java similarity index 99% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateCacheProxy.java rename to modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateCacheProxy.java index 7204083dfef28..3d439dd3d4def 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateCacheProxy.java +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateCacheProxy.java @@ -77,7 +77,7 @@ public class HibernateCacheProxy implements IgniteInternalCache /** * @return HibernateKeyTransformer */ - HibernateKeyTransformer keyTransformer(){ + public HibernateKeyTransformer keyTransformer(){ return keyTransformer; } diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyTransformer.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateExceptionConverter.java similarity index 63% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyTransformer.java rename to modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateExceptionConverter.java index ecad0b602ec1a..110bec5ae539d 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyTransformer.java +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateExceptionConverter.java @@ -1,12 +1,12 @@ /* * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with + * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -18,11 +18,12 @@ package org.apache.ignite.cache.hibernate; /** - * An interface for transforming hibernate keys to Ignite keys. + * Converts Ignite errors into Hibernate runtime exceptions. */ -public interface HibernateKeyTransformer { +public interface HibernateExceptionConverter { /** - * @param key Hibernate key. + * @param e Exception. + * @return Converted exception. */ - public Object transform(Object key); + public RuntimeException convert(Exception e); } diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyTransformer.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyTransformer.java similarity index 97% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyTransformer.java rename to modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyTransformer.java index ecad0b602ec1a..97fc0e9eb15e6 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyTransformer.java +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateKeyTransformer.java @@ -23,6 +23,7 @@ public interface HibernateKeyTransformer { /** * @param key Hibernate key. + * @return Transformed key. */ public Object transform(Object key); } diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java similarity index 81% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java rename to modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java index a36d7e786d739..06c6f3d3a6b43 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java @@ -17,20 +17,18 @@ package org.apache.ignite.cache.hibernate; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.internal.util.GridLeanMap; import org.apache.ignite.internal.util.GridLeanSet; +import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.F; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.access.AccessType; -import org.hibernate.cache.spi.access.SoftLock; -import org.jetbrains.annotations.Nullable; +import org.apache.ignite.internal.util.typedef.internal.S; /** - * Implementation of {@link AccessType#NONSTRICT_READ_WRITE} cache access strategy. + * Implementation of NONSTRICT_READ_WRITE cache access strategy. *

* Configuration of L2 cache and per-entity cache access strategy can be set in the * Hibernate configuration file: @@ -65,27 +63,29 @@ public class HibernateNonStrictAccessStrategy extends HibernateAccessStrategyAda * @param ignite Grid. * @param cache Cache. * @param writeCtx Thread local instance used to track updates done during one Hibernate transaction. + * @param eConverter Exception converter. */ - protected HibernateNonStrictAccessStrategy(Ignite ignite, HibernateCacheProxy cache, ThreadLocal writeCtx) { - super(ignite, cache); + HibernateNonStrictAccessStrategy(Ignite ignite, + HibernateCacheProxy cache, + ThreadLocal writeCtx, + HibernateExceptionConverter eConverter) { + super(ignite, cache, eConverter); this.writeCtx = (ThreadLocal)writeCtx; } /** {@inheritDoc} */ - @Nullable @Override protected SoftLock lock(Object key) throws CacheException { + @Override public void lock(Object key) { WriteContext ctx = writeCtx.get(); if (ctx == null) writeCtx.set(ctx = new WriteContext()); ctx.locked(key); - - return null; } /** {@inheritDoc} */ - @Override protected void unlock(Object key, SoftLock lock) throws CacheException { + @Override public void unlock(Object key) { try { WriteContext ctx = writeCtx.get(); @@ -96,23 +96,23 @@ protected HibernateNonStrictAccessStrategy(Ignite ignite, HibernateCacheProxy ca } } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } } /** {@inheritDoc} */ - @Override protected boolean update(Object key, Object val) throws CacheException { + @Override public boolean update(Object key, Object val) { return false; } /** {@inheritDoc} */ - @Override protected boolean afterUpdate(Object key, Object val, SoftLock lock) throws CacheException { + @Override public boolean afterUpdate(Object key, Object val) { WriteContext ctx = writeCtx.get(); if (ctx != null) { ctx.updated(key, val); - unlock(key, lock); + unlock(key); return true; } @@ -121,24 +121,24 @@ protected HibernateNonStrictAccessStrategy(Ignite ignite, HibernateCacheProxy ca } /** {@inheritDoc} */ - @Override protected boolean insert(Object key, Object val) throws CacheException { + @Override public boolean insert(Object key, Object val) { return false; } /** {@inheritDoc} */ - @Override protected boolean afterInsert(Object key, Object val) throws CacheException { + @Override public boolean afterInsert(Object key, Object val) { try { cache.put(key, val); return true; } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } } /** {@inheritDoc} */ - @Override protected void remove(Object key) throws CacheException { + @Override public void remove(Object key) { WriteContext ctx = writeCtx.get(); if (ctx != null) @@ -151,12 +151,15 @@ protected HibernateNonStrictAccessStrategy(Ignite ignite, HibernateCacheProxy ca @SuppressWarnings("TypeMayBeWeakened") private static class WriteContext { /** */ + @GridToStringInclude private Map updates; /** */ + @GridToStringInclude private Set rmvs; /** */ + @GridToStringInclude private Set locked = new GridLeanSet<>(); /** @@ -188,7 +191,7 @@ boolean unlocked(Object key) { */ void updated(Object key, Object val) { if (updates == null) - updates = new GridLeanMap<>(); + updates = new LinkedHashMap<>(); updates.put(key, val); } @@ -218,5 +221,10 @@ void updateCache(HibernateCacheProxy cache) throws IgniteCheckedException { if (!F.isEmpty(updates)) cache.putAll(updates); } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(WriteContext.class, this); + } } } \ No newline at end of file diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadOnlyAccessStrategy.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadOnlyAccessStrategy.java similarity index 72% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadOnlyAccessStrategy.java rename to modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadOnlyAccessStrategy.java index cdef80e0a0c0b..a0957fda58785 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadOnlyAccessStrategy.java +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadOnlyAccessStrategy.java @@ -19,13 +19,9 @@ import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCheckedException; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.access.AccessType; -import org.hibernate.cache.spi.access.SoftLock; -import org.jetbrains.annotations.Nullable; /** - * Implementation of {@link AccessType#READ_ONLY} cache access strategy. + * Implementation of READ_ONLY cache access strategy. *

* Configuration of L2 cache and per-entity cache access strategy can be set in the * Hibernate configuration file: @@ -51,57 +47,59 @@ * @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY) * public class Entity { ... } * - * */ public class HibernateReadOnlyAccessStrategy extends HibernateAccessStrategyAdapter { /** - * @param ignite Grid. + * @param ignite Node. * @param cache Cache. + * @param eConverter Exception converter. */ - public HibernateReadOnlyAccessStrategy(Ignite ignite, HibernateCacheProxy cache) { - super(ignite, cache); + public HibernateReadOnlyAccessStrategy(Ignite ignite, + HibernateCacheProxy cache, + HibernateExceptionConverter eConverter) { + super(ignite, cache, eConverter); } /** {@inheritDoc} */ - @Override protected boolean insert(Object key, Object val) throws CacheException { + @Override public boolean insert(Object key, Object val) { return false; } /** {@inheritDoc} */ - @Override protected boolean afterInsert(Object key, Object val) throws CacheException { + @Override public boolean afterInsert(Object key, Object val) { try { cache.put(key, val); return true; } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } } /** {@inheritDoc} */ - @Nullable @Override protected SoftLock lock(Object key) throws CacheException { - return null; + @Override public void lock(Object key) { + // No-op. } /** {@inheritDoc} */ - @Override protected void unlock(Object key, SoftLock lock) throws CacheException { + @Override public void unlock(Object key) { // No-op. } /** {@inheritDoc} */ - @Override protected void remove(Object key) throws CacheException { + @Override public void remove(Object key) { // No-op. } /** {@inheritDoc} */ - @Override protected boolean update(Object key, Object val) throws CacheException { + @Override public boolean update(Object key, Object val) { throw new UnsupportedOperationException("Updates are not supported for read-only access strategy."); } /** {@inheritDoc} */ - @Override protected boolean afterUpdate(Object key, Object val, SoftLock lock) throws CacheException { + @Override public boolean afterUpdate(Object key, Object val) { throw new UnsupportedOperationException("Updates are not supported for read-only access strategy."); } } \ No newline at end of file diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadWriteAccessStrategy.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadWriteAccessStrategy.java similarity index 82% rename from modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadWriteAccessStrategy.java rename to modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadWriteAccessStrategy.java index ae9bd71d255a6..491553dccc981 100644 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadWriteAccessStrategy.java +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadWriteAccessStrategy.java @@ -23,15 +23,12 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal; import org.apache.ignite.internal.util.GridLeanSet; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.access.AccessType; -import org.hibernate.cache.spi.access.SoftLock; import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ; /** - * Implementation of {@link AccessType#READ_WRITE} cache access strategy. + * Implementation of READ_WRITE cache access strategy. *

* Configuration of L2 cache and per-entity cache access strategy can be set in the * Hibernate configuration file: @@ -66,15 +63,19 @@ public class HibernateReadWriteAccessStrategy extends HibernateAccessStrategyAda * @param ignite Grid. * @param cache Cache. * @param txCtx Thread local instance used to track updates done during one Hibernate transaction. + * @param eConverter Exception converter. */ - protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy cache, ThreadLocal txCtx) { - super(ignite, cache); + protected HibernateReadWriteAccessStrategy(Ignite ignite, + HibernateCacheProxy cache, + ThreadLocal txCtx, + HibernateExceptionConverter eConverter) { + super(ignite, cache, eConverter); this.txCtx = (ThreadLocal)txCtx; } /** {@inheritDoc} */ - @Override protected Object get(Object key) throws CacheException { + @Override public Object get(Object key) { boolean success = false; try { @@ -85,7 +86,7 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca return o; } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } finally { if (!success) @@ -94,7 +95,7 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca } /** {@inheritDoc} */ - @Override protected void putFromLoad(Object key, Object val) throws CacheException { + @Override public void putFromLoad(Object key, Object val) { boolean success = false; try { @@ -103,7 +104,7 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca success = true; } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } finally { if (!success) @@ -112,7 +113,7 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca } /** {@inheritDoc} */ - @Override protected SoftLock lock(Object key) throws CacheException { + @Override public void lock(Object key) { boolean success = false; try { @@ -126,11 +127,9 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca ctx.locked(key); success = true; - - return null; } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } finally { if (!success) @@ -139,7 +138,7 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca } /** {@inheritDoc} */ - @Override protected void unlock(Object key, SoftLock lock) throws CacheException { + @Override public void unlock(Object key) { boolean success = false; try { @@ -151,7 +150,7 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca success = true; } catch (Exception e) { - throw new CacheException(e); + throw convertException(e); } finally { if (!success) @@ -160,12 +159,12 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca } /** {@inheritDoc} */ - @Override protected boolean update(Object key, Object val) throws CacheException { + @Override public boolean update(Object key, Object val) { return false; } /** {@inheritDoc} */ - @Override protected boolean afterUpdate(Object key, Object val, SoftLock lock) throws CacheException { + @Override public boolean afterUpdate(Object key, Object val) { boolean success = false; boolean res = false; @@ -185,7 +184,7 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca return res; } catch (Exception e) { - throw new CacheException(e); + throw convertException(e); } finally { if (!success) @@ -194,12 +193,12 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca } /** {@inheritDoc} */ - @Override protected boolean insert(Object key, Object val) throws CacheException { + @Override public boolean insert(Object key, Object val) { return false; } /** {@inheritDoc} */ - @Override protected boolean afterInsert(Object key, Object val) throws CacheException { + @Override public boolean afterInsert(Object key, Object val) { boolean success = false; try { @@ -210,7 +209,7 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca return true; } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } finally { if (!success) @@ -219,7 +218,7 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca } /** {@inheritDoc} */ - @Override protected void remove(Object key) throws CacheException { + @Override public void remove(Object key) { boolean success = false; try { @@ -231,7 +230,7 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca success = true; } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } finally { if (!success) @@ -243,9 +242,8 @@ protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy ca * * @param ctx Transaction context. * @param key Key. - * @throws CacheException If failed. */ - private void unlock(TxContext ctx, Object key) throws CacheException { + private void unlock(TxContext ctx, Object key) { if (ctx.unlocked(key)) { // Finish transaction if last key is unlocked. txCtx.remove(); diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalAccessStrategy.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalAccessStrategy.java similarity index 72% rename from modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalAccessStrategy.java rename to modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalAccessStrategy.java index ca5284917aa68..6f4935b8f1180 100644 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalAccessStrategy.java +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalAccessStrategy.java @@ -20,13 +20,10 @@ import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.processors.cache.IgniteInternalCache; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.access.AccessType; -import org.hibernate.cache.spi.access.SoftLock; import org.jetbrains.annotations.Nullable; /** - * Implementation of {@link AccessType#TRANSACTIONAL} cache access strategy. + * Implementation of {TRANSACTIONAL cache access strategy. *

* It is supposed that this strategy is used in JTA environment and Hibernate and * {@link IgniteInternalCache} corresponding to the L2 cache region are configured to use the same transaction manager. @@ -60,82 +57,85 @@ public class HibernateTransactionalAccessStrategy extends HibernateAccessStrateg /** * @param ignite Grid. * @param cache Cache. + * @param eConverter Exception converter. */ - public HibernateTransactionalAccessStrategy(Ignite ignite, HibernateCacheProxy cache) { - super(ignite, cache); + HibernateTransactionalAccessStrategy(Ignite ignite, + HibernateCacheProxy cache, + HibernateExceptionConverter eConverter) { + super(ignite, cache, eConverter); } /** {@inheritDoc} */ - @Nullable @Override protected Object get(Object key) throws CacheException { + @Nullable @Override public Object get(Object key) { try { return cache.get(key); } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } } /** {@inheritDoc} */ - @Override protected void putFromLoad(Object key, Object val) throws CacheException { + @Override public void putFromLoad(Object key, Object val) { try { cache.put(key, val); } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } } /** {@inheritDoc} */ - @Override protected SoftLock lock(Object key) throws CacheException { - return null; + @Override public void lock(Object key) { + // No-op. } /** {@inheritDoc} */ - @Override protected void unlock(Object key, SoftLock lock) throws CacheException { + @Override public void unlock(Object key) { // No-op. } /** {@inheritDoc} */ - @Override protected boolean update(Object key, Object val) throws CacheException { + @Override public boolean update(Object key, Object val) { try { cache.put(key, val); return true; } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } } /** {@inheritDoc} */ - @Override protected boolean afterUpdate(Object key, Object val, SoftLock lock) throws CacheException { + @Override public boolean afterUpdate(Object key, Object val) { return false; } /** {@inheritDoc} */ - @Override protected boolean insert(Object key, Object val) throws CacheException { + @Override public boolean insert(Object key, Object val) { try { cache.put(key, val); return true; } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } } /** {@inheritDoc} */ - @Override protected boolean afterInsert(Object key, Object val) throws CacheException { + @Override public boolean afterInsert(Object key, Object val) { return false; } /** {@inheritDoc} */ - @Override protected void remove(Object key) throws CacheException { + @Override public void remove(Object key) { try { cache.remove(key); } catch (IgniteCheckedException e) { - throw new CacheException(e); + throw convertException(e); } } } \ No newline at end of file diff --git a/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/package-info.java b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/package-info.java new file mode 100644 index 0000000000000..1179aecc7dff2 --- /dev/null +++ b/modules/hibernate-core/src/main/java/org/apache/ignite/cache/hibernate/package-info.java @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * + * Contains implementation of Hibernate L2 cache. Refer to + * org.apache.ignite.examples.datagrid.hibernate.HibernateL2CacheExample for more information on how to + * configure and use Ignite with Hibernate. + */ +package org.apache.ignite.cache.hibernate; \ No newline at end of file diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyAdapter.java b/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyAdapter.java deleted file mode 100644 index f6c1d0e15eb43..0000000000000 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateAccessStrategyAdapter.java +++ /dev/null @@ -1,379 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.cache.hibernate; - -import java.io.Externalizable; -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.IgniteException; -import org.apache.ignite.IgniteLogger; -import org.apache.ignite.internal.IgniteKernal; -import org.apache.ignite.internal.processors.cache.IgniteInternalCache; -import org.apache.ignite.internal.util.typedef.internal.U; -import org.apache.ignite.lang.IgniteCallable; -import org.apache.ignite.resources.IgniteInstanceResource; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.access.CollectionRegionAccessStrategy; -import org.hibernate.cache.spi.access.EntityRegionAccessStrategy; -import org.hibernate.cache.spi.access.NaturalIdRegionAccessStrategy; -import org.hibernate.cache.spi.access.RegionAccessStrategy; -import org.hibernate.cache.spi.access.SoftLock; -import org.jetbrains.annotations.Nullable; - -/** - * Common interface used to implement Hibernate L2 cache access strategies ({@link RegionAccessStrategy}, - * {@link EntityRegionAccessStrategy} and {@link CollectionRegionAccessStrategy}). - *

- * The expected sequences of steps related to various CRUD operations executed by Hibernate are: - *

- * Insert: - *

    - *
  • Start DB transaction.
  • - *
  • Execute database insert.
  • - *
  • Call {@link HibernateAccessStrategyAdapter#insert}.
  • - *
  • Commit DB transaction.
  • - *
  • Call {@link HibernateAccessStrategyAdapter#afterInsert}.
  • - *
- * In case if some step fails and DB transaction is rolled back then - * {@link HibernateAccessStrategyAdapter#afterInsert} is not called. - *

- * Update: - *

    - *
  • Start DB transaction.
  • - *
  • Call {@link HibernateAccessStrategyAdapter#lock}.
  • - *
  • Execute database update.
  • - *
  • Call {@link HibernateAccessStrategyAdapter#update}.
  • - *
  • Commit DB transaction.
  • - *
  • Call {@link HibernateAccessStrategyAdapter#afterUpdate}.
  • - *
- * In case if {@link HibernateAccessStrategyAdapter#lock} was called, but some other step fails and DB - * transaction is rolled back then {@link HibernateAccessStrategyAdapter#unlock} is called for all locked keys. - *

- * Delete: - *

    - *
  • Start DB transaction.
  • - *
  • Call {@link HibernateAccessStrategyAdapter#lock} for removing key.
  • - *
  • Execute database delete.
  • - *
  • Call {@link HibernateAccessStrategyAdapter#remove}.
  • - *
  • Commit DB transaction.
  • - *
  • Call {@link HibernateAccessStrategyAdapter#unlock}.
  • - *
- * In case if {@link HibernateAccessStrategyAdapter#lock} was called, but some other step fails and DB - * transaction is rolled back then {@link HibernateAccessStrategyAdapter#unlock} is called for all locked keys. - *

- * In case if custom SQL update query is executed Hibernate clears entire cache region, - * for this case operations sequence is: - *

    - *
  • Start DB transaction.
  • - *
  • Call {@link HibernateAccessStrategyAdapter#lockRegion}.
  • - *
  • Execute database query.
  • - *
  • Call {@link HibernateAccessStrategyAdapter#removeAll}.
  • - *
  • Commit DB transaction.
  • - *
  • Call {@link HibernateAccessStrategyAdapter#unlockRegion}.
  • - *
- */ -public abstract class HibernateAccessStrategyAdapter { - /** */ - protected final HibernateCacheProxy cache; - - /** Grid. */ - protected final Ignite ignite; - - /** */ - protected final IgniteLogger log; - - /** - * @param ignite Grid. - * @param cache Cache. - */ - protected HibernateAccessStrategyAdapter(Ignite ignite, HibernateCacheProxy cache) { - this.cache = cache; - this.ignite = ignite; - - log = ignite.log(); - } - - /** - * Gets value from cache. Used by {@link RegionAccessStrategy#get}. - * - * @param key Key. - * @return Cached value. - * @throws CacheException If failed. - */ - @Nullable protected Object get(Object key) throws CacheException { - try { - return cache.get(key); - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - } - - /** - * Puts in cache value loaded from the database. Used by {@link RegionAccessStrategy#putFromLoad}. - * - * @param key Key. - * @param val Value. - * @param minimalPutOverride MinimalPut flag - * @throws CacheException If failed. - */ - protected void putFromLoad(Object key, Object val, boolean minimalPutOverride) throws CacheException { - putFromLoad(key, val); - } - - /** - * Puts in cache value loaded from the database. Used by {@link RegionAccessStrategy#putFromLoad}. - * - * @param key Key. - * @param val Value. - * @throws CacheException If failed. - */ - protected void putFromLoad(Object key, Object val) throws CacheException { - try { - cache.put(key, val); - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - } - - /** - * Called during database transaction execution before Hibernate attempts to update or remove given key. - * Used by {@link RegionAccessStrategy#lockItem}. - * - * @param key Key. - * @return Lock representation or {@code null}. - * @throws CacheException If failed. - */ - @Nullable protected abstract SoftLock lock(Object key) throws CacheException; - - /** - * Called after Hibernate failed to update or successfully removed given key. - * Used by {@link RegionAccessStrategy#unlockItem}. - * - * @param key Key. - * @param lock The lock previously obtained from {@link #lock} - * @throws CacheException If failed. - */ - protected abstract void unlock(Object key, SoftLock lock) throws CacheException; - - /** - * Called after Hibernate updated object in the database but before transaction completed. - * Used by {@link EntityRegionAccessStrategy#update} and {@link NaturalIdRegionAccessStrategy#update}. - * - * @param key Key. - * @param val Value. - * @return {@code True} if operation updated cache. - * @throws CacheException If failed. - */ - protected abstract boolean update(Object key, Object val) throws CacheException; - - /** - * Called after Hibernate updated object in the database and transaction successfully completed. - * Used by {@link EntityRegionAccessStrategy#afterUpdate} and {@link NaturalIdRegionAccessStrategy#afterUpdate}. - * - * @param key Key. - * @param val Value. - * @param lock The lock previously obtained from {@link #lock} - * @return {@code True} if operation updated cache. - * @throws CacheException If failed. - */ - protected abstract boolean afterUpdate(Object key, Object val, SoftLock lock) throws CacheException; - - /** - * Called after Hibernate inserted object in the database but before transaction completed. - * Used by {@link EntityRegionAccessStrategy#insert} and {@link NaturalIdRegionAccessStrategy#insert}. - * - * @param key Key. - * @param val Value. - * @return {@code True} if operation updated cache. - * @throws CacheException If failed. - */ - protected abstract boolean insert(Object key, Object val) throws CacheException; - - /** - * Called after Hibernate inserted object in the database and transaction successfully completed. - * Used by {@link EntityRegionAccessStrategy#afterInsert} and {@link NaturalIdRegionAccessStrategy#afterInsert}. - * - * @param key Key. - * @param val Value. - * @return {@code True} if operation updated cache. - * @throws CacheException If failed. - */ - protected abstract boolean afterInsert(Object key, Object val) throws CacheException; - - /** - * Called after Hibernate removed object from database but before transaction completed. - * Used by {@link RegionAccessStrategy#remove}. - * - * @param key Key, - * @throws CacheException If failed. - */ - protected abstract void remove(Object key) throws CacheException; - - /** - * Called to remove object from cache without regard to transaction. - * Used by {@link RegionAccessStrategy#evict}. - * - * @param key Key. - * @throws CacheException If failed. - */ - protected void evict(Object key) throws CacheException { - evict(ignite, cache, key); - } - - /** - * Called to remove all data from cache without regard to transaction. - * Used by {@link RegionAccessStrategy#evictAll}. - * - * @throws CacheException If failed. - */ - protected void evictAll() throws CacheException { - evictAll(cache); - } - - /** - * Called during database transaction execution before Hibernate executed - * update operation which should invalidate entire cache region. - * Used by {@link RegionAccessStrategy#lockRegion}. - * - * @throws CacheException If failed. - * @return Lock representation or {@code null}. - */ - @Nullable protected SoftLock lockRegion() throws CacheException { - return null; - } - - /** - * Called after transaction clearing entire cache region completed. - * Used by {@link RegionAccessStrategy#unlockRegion}. - * - * @param lock The lock previously obtained from {@link #lockRegion} - * @throws CacheException If failed. - */ - protected void unlockRegion(SoftLock lock) throws CacheException { - // No-op. - } - - /** - * Called during database transaction execution to clear entire cache region after - * Hibernate executed database update, but before transaction completed. - * Used by {@link RegionAccessStrategy#removeAll}. - * - * @throws CacheException If failed. - */ - protected final void removeAll() throws CacheException { - evictAll(); - } - - /** - * Called to remove object from cache without regard to transaction. - * - * @param ignite Grid. - * @param cache Cache. - * @param key Key. - * @throws CacheException If failed. - */ - static void evict(Ignite ignite, HibernateCacheProxy cache, Object key) throws CacheException { - try { - key = cache.keyTransformer().transform(key); - - ignite.compute(ignite.cluster()).call(new ClearKeyCallable(key, cache.name())); - } - catch (IgniteException e) { - throw new CacheException(e); - } - } - - /** - * Called to remove all data from cache without regard to transaction. - * - * @param cache Cache. - * @throws CacheException If failed. - */ - static void evictAll(IgniteInternalCache cache) throws CacheException { - try { - cache.clear(); - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - } - - /** - * Callable invalidates given key. - */ - private static class ClearKeyCallable implements IgniteCallable, Externalizable { - /** */ - private static final long serialVersionUID = 0L; - - /** */ - @IgniteInstanceResource - private Ignite ignite; - - /** */ - private Object key; - - /** */ - private String cacheName; - - /** - * Empty constructor required by {@link Externalizable}. - */ - public ClearKeyCallable() { - // No-op. - } - - /** - * @param key Key to clear. - * @param cacheName Cache name. - */ - private ClearKeyCallable(Object key, String cacheName) { - this.key = key; - this.cacheName = cacheName; - } - - /** {@inheritDoc} */ - @Override public Void call() throws IgniteCheckedException { - IgniteInternalCache cache = ((IgniteKernal)ignite).getCache(cacheName); - - assert cache != null; - - cache.clearLocally(key); - - return null; - } - - /** {@inheritDoc} */ - @Override public void writeExternal(ObjectOutput out) throws IOException { - out.writeObject(key); - - U.writeString(out, cacheName); - } - - /** {@inheritDoc} */ - @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - key = in.readObject(); - - cacheName = U.readString(in); - } - } -} \ No newline at end of file diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadOnlyAccessStrategy.java b/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadOnlyAccessStrategy.java deleted file mode 100644 index cdef80e0a0c0b..0000000000000 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadOnlyAccessStrategy.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.cache.hibernate; - -import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteCheckedException; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.access.AccessType; -import org.hibernate.cache.spi.access.SoftLock; -import org.jetbrains.annotations.Nullable; - -/** - * Implementation of {@link AccessType#READ_ONLY} cache access strategy. - *

- * Configuration of L2 cache and per-entity cache access strategy can be set in the - * Hibernate configuration file: - *

- * <hibernate-configuration>
- *     <!-- Enable L2 cache. -->
- *     <property name="cache.use_second_level_cache">true</property>
- *
- *     <!-- Use Ignite as L2 cache provider. -->
- *     <property name="cache.region.factory_class">org.apache.ignite.cache.hibernate.HibernateRegionFactory</property>
- *
- *     <!-- Specify entity. -->
- *     <mapping class="com.example.Entity"/>
- *
- *     <!-- Enable L2 cache with read-only access strategy for entity. -->
- *     <class-cache class="com.example.Entity" usage="read-only"/>
- * </hibernate-configuration>
- * 
- * Also cache access strategy can be set using annotations: - *
- * @javax.persistence.Entity
- * @javax.persistence.Cacheable
- * @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
- * public class Entity { ... }
- * 
- - * - */ -public class HibernateReadOnlyAccessStrategy extends HibernateAccessStrategyAdapter { - /** - * @param ignite Grid. - * @param cache Cache. - */ - public HibernateReadOnlyAccessStrategy(Ignite ignite, HibernateCacheProxy cache) { - super(ignite, cache); - } - - /** {@inheritDoc} */ - @Override protected boolean insert(Object key, Object val) throws CacheException { - return false; - } - - /** {@inheritDoc} */ - @Override protected boolean afterInsert(Object key, Object val) throws CacheException { - try { - cache.put(key, val); - - return true; - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - } - - /** {@inheritDoc} */ - @Nullable @Override protected SoftLock lock(Object key) throws CacheException { - return null; - } - - /** {@inheritDoc} */ - @Override protected void unlock(Object key, SoftLock lock) throws CacheException { - // No-op. - } - - /** {@inheritDoc} */ - @Override protected void remove(Object key) throws CacheException { - // No-op. - } - - /** {@inheritDoc} */ - @Override protected boolean update(Object key, Object val) throws CacheException { - throw new UnsupportedOperationException("Updates are not supported for read-only access strategy."); - } - - /** {@inheritDoc} */ - @Override protected boolean afterUpdate(Object key, Object val, SoftLock lock) throws CacheException { - throw new UnsupportedOperationException("Updates are not supported for read-only access strategy."); - } -} \ No newline at end of file diff --git a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalAccessStrategy.java b/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalAccessStrategy.java deleted file mode 100644 index ca5284917aa68..0000000000000 --- a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalAccessStrategy.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.cache.hibernate; - -import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.internal.processors.cache.IgniteInternalCache; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.access.AccessType; -import org.hibernate.cache.spi.access.SoftLock; -import org.jetbrains.annotations.Nullable; - -/** - * Implementation of {@link AccessType#TRANSACTIONAL} cache access strategy. - *

- * It is supposed that this strategy is used in JTA environment and Hibernate and - * {@link IgniteInternalCache} corresponding to the L2 cache region are configured to use the same transaction manager. - *

- * Configuration of L2 cache and per-entity cache access strategy can be set in the - * Hibernate configuration file: - *

- * <hibernate-configuration>
- *     <!-- Enable L2 cache. -->
- *     <property name="cache.use_second_level_cache">true</property>
- *
- *     <!-- Use Ignite as L2 cache provider. -->
- *     <property name="cache.region.factory_class">org.apache.ignite.cache.hibernate.HibernateRegionFactory</property>
- *
- *     <!-- Specify entity. -->
- *     <mapping class="com.example.Entity"/>
- *
- *     <!-- Enable L2 cache with transactional access strategy for entity. -->
- *     <class-cache class="com.example.Entity" usage="transactional"/>
- * </hibernate-configuration>
- * 
- * Also cache access strategy can be set using annotations: - *
- * @javax.persistence.Entity
- * @javax.persistence.Cacheable
- * @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
- * public class Entity { ... }
- * 
- */ -public class HibernateTransactionalAccessStrategy extends HibernateAccessStrategyAdapter { - /** - * @param ignite Grid. - * @param cache Cache. - */ - public HibernateTransactionalAccessStrategy(Ignite ignite, HibernateCacheProxy cache) { - super(ignite, cache); - } - - /** {@inheritDoc} */ - @Nullable @Override protected Object get(Object key) throws CacheException { - try { - return cache.get(key); - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - } - - /** {@inheritDoc} */ - @Override protected void putFromLoad(Object key, Object val) throws CacheException { - try { - cache.put(key, val); - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - } - - /** {@inheritDoc} */ - @Override protected SoftLock lock(Object key) throws CacheException { - return null; - } - - /** {@inheritDoc} */ - @Override protected void unlock(Object key, SoftLock lock) throws CacheException { - // No-op. - } - - /** {@inheritDoc} */ - @Override protected boolean update(Object key, Object val) throws CacheException { - try { - cache.put(key, val); - - return true; - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - } - - /** {@inheritDoc} */ - @Override protected boolean afterUpdate(Object key, Object val, SoftLock lock) throws CacheException { - return false; - } - - /** {@inheritDoc} */ - @Override protected boolean insert(Object key, Object val) throws CacheException { - try { - cache.put(key, val); - - return true; - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - } - - /** {@inheritDoc} */ - @Override protected boolean afterInsert(Object key, Object val) throws CacheException { - return false; - } - - /** {@inheritDoc} */ - @Override protected void remove(Object key) throws CacheException { - try { - cache.remove(key); - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - } -} \ No newline at end of file diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateCacheProxy.java b/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateCacheProxy.java deleted file mode 100644 index 7204083dfef28..0000000000000 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateCacheProxy.java +++ /dev/null @@ -1,801 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.cache.hibernate; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import javax.cache.Cache; -import javax.cache.expiry.ExpiryPolicy; -import javax.cache.processor.EntryProcessor; -import javax.cache.processor.EntryProcessorResult; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.cache.CacheEntry; -import org.apache.ignite.cache.CacheMetrics; -import org.apache.ignite.cache.CachePeekMode; -import org.apache.ignite.cache.affinity.Affinity; -import org.apache.ignite.cluster.ClusterGroup; -import org.apache.ignite.configuration.CacheConfiguration; -import org.apache.ignite.internal.IgniteInternalFuture; -import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; -import org.apache.ignite.internal.processors.cache.CacheEntryPredicate; -import org.apache.ignite.internal.processors.cache.GridCacheContext; -import org.apache.ignite.internal.processors.cache.IgniteCacheExpiryPolicy; -import org.apache.ignite.internal.processors.cache.IgniteInternalCache; -import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal; -import org.apache.ignite.lang.IgniteBiPredicate; -import org.apache.ignite.mxbean.CacheMetricsMXBean; -import org.apache.ignite.transactions.Transaction; -import org.apache.ignite.transactions.TransactionConcurrency; -import org.apache.ignite.transactions.TransactionIsolation; -import org.jetbrains.annotations.Nullable; - -/** - * Hibernate cache proxy used to substitute hibernate keys with ignite keys. - */ -public class HibernateCacheProxy implements IgniteInternalCache { - /** Delegate. */ - private final IgniteInternalCache delegate; - - /** Transformer. */ - private final HibernateKeyTransformer keyTransformer; - - /** - * @param delegate Delegate. - * @param keyTransformer Key keyTransformer. - */ - HibernateCacheProxy( - IgniteInternalCache delegate, - HibernateKeyTransformer keyTransformer - ) { - assert delegate != null; - assert keyTransformer != null; - - this.delegate = delegate; - this.keyTransformer = keyTransformer; - } - - /** - * @return HibernateKeyTransformer - */ - HibernateKeyTransformer keyTransformer(){ - return keyTransformer; - } - - /** {@inheritDoc} */ - @Override public String name() { - return delegate.name(); - } - - /** {@inheritDoc} */ - @Override public boolean skipStore() { - return delegate.skipStore(); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalCache setSkipStore(boolean skipStore) { - return delegate.setSkipStore(skipStore); - } - - /** {@inheritDoc} */ - @Override public boolean isEmpty() { - return delegate.isEmpty(); - } - - /** {@inheritDoc} */ - @Override public boolean containsKey(Object key) { - return delegate.containsKey(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture containsKeyAsync(Object key) { - return delegate.containsKeyAsync(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public boolean containsKeys(Collection keys) { - return delegate.containsKey(transform(keys)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture containsKeysAsync(Collection keys) { - return delegate.containsKeysAsync(transform(keys)); - } - - /** {@inheritDoc} */ - @Nullable @Override public Object localPeek( - Object key, - CachePeekMode[] peekModes, - @Nullable IgniteCacheExpiryPolicy plc - ) throws IgniteCheckedException { - return delegate.localPeek(keyTransformer.transform(key), peekModes, plc); - } - - /** {@inheritDoc} */ - @Override public Iterable> localEntries( - CachePeekMode[] peekModes - ) throws IgniteCheckedException { - return delegate.localEntries(peekModes); - } - - /** {@inheritDoc} */ - @Nullable @Override public Object get(Object key) throws IgniteCheckedException { - return delegate.get(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Nullable @Override public CacheEntry getEntry(Object key) throws IgniteCheckedException { - return delegate.getEntry(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture getAsync(Object key) { - return delegate.getAsync(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture> getEntryAsync(Object key) { - return delegate.getEntryAsync(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public Map getAll(@Nullable Collection keys) throws IgniteCheckedException { - return delegate.getAll(transform(keys)); - } - - /** {@inheritDoc} */ - @Override public Collection> getEntries( - @Nullable Collection keys) throws IgniteCheckedException { - return delegate.getEntries(transform(keys)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture> getAllAsync(@Nullable Collection keys) { - return delegate.getAllAsync(transform(keys)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture>> getEntriesAsync( - @Nullable Collection keys - ) { - return delegate.getEntriesAsync(transform(keys)); - } - - /** {@inheritDoc} */ - @Nullable @Override public Object getAndPut(Object key, Object val) throws IgniteCheckedException { - return delegate.getAndPut(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture getAndPutAsync(Object key, Object val) { - return delegate.getAndPutAsync(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public boolean put(Object key, Object val) throws IgniteCheckedException { - return delegate.put(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture putAsync(Object key, Object val) { - return delegate.putAsync(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Nullable @Override public Object getAndPutIfAbsent(Object key, Object val) throws IgniteCheckedException { - return delegate.getAndPutIfAbsent(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture getAndPutIfAbsentAsync(Object key, Object val) { - return delegate.getAndPutIfAbsentAsync(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public boolean putIfAbsent(Object key, Object val) throws IgniteCheckedException { - return delegate.putIfAbsent(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture putIfAbsentAsync(Object key, Object val) { - return delegate.putIfAbsentAsync(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Nullable @Override public Object getAndReplace(Object key, Object val) throws IgniteCheckedException { - return delegate.getAndReplace(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture getAndReplaceAsync(Object key, Object val) { - return delegate.getAndReplaceAsync(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public boolean replace(Object key, Object val) throws IgniteCheckedException { - return delegate.replace(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture replaceAsync(Object key, Object val) { - return delegate.replaceAsync(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public boolean replace(Object key, Object oldVal, Object newVal) throws IgniteCheckedException { - return delegate.replace(keyTransformer.transform(key), oldVal, newVal); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture replaceAsync(Object key, Object oldVal, Object newVal) { - return delegate.replaceAsync(keyTransformer.transform(key), oldVal, newVal); - } - - /** {@inheritDoc} */ - @Override public void putAll(@Nullable Map m) throws IgniteCheckedException { - delegate.putAll(transform(m)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture putAllAsync(@Nullable Map m) { - return delegate.putAllAsync(transform(m)); - } - - /** {@inheritDoc} */ - @Override public Set keySet() { - return delegate.keySet(); - } - - /** {@inheritDoc} */ - @Override public Set keySetx() { - return delegate.keySetx(); - } - - /** {@inheritDoc} */ - @Override public Set primaryKeySet() { - return delegate.primaryKeySet(); - } - - /** {@inheritDoc} */ - @Override public Iterable values() { - return delegate.values(); - } - - /** {@inheritDoc} */ - @Override public Set> entrySet() { - return delegate.entrySet(); - } - - /** {@inheritDoc} */ - @Nullable @Override public Set> entrySet(int part) { - return delegate.entrySet(part); - } - - /** {@inheritDoc} */ - @Override public Set> entrySetx(CacheEntryPredicate... filter) { - return delegate.entrySetx(filter); - } - - /** {@inheritDoc} */ - @Override public Transaction txStart( - TransactionConcurrency concurrency, - TransactionIsolation isolation - ) { - return delegate.txStart(concurrency, isolation); - } - - /** {@inheritDoc} */ - @Override public GridNearTxLocal txStartEx( - TransactionConcurrency concurrency, - TransactionIsolation isolation - ) { - return delegate.txStartEx(concurrency, isolation); - } - - /** {@inheritDoc} */ - @Override public Transaction txStart( - TransactionConcurrency concurrency, - TransactionIsolation isolation, - long timeout, - int txSize - ) { - return delegate.txStart(concurrency, isolation, timeout, txSize); - } - - /** {@inheritDoc} */ - @Nullable @Override public GridNearTxLocal tx() { - return delegate.tx(); - } - - /** {@inheritDoc} */ - @Override public boolean evict(Object key) { - return delegate.evict(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public void evictAll(@Nullable Collection keys) { - delegate.evictAll(transform(keys)); - } - - /** {@inheritDoc} */ - @Override public void clearLocally(boolean srv, boolean near, boolean readers) { - delegate.clearLocally(srv, near, readers); - } - - /** {@inheritDoc} */ - @Override public boolean clearLocally(Object key) { - return delegate.clearLocally(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public void clearLocallyAll(Set keys, boolean srv, boolean near, boolean readers) { - delegate.clearLocallyAll((Set)transform(keys), srv, near, readers); - } - - /** {@inheritDoc} */ - @Override public void clear(Object key) throws IgniteCheckedException { - delegate.clear(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public void clearAll(Set keys) throws IgniteCheckedException { - delegate.clearAll((Set)transform(keys)); - } - - /** {@inheritDoc} */ - @Override public void clear() throws IgniteCheckedException { - delegate.clear(); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture clearAsync() { - return delegate.clearAsync(); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture clearAsync(Object key) { - return delegate.clearAsync(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture clearAllAsync(Set keys) { - return delegate.clearAllAsync((Set)transform(keys)); - } - - /** {@inheritDoc} */ - @Nullable @Override public Object getAndRemove(Object key) throws IgniteCheckedException { - return delegate.getAndRemove(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture getAndRemoveAsync(Object key) { - return delegate.getAndRemoveAsync(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public boolean remove(Object key) throws IgniteCheckedException { - return delegate.remove(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture removeAsync(Object key) { - return delegate.removeAsync(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public boolean remove(Object key, Object val) throws IgniteCheckedException { - return delegate.remove(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture removeAsync(Object key, Object val) { - return delegate.removeAsync(keyTransformer.transform(key), val); - } - - /** {@inheritDoc} */ - @Override public void removeAll(@Nullable Collection keys) throws IgniteCheckedException { - delegate.removeAll(transform(keys)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture removeAllAsync(@Nullable Collection keys) { - return delegate.removeAllAsync(transform(keys)); - } - - /** {@inheritDoc} */ - @Override public void removeAll() throws IgniteCheckedException { - delegate.removeAll(); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture removeAllAsync() { - return delegate.removeAllAsync(); - } - - /** {@inheritDoc} */ - @Override public boolean lock(Object key, long timeout) throws IgniteCheckedException { - return delegate.lock(keyTransformer.transform(key), timeout); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture lockAsync(Object key, long timeout) { - return delegate.lockAsync(keyTransformer.transform(key), timeout); - } - - /** {@inheritDoc} */ - @Override public boolean lockAll(@Nullable Collection keys, long timeout) throws IgniteCheckedException { - return delegate.lockAll(transform(keys), timeout); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture lockAllAsync(@Nullable Collection keys, long timeout) { - return delegate.lockAllAsync(transform(keys), timeout); - } - - /** {@inheritDoc} */ - @Override public void unlock(Object key) throws IgniteCheckedException { - delegate.unlock(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public void unlockAll(@Nullable Collection keys) throws IgniteCheckedException { - delegate.unlockAll(transform(keys)); - } - - /** {@inheritDoc} */ - @Override public boolean isLocked(Object key) { - return delegate.isLocked(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public boolean isLockedByThread(Object key) { - return delegate.isLockedByThread(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public int size() { - return delegate.size(); - } - - /** {@inheritDoc} */ - @Override public long sizeLong() { - return delegate.sizeLong(); - } - - /** {@inheritDoc} */ - @Override public int localSize(CachePeekMode[] peekModes) throws IgniteCheckedException { - return delegate.localSize(peekModes); - } - - /** {@inheritDoc} */ - @Override public long localSizeLong(CachePeekMode[] peekModes) throws IgniteCheckedException { - return delegate.localSizeLong(peekModes); - } - - /** {@inheritDoc} */ - @Override public long localSizeLong(int partition, CachePeekMode[] peekModes) throws IgniteCheckedException { - return delegate.localSizeLong(partition, peekModes); - } - - /** {@inheritDoc} */ - @Override public int size(CachePeekMode[] peekModes) throws IgniteCheckedException { - return delegate.size(peekModes); - } - - /** {@inheritDoc} */ - @Override public long sizeLong(CachePeekMode[] peekModes) throws IgniteCheckedException { - return delegate.sizeLong(peekModes); - } - - /** {@inheritDoc} */ - @Override public long sizeLong(int partition, CachePeekMode[] peekModes) throws IgniteCheckedException { - return delegate.sizeLong(partition, peekModes); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture sizeAsync(CachePeekMode[] peekModes) { - return delegate.sizeAsync(peekModes); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture sizeLongAsync(CachePeekMode[] peekModes) { - return delegate.sizeLongAsync(peekModes); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture sizeLongAsync(int partition, CachePeekMode[] peekModes) { - return delegate.sizeLongAsync(partition, peekModes); - } - - /** {@inheritDoc} */ - @Override public int nearSize() { - return delegate.nearSize(); - } - - /** {@inheritDoc} */ - @Override public int primarySize() { - return delegate.primarySize(); - } - - /** {@inheritDoc} */ - @Override public long primarySizeLong() { - return delegate.primarySizeLong(); - } - - /** {@inheritDoc} */ - @Override public CacheConfiguration configuration() { - return delegate.configuration(); - } - - /** {@inheritDoc} */ - @Override public Affinity affinity() { - return delegate.affinity(); - } - - /** {@inheritDoc} */ - @Override public CacheMetrics clusterMetrics() { - return delegate.clusterMetrics(); - } - - /** {@inheritDoc} */ - @Override public CacheMetrics clusterMetrics(ClusterGroup grp) { - return delegate.clusterMetrics(grp); - } - - /** {@inheritDoc} */ - @Override public CacheMetrics localMetrics() { - return delegate.localMetrics(); - } - - /** {@inheritDoc} */ - @Override public CacheMetricsMXBean clusterMxBean() { - return delegate.clusterMxBean(); - } - - /** {@inheritDoc} */ - @Override public CacheMetricsMXBean localMxBean() { - return delegate.localMxBean(); - } - - /** {@inheritDoc} */ - @Override public long offHeapEntriesCount() { - return delegate.offHeapEntriesCount(); - } - - /** {@inheritDoc} */ - @Override public long offHeapAllocatedSize() { - return delegate.offHeapAllocatedSize(); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture rebalance() { - return delegate.rebalance(); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalCache forSubjectId(UUID subjId) { - return delegate.forSubjectId(subjId); - } - - /** {@inheritDoc} */ - @Nullable @Override public Object getForcePrimary(Object key) throws IgniteCheckedException { - return delegate.getForcePrimary(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture getForcePrimaryAsync(Object key) { - return delegate.getForcePrimaryAsync(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public Map getAllOutTx(Set keys) throws IgniteCheckedException { - return delegate.getAllOutTx((Set)transform(keys)); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture> getAllOutTxAsync(Set keys) { - return delegate.getAllOutTxAsync((Set)transform(keys)); - } - - /** {@inheritDoc} */ - @Override public boolean isIgfsDataCache() { - return delegate.isIgfsDataCache(); - } - - /** {@inheritDoc} */ - @Override public long igfsDataSpaceUsed() { - return delegate.igfsDataSpaceUsed(); - } - - /** {@inheritDoc} */ - @Override public boolean isMongoDataCache() { - return delegate.isMongoDataCache(); - } - - /** {@inheritDoc} */ - @Override public boolean isMongoMetaCache() { - return delegate.isMongoMetaCache(); - } - - /** {@inheritDoc} */ - @Nullable @Override public ExpiryPolicy expiry() { - return delegate.expiry(); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalCache withExpiryPolicy(ExpiryPolicy plc) { - return delegate.withExpiryPolicy(plc); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalCache withNoRetries() { - return delegate.withNoRetries(); - } - - /** {@inheritDoc} */ - @Override public GridCacheContext context() { - return delegate.context(); - } - - /** {@inheritDoc} */ - @Override public void localLoadCache( - @Nullable IgniteBiPredicate p, - @Nullable Object... args - ) throws IgniteCheckedException { - delegate.localLoadCache(p, args); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture localLoadCacheAsync( - @Nullable IgniteBiPredicate p, - @Nullable Object... args - ) { - return delegate.localLoadCacheAsync(p, args); - } - - /** {@inheritDoc} */ - @Override public Object getTopologySafe(Object key) throws IgniteCheckedException { - return delegate.getTopologySafe(keyTransformer.transform(key)); - } - - /** {@inheritDoc} */ - @Override public Collection lostPartitions() { - return delegate.lostPartitions(); - } - - /** {@inheritDoc} */ - @Nullable @Override public EntryProcessorResult invoke( - @Nullable AffinityTopologyVersion topVer, - Object key, - EntryProcessor entryProcessor, - Object... args - ) throws IgniteCheckedException { - return delegate.invoke(topVer, key, entryProcessor, args); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture invokeAllAsync(Map map, Object... args) { - return delegate.invokeAllAsync(map, args); - } - - /** {@inheritDoc} */ - @Override public Map invokeAll(Map map, Object... args) throws IgniteCheckedException { - return delegate.invokeAll(map, args); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture invokeAllAsync(Set keys, EntryProcessor entryProcessor, Object... args) { - return delegate.invokeAllAsync((Set)transform(keys), entryProcessor, args); - } - - /** {@inheritDoc} */ - @Override public Map invokeAll(Set keys, EntryProcessor entryProcessor, Object... args) throws IgniteCheckedException { - return delegate.invokeAll((Set)transform(keys), entryProcessor, args); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture invokeAsync( - Object key, - EntryProcessor entryProcessor, - Object... args - ) { - return delegate.invokeAsync(keyTransformer.transform(key), entryProcessor, args); - } - - /** {@inheritDoc} */ - @Nullable @Override public EntryProcessorResult invoke( - Object key, - EntryProcessor entryProcessor, - Object... args - ) throws IgniteCheckedException { - return delegate.invoke(keyTransformer.transform(key), entryProcessor, args); - } - - /** {@inheritDoc} */ - @Override public Iterator> scanIterator( - boolean keepBinary, - @Nullable IgniteBiPredicate p - ) throws IgniteCheckedException { - return delegate.scanIterator(keepBinary, p); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture removeAllConflictAsync(Map drMap) throws IgniteCheckedException { - return delegate.removeAllConflictAsync(drMap); - } - - /** {@inheritDoc} */ - @Override public void removeAllConflict(Map drMap) throws IgniteCheckedException { - delegate.removeAllConflictAsync(drMap); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalFuture putAllConflictAsync(Map drMap) throws IgniteCheckedException { - return delegate.putAllConflictAsync(drMap); - } - - /** {@inheritDoc} */ - @Override public void putAllConflict(Map drMap) throws IgniteCheckedException { - delegate.putAllConflict(drMap); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalCache keepBinary() { - return delegate.keepBinary(); - } - - /** {@inheritDoc} */ - @Override public IgniteInternalCache cache() { - return delegate.cache(); - } - - /** {@inheritDoc} */ - @Override public Iterator iterator() { - return delegate.iterator(); - } - - /** - * @param keys Keys. - */ - private Collection transform(Collection keys) { - Collection res = new LinkedList<>(); - - for (Object o : keys) - res.add(keyTransformer.transform(o)); - - return res; - } - - /** - * @param map Map. - */ - private Map transform(Map map) { - Map res = new HashMap<>(); - - Set> ents = map.entrySet(); - - for (Map.Entry e : ents) - res.put(keyTransformer.transform(e.getKey()), e.getValue()); - - return res; - } -} diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java b/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java deleted file mode 100644 index a36d7e786d739..0000000000000 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateNonStrictAccessStrategy.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.cache.hibernate; - -import java.util.Map; -import java.util.Set; -import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.internal.util.GridLeanMap; -import org.apache.ignite.internal.util.GridLeanSet; -import org.apache.ignite.internal.util.typedef.F; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.access.AccessType; -import org.hibernate.cache.spi.access.SoftLock; -import org.jetbrains.annotations.Nullable; - -/** - * Implementation of {@link AccessType#NONSTRICT_READ_WRITE} cache access strategy. - *

- * Configuration of L2 cache and per-entity cache access strategy can be set in the - * Hibernate configuration file: - *

- * <hibernate-configuration>
- *     <!-- Enable L2 cache. -->
- *     <property name="cache.use_second_level_cache">true</property>
- *
- *     <!-- Use Ignite as L2 cache provider. -->
- *     <property name="cache.region.factory_class">org.apache.ignite.cache.hibernate.HibernateRegionFactory</property>
- *
- *     <!-- Specify entity. -->
- *     <mapping class="com.example.Entity"/>
- *
- *     <!-- Enable L2 cache with nonstrict-read-write access strategy for entity. -->
- *     <class-cache class="com.example.Entity" usage="nonstrict-read-write"/>
- * </hibernate-configuration>
- * 
- * Also cache access strategy can be set using annotations: - *
- * @javax.persistence.Entity
- * @javax.persistence.Cacheable
- * @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
- * public class Entity { ... }
- * 
- */ -public class HibernateNonStrictAccessStrategy extends HibernateAccessStrategyAdapter { - /** */ - private final ThreadLocal writeCtx; - - /** - * @param ignite Grid. - * @param cache Cache. - * @param writeCtx Thread local instance used to track updates done during one Hibernate transaction. - */ - protected HibernateNonStrictAccessStrategy(Ignite ignite, HibernateCacheProxy cache, ThreadLocal writeCtx) { - super(ignite, cache); - - this.writeCtx = (ThreadLocal)writeCtx; - } - - /** {@inheritDoc} */ - @Nullable @Override protected SoftLock lock(Object key) throws CacheException { - WriteContext ctx = writeCtx.get(); - - if (ctx == null) - writeCtx.set(ctx = new WriteContext()); - - ctx.locked(key); - - return null; - } - - /** {@inheritDoc} */ - @Override protected void unlock(Object key, SoftLock lock) throws CacheException { - try { - WriteContext ctx = writeCtx.get(); - - if (ctx != null && ctx.unlocked(key)) { - writeCtx.remove(); - - ctx.updateCache(cache); - } - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - } - - /** {@inheritDoc} */ - @Override protected boolean update(Object key, Object val) throws CacheException { - return false; - } - - /** {@inheritDoc} */ - @Override protected boolean afterUpdate(Object key, Object val, SoftLock lock) throws CacheException { - WriteContext ctx = writeCtx.get(); - - if (ctx != null) { - ctx.updated(key, val); - - unlock(key, lock); - - return true; - } - - return false; - } - - /** {@inheritDoc} */ - @Override protected boolean insert(Object key, Object val) throws CacheException { - return false; - } - - /** {@inheritDoc} */ - @Override protected boolean afterInsert(Object key, Object val) throws CacheException { - try { - cache.put(key, val); - - return true; - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - } - - /** {@inheritDoc} */ - @Override protected void remove(Object key) throws CacheException { - WriteContext ctx = writeCtx.get(); - - if (ctx != null) - ctx.removed(key); - } - - /** - * Information about updates done during single database transaction. - */ - @SuppressWarnings("TypeMayBeWeakened") - private static class WriteContext { - /** */ - private Map updates; - - /** */ - private Set rmvs; - - /** */ - private Set locked = new GridLeanSet<>(); - - /** - * Marks key as locked. - * - * @param key Key. - */ - void locked(Object key) { - locked.add(key); - } - - /** - * Marks key as unlocked. - * - * @param key Key. - * @return {@code True} if last locked key was unlocked. - */ - boolean unlocked(Object key) { - locked.remove(key); - - return locked.isEmpty(); - } - - /** - * Marks key as updated. - * - * @param key Key. - * @param val Value. - */ - void updated(Object key, Object val) { - if (updates == null) - updates = new GridLeanMap<>(); - - updates.put(key, val); - } - - /** - * Marks key as removed. - * - * @param key Key. - */ - void removed(Object key) { - if (rmvs == null) - rmvs = new GridLeanSet<>(); - - rmvs.add(key); - } - - /** - * Updates cache. - * - * @param cache Cache. - * @throws IgniteCheckedException If failed. - */ - void updateCache(HibernateCacheProxy cache) throws IgniteCheckedException { - if (!F.isEmpty(rmvs)) - cache.removeAll(rmvs); - - if (!F.isEmpty(updates)) - cache.putAll(updates); - } - } -} \ No newline at end of file diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadWriteAccessStrategy.java b/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadWriteAccessStrategy.java deleted file mode 100644 index ae9bd71d255a6..0000000000000 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateReadWriteAccessStrategy.java +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.cache.hibernate; - -import java.util.Set; -import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.IgniteException; -import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal; -import org.apache.ignite.internal.util.GridLeanSet; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.access.AccessType; -import org.hibernate.cache.spi.access.SoftLock; - -import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; -import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ; - -/** - * Implementation of {@link AccessType#READ_WRITE} cache access strategy. - *

- * Configuration of L2 cache and per-entity cache access strategy can be set in the - * Hibernate configuration file: - *

- * <hibernate-configuration>
- *     <!-- Enable L2 cache. -->
- *     <property name="cache.use_second_level_cache">true</property>
- *
- *     <!-- Use Ignite as L2 cache provider. -->
- *     <property name="cache.region.factory_class">org.apache.ignite.cache.hibernate.HibernateRegionFactory</property>
- *
- *     <!-- Specify entity. -->
- *     <mapping class="com.example.Entity"/>
- *
- *     <!-- Enable L2 cache with read-write access strategy for entity. -->
- *     <class-cache class="com.example.Entity" usage="read-write"/>
- * </hibernate-configuration>
- * 
- * Also cache access strategy can be set using annotations: - *
- * @javax.persistence.Entity
- * @javax.persistence.Cacheable
- * @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
- * public class Entity { ... }
- * 
- */ -public class HibernateReadWriteAccessStrategy extends HibernateAccessStrategyAdapter { - /** */ - private final ThreadLocal txCtx; - - /** - * @param ignite Grid. - * @param cache Cache. - * @param txCtx Thread local instance used to track updates done during one Hibernate transaction. - */ - protected HibernateReadWriteAccessStrategy(Ignite ignite, HibernateCacheProxy cache, ThreadLocal txCtx) { - super(ignite, cache); - - this.txCtx = (ThreadLocal)txCtx; - } - - /** {@inheritDoc} */ - @Override protected Object get(Object key) throws CacheException { - boolean success = false; - - try { - Object o = cache.get(key); - - success = true; - - return o; - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - finally { - if (!success) - rollbackCurrentTx(); - } - } - - /** {@inheritDoc} */ - @Override protected void putFromLoad(Object key, Object val) throws CacheException { - boolean success = false; - - try { - cache.put(key, val); - - success = true; - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - finally { - if (!success) - rollbackCurrentTx(); - } - } - - /** {@inheritDoc} */ - @Override protected SoftLock lock(Object key) throws CacheException { - boolean success = false; - - try { - TxContext ctx = txCtx.get(); - - if (ctx == null) - txCtx.set(ctx = new TxContext()); - - lockKey(key); - - ctx.locked(key); - - success = true; - - return null; - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - finally { - if (!success) - rollbackCurrentTx(); - } - } - - /** {@inheritDoc} */ - @Override protected void unlock(Object key, SoftLock lock) throws CacheException { - boolean success = false; - - try { - TxContext ctx = txCtx.get(); - - if (ctx != null) - unlock(ctx, key); - - success = true; - } - catch (Exception e) { - throw new CacheException(e); - } - finally { - if (!success) - rollbackCurrentTx(); - } - } - - /** {@inheritDoc} */ - @Override protected boolean update(Object key, Object val) throws CacheException { - return false; - } - - /** {@inheritDoc} */ - @Override protected boolean afterUpdate(Object key, Object val, SoftLock lock) throws CacheException { - boolean success = false; - boolean res = false; - - try { - TxContext ctx = txCtx.get(); - - if (ctx != null) { - cache.put(key, val); - - unlock(ctx, key); - - res = true; - } - - success = true; - - return res; - } - catch (Exception e) { - throw new CacheException(e); - } - finally { - if (!success) - rollbackCurrentTx(); - } - } - - /** {@inheritDoc} */ - @Override protected boolean insert(Object key, Object val) throws CacheException { - return false; - } - - /** {@inheritDoc} */ - @Override protected boolean afterInsert(Object key, Object val) throws CacheException { - boolean success = false; - - try { - cache.put(key, val); - - success = true; - - return true; - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - finally { - if (!success) - rollbackCurrentTx(); - } - } - - /** {@inheritDoc} */ - @Override protected void remove(Object key) throws CacheException { - boolean success = false; - - try { - TxContext ctx = txCtx.get(); - - if (ctx != null) - cache.remove(key); - - success = true; - } - catch (IgniteCheckedException e) { - throw new CacheException(e); - } - finally { - if (!success) - rollbackCurrentTx(); - } - } - - /** - * - * @param ctx Transaction context. - * @param key Key. - * @throws CacheException If failed. - */ - private void unlock(TxContext ctx, Object key) throws CacheException { - if (ctx.unlocked(key)) { // Finish transaction if last key is unlocked. - txCtx.remove(); - - GridNearTxLocal tx = cache.tx(); - - assert tx != null; - - try { - tx.proxy().commit(); - } - finally { - tx.proxy().close(); - } - - assert cache.tx() == null; - } - } - - /** - * Roll backs current transaction. - */ - private void rollbackCurrentTx() { - try { - TxContext ctx = txCtx.get(); - - if (ctx != null) { - txCtx.remove(); - - GridNearTxLocal tx = cache.tx(); - - if (tx != null) - tx.proxy().rollback(); - } - } - catch (IgniteException e) { - log.error("Failed to rollback cache transaction.", e); - } - } - - /** - * @param key Key. - * @throws IgniteCheckedException If failed. - */ - private void lockKey(Object key) throws IgniteCheckedException { - if (cache.tx() == null) - cache.txStart(PESSIMISTIC, REPEATABLE_READ); - - cache.get(key); // Acquire distributed lock. - } - - /** - * Information about updates done during single database transaction. - */ - @SuppressWarnings("TypeMayBeWeakened") - private static class TxContext { - /** */ - private Set locked = new GridLeanSet<>(); - - /** - * Marks key as locked. - * - * @param key Key. - */ - void locked(Object key) { - locked.add(key); - } - - /** - * Marks key as unlocked. - * - * @param key Key. - * @return {@code True} if last locked key was unlocked. - */ - boolean unlocked(Object key) { - locked.remove(key); - - return locked.isEmpty(); - } - } -} \ No newline at end of file diff --git a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java b/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java deleted file mode 100644 index 0cf03d79e019e..0000000000000 --- a/modules/hibernate5/src/main/java/org/apache/ignite/cache/hibernate/HibernateRegionFactory.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.cache.hibernate; - -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteException; -import org.apache.ignite.IgniteLogger; -import org.apache.ignite.Ignition; -import org.apache.ignite.internal.IgniteKernal; -import org.apache.ignite.internal.processors.cache.IgniteInternalCache; -import org.apache.ignite.internal.util.typedef.G; -import org.hibernate.boot.spi.SessionFactoryOptions; -import org.hibernate.cache.CacheException; -import org.hibernate.cache.spi.CacheDataDescription; -import org.hibernate.cache.spi.CollectionRegion; -import org.hibernate.cache.spi.EntityRegion; -import org.hibernate.cache.spi.NaturalIdRegion; -import org.hibernate.cache.spi.QueryResultsRegion; -import org.hibernate.cache.spi.RegionFactory; -import org.hibernate.cache.spi.TimestampsRegion; -import org.hibernate.cache.spi.access.AccessType; - -import static org.hibernate.cache.spi.access.AccessType.NONSTRICT_READ_WRITE; - -/** - * Hibernate L2 cache region factory. - *

- * Following Hibernate settings should be specified to enable second level cache and to use this - * region factory for caching: - *

- * hibernate.cache.use_second_level_cache=true
- * hibernate.cache.region.factory_class=org.apache.ignite.cache.hibernate.HibernateRegionFactory
- * 
- * Note that before region factory is started you need to start properly configured Ignite node in the same JVM. - * For example to start Ignite node one of loader provided in {@code org.apache.ignite.grid.startup} package can be used. - *

- * Name of Ignite instance to be used for region factory must be specified as following Hibernate property: - *

- * org.apache.ignite.hibernate.ignite_instance_name=<Ignite instance name>
- * 
- * Each Hibernate cache region must be associated with some {@link IgniteInternalCache}, by default it is assumed that - * for each cache region there is a {@link IgniteInternalCache} with the same name. Also it is possible to define - * region to cache mapping using properties with prefix {@code org.apache.ignite.hibernate.region_cache}. - * For example if for region with name "region1" cache with name "cache1" should be used then following - * Hibernate property should be specified: - *
- * org.apache.ignite.hibernate.region_cache.region1=cache1
- * 
- */ -public class HibernateRegionFactory implements RegionFactory { - /** */ - private static final long serialVersionUID = 0L; - - /** - * Hibernate L2 cache grid name property name. - * - * @deprecated Use {@link #IGNITE_INSTANCE_NAME_PROPERTY}. - * If {@link #IGNITE_INSTANCE_NAME_PROPERTY} is specified it takes precedence. - */ - @Deprecated - public static final String GRID_NAME_PROPERTY = "org.apache.ignite.hibernate.grid_name"; - - /** Hibernate L2 cache Ignite instance name property name. */ - public static final String IGNITE_INSTANCE_NAME_PROPERTY = "org.apache.ignite.hibernate.ignite_instance_name"; - - /** Default cache property name. */ - public static final String DFLT_CACHE_NAME_PROPERTY = "org.apache.ignite.hibernate.default_cache"; - - /** Property prefix used to specify region name to cache name mapping. */ - public static final String REGION_CACHE_PROPERTY = "org.apache.ignite.hibernate.region_cache."; - - /** */ - public static final String DFLT_ACCESS_TYPE_PROPERTY = "org.apache.ignite.hibernate.default_access_type"; - - /** */ - public static final String GRID_CONFIG_PROPERTY = "org.apache.ignite.hibernate.grid_config"; - - /** Grid providing caches. */ - private Ignite ignite; - - /** Default cache. */ - private HibernateCacheProxy dfltCache; - - /** Default region access type. */ - private AccessType dfltAccessType; - - /** Region name to cache name mapping. */ - private final Map regionCaches = new HashMap<>(); - - /** Map needed to provide the same transaction context for different regions. */ - private final ThreadLocal threadLoc = new ThreadLocal(); - - /** Key transformer. */ - private final HibernateKeyTransformer hibernate4transformer = new HibernateKeyTransformer() { - @Override public Object transform(Object key) { - return key; - } - }; - - /** {@inheritDoc} */ - @Override public void start(SessionFactoryOptions settings, Properties props) throws CacheException { - String gridCfg = props.getProperty(GRID_CONFIG_PROPERTY); - String igniteInstanceName = props.getProperty(IGNITE_INSTANCE_NAME_PROPERTY); - - if (igniteInstanceName == null) - igniteInstanceName = props.getProperty(GRID_NAME_PROPERTY); - - if (gridCfg != null) { - try { - ignite = G.start(gridCfg); - } - catch (IgniteException e) { - throw new CacheException(e); - } - } - else - ignite = Ignition.ignite(igniteInstanceName); - - String accessType = props.getProperty(DFLT_ACCESS_TYPE_PROPERTY, NONSTRICT_READ_WRITE.name()); - - dfltAccessType = AccessType.valueOf(accessType); - - for (Map.Entry prop : props.entrySet()) { - String key = prop.getKey().toString(); - - if (key.startsWith(REGION_CACHE_PROPERTY)) { - String regionName = key.substring(REGION_CACHE_PROPERTY.length()); - - String cacheName = prop.getValue().toString(); - - if (((IgniteKernal)ignite).getCache(cacheName) == null) - throw new CacheException("Cache '" + cacheName + "' specified for region '" + regionName + "' " + - "is not configured."); - - regionCaches.put(regionName, cacheName); - } - } - - String dfltCacheName = props.getProperty(DFLT_CACHE_NAME_PROPERTY); - - if (dfltCacheName != null) { - IgniteInternalCache dfltCache = ((IgniteKernal)ignite).getCache(dfltCacheName); - - if (dfltCache == null) - throw new CacheException("Cache specified as default is not configured: " + dfltCacheName); - - this.dfltCache = new HibernateCacheProxy(dfltCache, hibernate4transformer); - } - - IgniteLogger log = ignite.log().getLogger(HibernateRegionFactory.class); - - if (log.isDebugEnabled()) - log.debug("HibernateRegionFactory started [igniteInstanceName=" + igniteInstanceName + ']'); - } - - /** {@inheritDoc} */ - @Override public void stop() { - // No-op. - } - - /** {@inheritDoc} */ - @Override public boolean isMinimalPutsEnabledByDefault() { - return false; - } - - /** {@inheritDoc} */ - @Override public AccessType getDefaultAccessType() { - return dfltAccessType; - } - - /** {@inheritDoc} */ - @Override public long nextTimestamp() { - return System.currentTimeMillis(); - } - - /** {@inheritDoc} */ - @Override public EntityRegion buildEntityRegion(String regionName, Properties props, CacheDataDescription metadata) - throws CacheException { - return new HibernateEntityRegion(this, regionName, ignite, regionCache(regionName), metadata); - } - - /** {@inheritDoc} */ - @Override public NaturalIdRegion buildNaturalIdRegion(String regionName, Properties props, - CacheDataDescription metadata) throws CacheException { - return new HibernateNaturalIdRegion(this, regionName, ignite, regionCache(regionName), metadata); - } - - /** {@inheritDoc} */ - @Override public CollectionRegion buildCollectionRegion(String regionName, Properties props, - CacheDataDescription metadata) throws CacheException { - return new HibernateCollectionRegion(this, regionName, ignite, regionCache(regionName), metadata); - } - - /** {@inheritDoc} */ - @Override public QueryResultsRegion buildQueryResultsRegion(String regionName, Properties props) - throws CacheException { - return new HibernateQueryResultsRegion(this, regionName, ignite, regionCache(regionName)); - } - - /** {@inheritDoc} */ - @Override public TimestampsRegion buildTimestampsRegion(String regionName, Properties props) throws CacheException { - return new HibernateTimestampsRegion(this, regionName, ignite, regionCache(regionName)); - } - - /** - * Reuse same thread local for the same cache across different regions. - * - * @param cacheName Cache name. - * @return Thread local instance used to track updates done during one Hibernate transaction. - */ - ThreadLocal threadLocalForCache(String cacheName) { - return threadLoc; - } - - /** - * @param regionName L2 cache region name. - * @return Cache for given region. - * @throws CacheException If cache for given region is not configured. - */ - private HibernateCacheProxy regionCache(String regionName) throws CacheException { - String cacheName = regionCaches.get(regionName); - - if (cacheName == null) { - if (dfltCache != null) - return dfltCache; - - cacheName = regionName; - } - - IgniteInternalCache cache = ((IgniteKernal)ignite).getCache(cacheName); - - if (cache == null) - throw new CacheException("Cache '" + cacheName + "' for region '" + regionName + "' is not configured."); - - return new HibernateCacheProxy(cache, hibernate4transformer); - } -} \ No newline at end of file diff --git a/modules/osgi-karaf/src/main/resources/features.xml b/modules/osgi-karaf/src/main/resources/features.xml index f6bdf2b48cf20..9846d971fe50d 100644 --- a/modules/osgi-karaf/src/main/resources/features.xml +++ b/modules/osgi-karaf/src/main/resources/features.xml @@ -110,7 +110,7 @@ NOTE: Take into account that certain parts of Hibernate are offered under the LGPL license.]]> hibernate - mvn:org.apache.ignite/ignite-hibernate/${project.version} + mvn:org.apache.ignite/ignite-hibernate_4.2/${project.version} diff --git a/pom.xml b/pom.xml index e1bb73ee1a19c..8a053426f5778 100644 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,7 @@ modules/flink modules/kubernetes modules/zeromq + modules/hibernate-core @@ -100,8 +101,8 @@ examples modules/benchmarks modules/geospatial - modules/hibernate5 - modules/hibernate + modules/hibernate-4.2 + modules/hibernate-5.1 modules/schedule modules/web-console/web-agent modules/yardstick @@ -197,8 +198,8 @@ lgpl - modules/hibernate - modules/hibernate5 + modules/hibernate-4.2 + modules/hibernate-5.1 modules/geospatial modules/schedule