diff --git a/documentation/src/main/asciidoc/userguide/chapters/caching/Caching.adoc b/documentation/src/main/asciidoc/userguide/chapters/caching/Caching.adoc
index f328287b62..9b35c22b2e 100644
--- a/documentation/src/main/asciidoc/userguide/chapters/caching/Caching.adoc
+++ b/documentation/src/main/asciidoc/userguide/chapters/caching/Caching.adoc
@@ -525,7 +525,7 @@ To use the `JCacheRegionFactory`, you need to specify the following configuratio
----
+ value="jcache"/>
----
====
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/internal/EnabledCaching.java b/hibernate-core/src/main/java/org/hibernate/cache/internal/EnabledCaching.java
index d5be434e34..ad01ad8dfa 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/internal/EnabledCaching.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/internal/EnabledCaching.java
@@ -74,6 +74,7 @@ public EnabledCaching(SessionFactoryImplementor sessionFactory) {
this.sessionFactory = sessionFactory;
this.regionFactory = getSessionFactory().getSessionFactoryOptions().getServiceRegistry().getService( RegionFactory.class );
+ this.regionFactory.start( sessionFactory.getSessionFactoryOptions(), sessionFactory.getProperties() );
if ( getSessionFactory().getSessionFactoryOptions().isQueryCacheEnabled() ) {
final TimestampsRegion timestampsRegion = regionFactory.buildTimestampsRegion(
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/internal/NoCachingRegionFactory.java b/hibernate-core/src/main/java/org/hibernate/cache/internal/NoCachingRegionFactory.java
index 65155a7ef4..067db2dec4 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/internal/NoCachingRegionFactory.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/internal/NoCachingRegionFactory.java
@@ -47,6 +47,11 @@ public void start(SessionFactoryOptions settings, Map configValues) throws Cache
public void stop() {
}
+ @Override
+ public String qualify(String regionName) {
+ return regionName;
+ }
+
@Override
public boolean isMinimalPutsEnabledByDefault() {
return false;
@@ -59,7 +64,7 @@ public AccessType getDefaultAccessType() {
@Override
public long nextTimestamp() {
- return System.currentTimeMillis() / 100;
+ return System.currentTimeMillis();
}
@Override
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/internal/QueryResultRegionAccessImpl.java b/hibernate-core/src/main/java/org/hibernate/cache/internal/QueryResultRegionAccessImpl.java
index d927e77185..54b8692784 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/internal/QueryResultRegionAccessImpl.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/internal/QueryResultRegionAccessImpl.java
@@ -93,7 +93,7 @@ public boolean put(
try {
session.getEventListenerManager().cachePutStart();
- cacheRegion.getAccess().addToCache( key, cacheItem );
+ cacheRegion.getStorageAccess().putIntoCache( key, cacheItem );
}
finally {
session.getEventListenerManager().cachePutEnd();
@@ -189,7 +189,7 @@ private CacheItem getCachedData(QueryKey key, SharedSessionContractImplementor s
CacheItem cachedItem = null;
try {
session.getEventListenerManager().cacheGetStart();
- cachedItem = (CacheItem) cacheRegion.getAccess().getFromCache( key );
+ cachedItem = (CacheItem) cacheRegion.getStorageAccess().getFromCache( key );
}
finally {
session.getEventListenerManager().cacheGetEnd( cachedItem != null );
@@ -288,7 +288,7 @@ public String toString() {
@Override
public void clear() throws CacheException {
- cacheRegion.getAccess().clearCache();
+ cacheRegion.getStorageAccess().clearCache();
}
public static class CacheItem implements Serializable {
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/internal/TimestampsRegionAccessEnabledImpl.java b/hibernate-core/src/main/java/org/hibernate/cache/internal/TimestampsRegionAccessEnabledImpl.java
index 1ce3d90904..c6258d98f3 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/internal/TimestampsRegionAccessEnabledImpl.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/internal/TimestampsRegionAccessEnabledImpl.java
@@ -57,7 +57,7 @@ public void preInvalidate(
//put() has nowait semantics, is this really appropriate?
//note that it needs to be async replication, never local or sync
- timestampsRegion.getAccess().addToCache( space, ts );
+ timestampsRegion.getStorageAccess().putIntoCache( space, ts );
}
finally {
session.getEventListenerManager().cachePutEnd();
@@ -84,7 +84,7 @@ public void invalidate(
try {
session.getEventListenerManager().cachePutStart();
- timestampsRegion.getAccess().addToCache( space, ts );
+ timestampsRegion.getStorageAccess().putIntoCache( space, ts );
}
finally {
session.getEventListenerManager().cachePutEnd();
@@ -135,7 +135,7 @@ private Long getLastUpdateTimestampForSpace(Serializable space, SharedSessionCon
Long ts = null;
try {
session.getEventListenerManager().cacheGetStart();
- ts = (Long) timestampsRegion.getAccess().getFromCache( space );
+ ts = (Long) timestampsRegion.getStorageAccess().getFromCache( space );
}
finally {
session.getEventListenerManager().cacheGetEnd( ts != null );
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/DirectAccessRegion.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/DirectAccessRegion.java
index 07f3c039cf..160b1d9c62 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/spi/DirectAccessRegion.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/DirectAccessRegion.java
@@ -6,6 +6,8 @@
*/
package org.hibernate.cache.spi;
+import org.hibernate.cache.spi.support.StorageAccess;
+
/**
* Specialized Region whose data is accessed directly - not requiring
* key wrapping, e.g.
@@ -13,30 +15,5 @@
* @author Steve Ebersole
*/
public interface DirectAccessRegion extends Region {
- interface DataAccess {
- Object getFromCache(Object key);
- void addToCache(Object key, Object value);
- void removeFromCache(Object key);
- void clearCache();
- }
-
- DataAccess getAccess();
-// Object get(Object key, SharedSessionContractImplementor session);
-// void put(Object key, Object value, SharedSessionContractImplementor session);
-//
-// /**
-// * Forcibly evict an item from the cache immediately without regard for transaction
-// * isolation. This behavior is exactly Hibernate legacy behavior, but it is also required
-// * by JPA - so we cannot remove it.
-// *
-// * @param key The key of the item to remove
-// */
-// void evict(Object key);
-//
-// /**
-// * Forcibly evict all items from the cache immediately without regard for transaction
-// * isolation. This behavior is exactly Hibernate legacy behavior, but it is also required
-// * by JPA - so we cannot remove it.
-// */
-// void evictAll();
+ StorageAccess getStorageAccess();
}
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/QueryResultRegionAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/QueryResultRegionAccess.java
index bfd6b22aa2..9a5ae4d912 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/spi/QueryResultRegionAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/QueryResultRegionAccess.java
@@ -36,7 +36,7 @@ public interface QueryResultRegionAccess extends QueryCache {
*/
@Override
default void clear() throws CacheException {
- getRegion().getAccess().clearCache();
+ getRegion().getStorageAccess().clearCache();
}
/**
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/QueryResultsRegion.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/QueryResultsRegion.java
index 35b6a71189..6179a544c4 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/spi/QueryResultsRegion.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/QueryResultsRegion.java
@@ -13,8 +13,4 @@
* @author Steve Ebersole
*/
public interface QueryResultsRegion extends DirectAccessRegion {
- @Override
- default void clear() {
- getAccess().clearCache();
- }
}
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/RegionFactory.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/RegionFactory.java
index 19585aa786..ea66471c5e 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/spi/RegionFactory.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/RegionFactory.java
@@ -59,7 +59,11 @@ public interface RegionFactory extends Service, Stoppable {
*/
AccessType getDefaultAccessType();
- CacheTransactionSynchronization createTransactionContext(SharedSessionContractImplementor session);
+ String qualify(String regionName);
+
+ default CacheTransactionSynchronization createTransactionContext(SharedSessionContractImplementor session) {
+ return new StandardCacheTransactionSynchronization( this );
+ }
/**
* Generate a timestamp. This value is generally used for purpose of
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/SecondLevelCacheLogger.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/SecondLevelCacheLogger.java
index 2c30cfc309..e6d9705493 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/spi/SecondLevelCacheLogger.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/SecondLevelCacheLogger.java
@@ -6,11 +6,17 @@
*/
package org.hibernate.cache.spi;
+import org.hibernate.metamodel.model.domain.NavigableRole;
+
import org.jboss.logging.BasicLogger;
import org.jboss.logging.Logger;
+import org.jboss.logging.annotations.LogMessage;
+import org.jboss.logging.annotations.Message;
import org.jboss.logging.annotations.MessageLogger;
import org.jboss.logging.annotations.ValidIdRange;
+import static org.jboss.logging.Logger.Level.WARN;
+
/**
* @author Steve Ebersole
*/
@@ -22,11 +28,18 @@ public interface SecondLevelCacheLogger extends BasicLogger {
"org.hibernate.orm.cache"
);
- enum RegionAccessType {
- ENTITY,
- NATURAL_ID,
- COLLECTION,
- QUERY_RESULTS,
- TIMESTAMPS
- }
+ @LogMessage( level = WARN )
+ @Message(
+ value = "Read-only caching was requested for mutable entity [%s]",
+ id = 90001001
+ )
+ void readOnlyCachingMutableEntity(NavigableRole navigableRole);
+
+ @LogMessage( level = WARN )
+ @Message(
+ value = "Read-only caching was requested for mutable natural-id for entity [%s]",
+ id = 90001002
+ )
+ void readOnlyCachingMutableNaturalId(NavigableRole navigableRole);
+
}
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/StandardCacheTransactionSynchronization.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/StandardCacheTransactionSynchronization.java
new file mode 100644
index 0000000000..eeab0da19d
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/StandardCacheTransactionSynchronization.java
@@ -0,0 +1,16 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * License: GNU Lesser General Public License (LGPL), version 2.1 or later
+ * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
+ */
+package org.hibernate.cache.spi;
+
+/**
+ * @author Steve Ebersole
+ */
+public class StandardCacheTransactionSynchronization extends AbstractCacheTransactionSynchronization {
+ public StandardCacheTransactionSynchronization(RegionFactory regionFactory) {
+ super( regionFactory );
+ }
+}
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/TimestampsRegion.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/TimestampsRegion.java
index a7c86c5a8f..62b9ac5dad 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/spi/TimestampsRegion.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/TimestampsRegion.java
@@ -12,6 +12,6 @@
public interface TimestampsRegion extends DirectAccessRegion {
@Override
default void clear() {
- getAccess().clearCache();
+ getStorageAccess().clearCache();
}
}
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/TimestampsRegionAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/TimestampsRegionAccess.java
index 1ea7beec60..dead81dc94 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/spi/TimestampsRegionAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/TimestampsRegionAccess.java
@@ -95,7 +95,7 @@ public void accept(Serializable serializable) {
@Override
default void clear() throws CacheException {
- getRegion().getAccess().clearCache();
+ getRegion().getStorageAccess().clearCache();
}
@Override
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/AbstractCachedDomainDataAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractCachedDomainDataAccess.java
similarity index 66%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/AbstractCachedDomainDataAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractCachedDomainDataAccess.java
index 8bfb6b91cf..2abad83a01 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/AbstractCachedDomainDataAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractCachedDomainDataAccess.java
@@ -4,13 +4,9 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
-import java.util.Collections;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.hibernate.cache.spi.AbstractDomainDataRegion;
+import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.CachedDomainDataAccess;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
@@ -23,63 +19,47 @@
public abstract class AbstractCachedDomainDataAccess implements CachedDomainDataAccess, AbstractDomainDataRegion.Destructible {
private static final Logger log = Logger.getLogger( AbstractCachedDomainDataAccess.class );
- private final DomainDataRegionImpl region;
+ private final DomainDataRegion region;
+ private final DomainDataStorageAccess storageAccess;
- private Map data;
-
- protected AbstractCachedDomainDataAccess(DomainDataRegionImpl region) {
+ protected AbstractCachedDomainDataAccess(
+ DomainDataRegion region,
+ DomainDataStorageAccess storageAccess) {
this.region = region;
+ this.storageAccess = storageAccess;
}
@Override
- public DomainDataRegionImpl getRegion() {
+ public DomainDataRegion getRegion() {
return region;
}
protected Object getFromCache(Object key) {
- log.debugf( "Locating entry in cache data map [region=`%s`] : %s", key );
- if ( data == null ) {
- return null;
- }
- return data.get( key );
+ log.debugf( "Locating entry in cache storage [region=`%s`] : %s", key );
+ return storageAccess.getFromCache( key );
}
@SuppressWarnings({"unchecked", "WeakerAccess"})
protected void addToCache(Object key, Object value) {
- log.debugf( "Adding entry to cache data map [region=`%s`] : %s -> %s", getRegion().getName(), key, value );
- getOrMakeData().put( key, value );
+ log.debugf( "Adding entry to cache storage [region=`%s`] : %s -> %s", getRegion().getName(), key, value );
+ storageAccess.putIntoCache( key, value );
}
@SuppressWarnings({"unchecked", "WeakerAccess"})
protected void removeFromCache(Object key) {
- log.debugf( "Removing entry from cache data map [region=`%s`] : %s", key );
- if ( data != null ) {
- data.remove( key );
- }
+ log.debugf( "Removing entry from cache storage [region=`%s`] : %s", key );
+ storageAccess.removeFromCache( key );
}
@SuppressWarnings({"unchecked", "WeakerAccess"})
protected void clearCache() {
log.debugf( "Clearing cache data map [region=`%s`]" );
- if ( data != null ) {
- data.clear();
- }
- }
-
- public Map getData() {
- return data == null ? Collections.emptyMap() : Collections.unmodifiableMap( data );
- }
-
- private Map getOrMakeData() {
- if ( data == null ) {
- data = new ConcurrentHashMap();
- }
- return data;
+ storageAccess.clearCache();
}
@Override
public boolean contains(Object key) {
- return data != null && data.containsKey( key );
+ return storageAccess.contains( key );
}
@Override
@@ -142,8 +122,6 @@ public void evictAll() {
@Override
public void destroy() {
- if ( data != null ) {
- data.clear();
- }
+ storageAccess.release();
}
}
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/BaseCollectionDataAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractCollectionDataAccess.java
similarity index 64%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/BaseCollectionDataAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractCollectionDataAccess.java
index ccd5bbdd46..1556561a73 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/BaseCollectionDataAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractCollectionDataAccess.java
@@ -4,8 +4,11 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
+import org.hibernate.cache.cfg.spi.CollectionDataCachingConfig;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.CollectionDataAccess;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SessionFactoryImplementor;
@@ -15,22 +18,29 @@
/**
* @author Steve Ebersole
*/
-public abstract class BaseCollectionDataAccess
+public abstract class AbstractCollectionDataAccess
extends AbstractCachedDomainDataAccess
implements CollectionDataAccess {
- public BaseCollectionDataAccess(DomainDataRegionImpl region) {
- super( region );
+ private final CacheKeysFactory keysFactory;
+
+ public AbstractCollectionDataAccess(
+ DomainDataRegion region,
+ CacheKeysFactory keysFactory,
+ DomainDataStorageAccess storageAccess,
+ CollectionDataCachingConfig config) {
+ super( region, storageAccess );
+ this.keysFactory = keysFactory;
}
@Override
public Object generateCacheKey(Object id, CollectionPersister persister, SessionFactoryImplementor factory, String tenantIdentifier) {
- return getRegion().getEffectiveKeysFactory().createCollectionKey( id, persister, factory, tenantIdentifier );
+ return keysFactory.createCollectionKey( id, persister, factory, tenantIdentifier );
}
@Override
public Object getCacheKeyId(Object cacheKey) {
- return getRegion().getEffectiveKeysFactory().getCollectionId( cacheKey );
+ return keysFactory.getCollectionId( cacheKey );
}
@Override
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/AbstractDomainDataRegion.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractDomainDataRegion.java
similarity index 87%
rename from hibernate-core/src/main/java/org/hibernate/cache/spi/AbstractDomainDataRegion.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractDomainDataRegion.java
index 6c59c1ad27..2fe71ab9fd 100644
--- a/hibernate-core/src/main/java/org/hibernate/cache/spi/AbstractDomainDataRegion.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractDomainDataRegion.java
@@ -4,7 +4,7 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.cache.spi;
+package org.hibernate.cache.spi.support;
import java.util.Collections;
import java.util.Map;
@@ -16,6 +16,8 @@
import org.hibernate.cache.cfg.spi.DomainDataRegionConfig;
import org.hibernate.cache.cfg.spi.EntityDataCachingConfig;
import org.hibernate.cache.cfg.spi.NaturalIdDataCachingConfig;
+import org.hibernate.cache.spi.DomainDataRegion;
+import org.hibernate.cache.spi.RegionFactory;
import org.hibernate.cache.spi.access.CollectionDataAccess;
import org.hibernate.cache.spi.access.EntityDataAccess;
import org.hibernate.cache.spi.access.NaturalIdDataAccess;
@@ -25,10 +27,8 @@
/**
* @author Steve Ebersole
*/
-public abstract class AbstractDomainDataRegion implements DomainDataRegion {
- private final String name;
+public abstract class AbstractDomainDataRegion extends AbstractRegion implements DomainDataRegion {
private final SessionFactoryImplementor sessionFactory;
- private final RegionFactory regionFactory;
private final Map entityDataAccessMap;
private final Map naturalIdDataAccessMap;
@@ -37,35 +37,30 @@ public abstract class AbstractDomainDataRegion implements DomainDataRegion {
public AbstractDomainDataRegion(
DomainDataRegionConfig regionConfig,
RegionFactory regionFactory,
+ DomainDataStorageAccess storageAccess,
DomainDataRegionBuildingContext buildingContext) {
- this.name = regionConfig.getRegionName();
+ super( regionFactory.qualify( regionConfig.getRegionName() ), regionFactory, storageAccess );
this.sessionFactory = buildingContext.getSessionFactory();
- this.regionFactory = regionFactory;
this.entityDataAccessMap = generateEntityDataAccessMap( regionConfig );
this.naturalIdDataAccessMap = generateNaturalIdDataAccessMap( regionConfig );
this.collectionDataAccessMap = generateCollectionDataAccessMap( regionConfig );
}
- @Override
- public String getName() {
- return name;
- }
-
public SessionFactoryImplementor getSessionFactory() {
return sessionFactory;
}
@Override
- public RegionFactory getRegionFactory() {
- return regionFactory;
+ public DomainDataStorageAccess getStorageAccess() {
+ return (DomainDataStorageAccess) super.getStorageAccess();
}
@Override
public EntityDataAccess getEntityDataAccess(NavigableRole rootEntityRole) {
final EntityDataAccess access = entityDataAccessMap.get( rootEntityRole );
if ( access == null ) {
- // todo (6.0) : is it an error here if the entity is not configured for caching (no map hit)?
+ throw new IllegalArgumentException( "Caching was not configured for entity : " + rootEntityRole.getFullPath() );
}
return access;
}
@@ -75,7 +70,7 @@ public EntityDataAccess getEntityDataAccess(NavigableRole rootEntityRole) {
public NaturalIdDataAccess getNaturalIdDataAccess(NavigableRole rootEntityRole) {
final NaturalIdDataAccess access = naturalIdDataAccessMap.get( rootEntityRole );
if ( access == null ) {
- // todo (6.0) : is it an error here if the entity is not configured for caching (no map hit)?
+ throw new IllegalArgumentException( "Caching was not configured for entity natural-id : " + rootEntityRole.getFullPath() );
}
return access;
}
@@ -84,7 +79,7 @@ public NaturalIdDataAccess getNaturalIdDataAccess(NavigableRole rootEntityRole)
public CollectionDataAccess getCollectionDataAccess(NavigableRole collectionRole) {
final CollectionDataAccess access = collectionDataAccessMap.get( collectionRole );
if ( access == null ) {
- // todo (6.0) : is it an error here if the entity is not configured for caching (no map hit)?
+ throw new IllegalArgumentException( "Caching was not configured for collection : " + collectionRole.getFullPath() );
}
return access;
}
@@ -159,6 +154,8 @@ public void clear() {
for ( CollectionDataAccess cacheAccess : collectionDataAccessMap.values() ) {
cacheAccess.evictAll();
}
+
+ getStorageAccess().release();
}
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/BaseEntityDataAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractEntityDataAccess.java
similarity index 70%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/BaseEntityDataAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractEntityDataAccess.java
index b8efe08191..7370895f7b 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/BaseEntityDataAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractEntityDataAccess.java
@@ -4,8 +4,10 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.EntityDataAccess;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SessionFactoryImplementor;
@@ -15,12 +17,18 @@
/**
* @author Steve Ebersole
*/
-public abstract class BaseEntityDataAccess
+public abstract class AbstractEntityDataAccess
extends AbstractCachedDomainDataAccess
implements EntityDataAccess {
- public BaseEntityDataAccess(DomainDataRegionImpl region) {
- super( region );
+ private final CacheKeysFactory cacheKeysFactory;
+
+ public AbstractEntityDataAccess(
+ DomainDataRegion region,
+ CacheKeysFactory cacheKeysFactory,
+ DomainDataStorageAccess storageAccess) {
+ super( region, storageAccess );
+ this.cacheKeysFactory = cacheKeysFactory;
}
@Override
@@ -29,7 +37,7 @@ public Object generateCacheKey(
EntityPersister rootEntityDescriptor,
SessionFactoryImplementor factory,
String tenantIdentifier) {
- return getRegion().getEffectiveKeysFactory().createEntityKey(
+ return cacheKeysFactory.createEntityKey(
id,
rootEntityDescriptor,
factory,
@@ -39,7 +47,7 @@ public Object generateCacheKey(
@Override
public Object getCacheKeyId(Object cacheKey) {
- return getRegion().getEffectiveKeysFactory().getEntityId( cacheKey );
+ return cacheKeysFactory.getEntityId( cacheKey );
}
@Override
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/BaseNaturalIdDataAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractNaturalIdDataAccess.java
similarity index 69%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/BaseNaturalIdDataAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractNaturalIdDataAccess.java
index 5dd4b71fe5..9c87affecc 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/BaseNaturalIdDataAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractNaturalIdDataAccess.java
@@ -4,8 +4,11 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
+import org.hibernate.cache.cfg.spi.NaturalIdDataCachingConfig;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.NaturalIdDataAccess;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
@@ -14,9 +17,16 @@
/**
* @author Steve Ebersole
*/
-public abstract class BaseNaturalIdDataAccess extends AbstractCachedDomainDataAccess implements NaturalIdDataAccess {
- public BaseNaturalIdDataAccess(DomainDataRegionImpl region) {
- super( region );
+public abstract class AbstractNaturalIdDataAccess extends AbstractCachedDomainDataAccess implements NaturalIdDataAccess {
+ private final CacheKeysFactory keysFactory;
+
+ public AbstractNaturalIdDataAccess(
+ DomainDataRegion region,
+ CacheKeysFactory keysFactory,
+ DomainDataStorageAccess storageAccess,
+ NaturalIdDataCachingConfig config) {
+ super( region, storageAccess );
+ this.keysFactory = keysFactory;
}
@Override
@@ -24,12 +34,12 @@ public Object generateCacheKey(
Object[] naturalIdValues,
EntityPersister persister,
SharedSessionContractImplementor session) {
- return getRegion().getEffectiveKeysFactory().createNaturalIdKey( naturalIdValues, persister, session );
+ return keysFactory.createNaturalIdKey( naturalIdValues, persister, session );
}
@Override
public Object[] getNaturalIdValues(Object cacheKey) {
- return getRegion().getEffectiveKeysFactory().getNaturalIdValues( cacheKey );
+ return keysFactory.getNaturalIdValues( cacheKey );
}
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/AbstractReadWriteAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractReadWriteAccess.java
similarity index 96%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/AbstractReadWriteAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractReadWriteAccess.java
index f92fdba27d..e039b61825 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/AbstractReadWriteAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractReadWriteAccess.java
@@ -4,16 +4,17 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
import java.io.Serializable;
import java.util.Comparator;
+import java.util.Locale;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
-import org.hibernate.cache.spi.SecondLevelCacheLogger.RegionAccessType;
+import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
@@ -32,8 +33,10 @@ public abstract class AbstractReadWriteAccess extends AbstractCachedDomainDataAc
private final Lock readLock = reentrantReadWriteLock.readLock();
private final Lock writeLock = reentrantReadWriteLock.writeLock();
- protected AbstractReadWriteAccess(DomainDataRegionImpl region) {
- super( region );
+ protected AbstractReadWriteAccess(
+ DomainDataRegion domainDataRegion,
+ DomainDataStorageAccess storageAccess) {
+ super( domainDataRegion, storageAccess );
}
protected abstract Comparator getVersionComparator();
@@ -292,6 +295,15 @@ public boolean isUnlockable(SoftLock lock) {
public SoftLockImpl lock(long timeout, UUID uuid, long lockId) {
return new SoftLockImpl( timeout, uuid, lockId, version );
}
+
+ @Override
+ public String toString() {
+ return String.format(
+ Locale.ROOT,
+ "read-write Item(%s)",
+ getValue()
+ );
+ }
}
/**
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractRegion.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractRegion.java
new file mode 100644
index 0000000000..5b23ddd3e4
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/AbstractRegion.java
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * License: GNU Lesser General Public License (LGPL), version 2.1 or later
+ * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
+ */
+package org.hibernate.cache.spi.support;
+
+import org.hibernate.cache.CacheException;
+import org.hibernate.cache.spi.Region;
+import org.hibernate.cache.spi.RegionFactory;
+
+/**
+ * @author Steve Ebersole
+ */
+public abstract class AbstractRegion implements Region {
+ private final String name;
+ private final RegionFactory regionFactory;
+ private final StorageAccess storageAccess;
+
+ public AbstractRegion(String name, RegionFactory regionFactory, StorageAccess storageAccess) {
+ this.name = regionFactory.qualify( name );
+ this.regionFactory = regionFactory;
+ this.storageAccess = storageAccess;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public RegionFactory getRegionFactory() {
+ return regionFactory;
+ }
+
+ public StorageAccess getStorageAccess() {
+ return storageAccess;
+ }
+
+ @Override
+ public void clear() {
+ storageAccess.clearCache();
+ }
+
+ @Override
+ public void destroy() throws CacheException {
+ storageAccess.release();
+ }
+}
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/CollectionNonStrictReadWriteAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/CollectionNonStrictReadWriteAccess.java
similarity index 54%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/CollectionNonStrictReadWriteAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/CollectionNonStrictReadWriteAccess.java
index 9a6a08ff40..24f94448ed 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/CollectionNonStrictReadWriteAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/CollectionNonStrictReadWriteAccess.java
@@ -4,20 +4,27 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
import org.hibernate.cache.cfg.spi.CollectionDataCachingConfig;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
/**
+ * Standard support for {@link org.hibernate.cache.spi.access.CollectionDataAccess}
+ * using the {@link org.hibernate.cache.spi.access.AccessType#NONSTRICT_READ_WRITE} access type.
+ *
* @author Steve Ebersole
*/
-public class CollectionNonStrictReadWriteAccess extends BaseCollectionDataAccess {
+public class CollectionNonStrictReadWriteAccess extends AbstractCollectionDataAccess {
public CollectionNonStrictReadWriteAccess(
- DomainDataRegionImpl region,
+ DomainDataRegion region,
+ CacheKeysFactory keysFactory,
+ DomainDataStorageAccess storageAccess,
CollectionDataCachingConfig config) {
- super( region );
+ super( region, keysFactory, storageAccess, config );
}
@Override
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/support/CollectionReadOnlyAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/CollectionReadOnlyAccess.java
new file mode 100644
index 0000000000..686bbd7e2a
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/CollectionReadOnlyAccess.java
@@ -0,0 +1,27 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * License: GNU Lesser General Public License (LGPL), version 2.1 or later
+ * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
+ */
+package org.hibernate.cache.spi.support;
+
+import org.hibernate.cache.cfg.spi.CollectionDataCachingConfig;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
+
+/**
+ * Standard support for {@link org.hibernate.cache.spi.access.CollectionDataAccess}
+ * using the {@link org.hibernate.cache.spi.access.AccessType#READ_ONLY} access type.
+ *
+ * @author Steve Ebersole
+ */
+public class CollectionReadOnlyAccess extends AbstractCollectionDataAccess {
+ public CollectionReadOnlyAccess(
+ DomainDataRegion region,
+ CacheKeysFactory keysFactory,
+ DomainDataStorageAccess storageAccess,
+ CollectionDataCachingConfig config) {
+ super( region, keysFactory, storageAccess, config );
+ }
+}
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/CollectionReadWriteAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/CollectionReadWriteAccess.java
similarity index 72%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/CollectionReadWriteAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/CollectionReadWriteAccess.java
index 3efe9c57e5..84da057d61 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/CollectionReadWriteAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/CollectionReadWriteAccess.java
@@ -4,37 +4,45 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
import java.util.Comparator;
import org.hibernate.cache.cfg.spi.CollectionDataCachingConfig;
-import org.hibernate.cache.spi.SecondLevelCacheLogger;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.CollectionDataAccess;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.metamodel.model.domain.NavigableRole;
import org.hibernate.persister.collection.CollectionPersister;
-
/**
+ * Standard support for {@link org.hibernate.cache.spi.access.CollectionDataAccess}
+ * using the {@link org.hibernate.cache.spi.access.AccessType#READ_WRITE} access type.
+ *
* @author Chris Cranford
+ * @author Steve Ebersole
*/
public class CollectionReadWriteAccess extends AbstractReadWriteAccess implements CollectionDataAccess {
private final NavigableRole collectionRole;
private final Comparator versionComparator;
+ private final CacheKeysFactory keysFactory;
public CollectionReadWriteAccess(
- DomainDataRegionImpl region,
+ DomainDataRegion region,
+ CacheKeysFactory keysFactory,
+ DomainDataStorageAccess storageAccess,
CollectionDataCachingConfig config) {
- super( region );
+ super( region, storageAccess );
+ this.keysFactory = keysFactory;
this.collectionRole = config.getNavigableRole();
this.versionComparator = config.getOwnerVersionComparator();
}
@Override
- protected SecondLevelCacheLogger.RegionAccessType getAccessType() {
- return SecondLevelCacheLogger.RegionAccessType.COLLECTION;
+ protected RegionAccessType getAccessType() {
+ return RegionAccessType.COLLECTION;
}
@Override
@@ -43,12 +51,12 @@ public Object generateCacheKey(
CollectionPersister collectionDescriptor,
SessionFactoryImplementor factory,
String tenantIdentifier) {
- return getRegion().getEffectiveKeysFactory().createCollectionKey( id, collectionDescriptor, factory, tenantIdentifier );
+ return keysFactory.createCollectionKey( id, collectionDescriptor, factory, tenantIdentifier );
}
@Override
public Object getCacheKeyId(Object cacheKey) {
- return getRegion().getEffectiveKeysFactory().getCollectionId( cacheKey );
+ return keysFactory.getCollectionId( cacheKey );
}
@Override
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/support/DomainDataStorageAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/DomainDataStorageAccess.java
new file mode 100644
index 0000000000..476aa912c2
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/DomainDataStorageAccess.java
@@ -0,0 +1,14 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * License: GNU Lesser General Public License (LGPL), version 2.1 or later
+ * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
+ */
+package org.hibernate.cache.spi.support;
+
+/**
+ * @author Steve Ebersole
+ */
+public interface DomainDataStorageAccess extends StorageAccess {
+ void putFromLoad(Object key, Object value);
+}
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/EntityNonStrictReadWriteAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/EntityNonStrictReadWriteAccess.java
similarity index 71%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/EntityNonStrictReadWriteAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/EntityNonStrictReadWriteAccess.java
index 77ec8b85c1..4afdc38478 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/EntityNonStrictReadWriteAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/EntityNonStrictReadWriteAccess.java
@@ -4,19 +4,28 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
import org.hibernate.cache.CacheException;
import org.hibernate.cache.cfg.spi.EntityDataCachingConfig;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
/**
+ * Standard support for {@link org.hibernate.cache.spi.access.EntityDataAccess}
+ * using the {@link org.hibernate.cache.spi.access.AccessType#NONSTRICT_READ_WRITE} access type.
+ *
* @author Steve Ebersole
*/
-public class EntityNonStrictReadWriteAccess extends BaseEntityDataAccess {
- public EntityNonStrictReadWriteAccess(DomainDataRegionImpl domainDataRegion, EntityDataCachingConfig entityAccessConfig) {
- super( domainDataRegion );
+public class EntityNonStrictReadWriteAccess extends AbstractEntityDataAccess {
+ public EntityNonStrictReadWriteAccess(
+ DomainDataRegion domainDataRegion,
+ CacheKeysFactory keysFactory,
+ DomainDataStorageAccess storageAccess,
+ EntityDataCachingConfig entityAccessConfig) {
+ super( domainDataRegion, keysFactory, storageAccess );
}
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/EntityReadOnlyAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/EntityReadOnlyAccess.java
similarity index 68%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/EntityReadOnlyAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/EntityReadOnlyAccess.java
index cafb709062..87fe084c50 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/EntityReadOnlyAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/EntityReadOnlyAccess.java
@@ -4,22 +4,35 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
import org.hibernate.cache.cfg.spi.EntityDataCachingConfig;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
+import org.hibernate.cache.spi.SecondLevelCacheLogger;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.jboss.logging.Logger;
/**
+ * Standard support for {@link org.hibernate.cache.spi.access.EntityDataAccess}
+ * using the {@link org.hibernate.cache.spi.access.AccessType#READ_ONLY} access type.
+ *
* @author Steve Ebersole
*/
-public class EntityReadOnlyAccess extends BaseEntityDataAccess {
+public class EntityReadOnlyAccess extends AbstractEntityDataAccess {
private static final Logger log = Logger.getLogger( EntityReadOnlyAccess.class );
- public EntityReadOnlyAccess(DomainDataRegionImpl region, EntityDataCachingConfig congfig) {
- super( region );
+ public EntityReadOnlyAccess(
+ DomainDataRegion region,
+ CacheKeysFactory cacheKeysFactory,
+ DomainDataStorageAccess storageAccess,
+ EntityDataCachingConfig config) {
+ super( region, cacheKeysFactory, storageAccess );
+ if ( config.isMutable() ) {
+ SecondLevelCacheLogger.INSTANCE.readOnlyCachingMutableEntity( config.getNavigableRole() );
+ }
}
@Override
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/EntityReadWriteAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/EntityReadWriteAccess.java
similarity index 77%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/EntityReadWriteAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/EntityReadWriteAccess.java
index 6911ee7ee1..9d1b7fb58a 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/EntityReadWriteAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/EntityReadWriteAccess.java
@@ -4,12 +4,13 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
import java.util.Comparator;
import org.hibernate.cache.cfg.spi.EntityDataCachingConfig;
-import org.hibernate.cache.spi.SecondLevelCacheLogger;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.EntityDataAccess;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SessionFactoryImplementor;
@@ -17,21 +18,30 @@
import org.hibernate.persister.entity.EntityPersister;
/**
+ * Standard support for {@link org.hibernate.cache.spi.access.EntityDataAccess}
+ * using the {@link org.hibernate.cache.spi.access.AccessType#READ_WRITE} access type.
+ *
* @author Steve Ebersole
*/
public class EntityReadWriteAccess extends AbstractReadWriteAccess implements EntityDataAccess {
+ private final CacheKeysFactory keysFactory;
private final Comparator versionComparator;
- protected EntityReadWriteAccess(DomainDataRegionImpl region, EntityDataCachingConfig entityAccessConfig) {
- super( region );
+ public EntityReadWriteAccess(
+ DomainDataRegion domainDataRegion,
+ CacheKeysFactory keysFactory,
+ DomainDataStorageAccess storageAccess,
+ EntityDataCachingConfig entityAccessConfig) {
+ super( domainDataRegion, storageAccess );
+ this.keysFactory = keysFactory;
this.versionComparator = entityAccessConfig.getVersionComparatorAccess() == null
? null
: entityAccessConfig.getVersionComparatorAccess().get();
}
@Override
- protected SecondLevelCacheLogger.RegionAccessType getAccessType() {
- return SecondLevelCacheLogger.RegionAccessType.ENTITY;
+ protected RegionAccessType getAccessType() {
+ return RegionAccessType.ENTITY;
}
@Override
@@ -45,12 +55,12 @@ public Object generateCacheKey(
EntityPersister rootEntityDescriptor,
SessionFactoryImplementor factory,
String tenantIdentifier) {
- return getRegion().getEffectiveKeysFactory().createEntityKey( id, rootEntityDescriptor, factory, tenantIdentifier );
+ return keysFactory.createEntityKey( id, rootEntityDescriptor, factory, tenantIdentifier );
}
@Override
public Object getCacheKeyId(Object cacheKey) {
- return getRegion().getEffectiveKeysFactory().getEntityId( cacheKey );
+ return keysFactory.getEntityId( cacheKey );
}
@Override
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/NaturalIdNonStrictReadWriteAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/NaturalIdNonStrictReadWriteAccess.java
similarity index 65%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/NaturalIdNonStrictReadWriteAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/NaturalIdNonStrictReadWriteAccess.java
index ef195fb13e..876fdcd34d 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/NaturalIdNonStrictReadWriteAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/NaturalIdNonStrictReadWriteAccess.java
@@ -4,20 +4,27 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
import org.hibernate.cache.cfg.spi.NaturalIdDataCachingConfig;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
/**
+ * Standard support for {@link org.hibernate.cache.spi.access.NaturalIdDataAccess}
+ * using the {@link org.hibernate.cache.spi.access.AccessType#NONSTRICT_READ_WRITE} access type.
+ *
* @author Steve Ebersole
*/
-public class NaturalIdNonStrictReadWriteAccess extends BaseNaturalIdDataAccess {
+public class NaturalIdNonStrictReadWriteAccess extends AbstractNaturalIdDataAccess {
public NaturalIdNonStrictReadWriteAccess(
- DomainDataRegionImpl region,
- NaturalIdDataCachingConfig naturalIdDataCachingConfig) {
- super( region );
+ DomainDataRegion region,
+ CacheKeysFactory keysFactory,
+ DomainDataStorageAccess storageAccess,
+ NaturalIdDataCachingConfig config) {
+ super( region, keysFactory, storageAccess, config );
}
@Override
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/support/NaturalIdReadOnlyAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/NaturalIdReadOnlyAccess.java
new file mode 100644
index 0000000000..873dda5984
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/NaturalIdReadOnlyAccess.java
@@ -0,0 +1,41 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * License: GNU Lesser General Public License (LGPL), version 2.1 or later
+ * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
+ */
+package org.hibernate.cache.spi.support;
+
+import org.hibernate.cache.cfg.spi.NaturalIdDataCachingConfig;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
+import org.hibernate.cache.spi.SecondLevelCacheLogger;
+import org.hibernate.cache.spi.access.SoftLock;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+
+/**
+ * Standard support for {@link org.hibernate.cache.spi.access.NaturalIdDataAccess}
+ * using the {@link org.hibernate.cache.spi.access.AccessType#READ_ONLY} access type.
+ *
+ * @author Steve Ebersole
+ */
+public class NaturalIdReadOnlyAccess extends AbstractNaturalIdDataAccess {
+ public NaturalIdReadOnlyAccess(
+ DomainDataRegion region,
+ CacheKeysFactory keysFactory,
+ DomainDataStorageAccess storageAccess,
+ NaturalIdDataCachingConfig config) {
+ super( region, keysFactory, storageAccess, config );
+ if ( config.isMutable() ) {
+ SecondLevelCacheLogger.INSTANCE.readOnlyCachingMutableNaturalId( config.getNavigableRole() );
+ }
+ }
+
+ @Override
+ public void unlockItem(
+ SharedSessionContractImplementor session,
+ Object key,
+ SoftLock lock) {
+ evict( key );
+ }
+}
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/NaturalIdReadWriteAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/NaturalIdReadWriteAccess.java
similarity index 76%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/NaturalIdReadWriteAccess.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/NaturalIdReadWriteAccess.java
index e5a4f56dd0..e29d015c63 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/NaturalIdReadWriteAccess.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/NaturalIdReadWriteAccess.java
@@ -4,31 +4,39 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.spi.support;
import java.util.Comparator;
import org.hibernate.cache.cfg.spi.NaturalIdDataCachingConfig;
-import org.hibernate.cache.spi.SecondLevelCacheLogger;
+import org.hibernate.cache.spi.CacheKeysFactory;
+import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.NaturalIdDataAccess;
import org.hibernate.cache.spi.access.SoftLock;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.persister.entity.EntityPersister;
/**
+ * Standard support for {@link org.hibernate.cache.spi.access.NaturalIdDataAccess}
+ * using the {@link org.hibernate.cache.spi.access.AccessType#READ_WRITE} access type.
+ *
* @author Steve Ebersole
*/
public class NaturalIdReadWriteAccess extends AbstractReadWriteAccess implements NaturalIdDataAccess {
+ private final CacheKeysFactory keysFactory;
public NaturalIdReadWriteAccess(
- DomainDataRegionImpl region,
+ DomainDataRegion region,
+ CacheKeysFactory keysFactory,
+ DomainDataStorageAccess storageAccess,
NaturalIdDataCachingConfig naturalIdDataCachingConfig) {
- super( region );
+ super( region, storageAccess );
+ this.keysFactory = keysFactory;
}
@Override
- protected SecondLevelCacheLogger.RegionAccessType getAccessType() {
- return SecondLevelCacheLogger.RegionAccessType.NATURAL_ID;
+ protected RegionAccessType getAccessType() {
+ return RegionAccessType.NATURAL_ID;
}
@Override
@@ -42,12 +50,12 @@ public Object generateCacheKey(
Object[] naturalIdValues,
EntityPersister rootEntityDescriptor,
SharedSessionContractImplementor session) {
- return getRegion().getEffectiveKeysFactory().createNaturalIdKey( naturalIdValues, rootEntityDescriptor, session );
+ return keysFactory.createNaturalIdKey( naturalIdValues, rootEntityDescriptor, session );
}
@Override
public Object[] getNaturalIdValues(Object cacheKey) {
- return getRegion().getEffectiveKeysFactory().getNaturalIdValues( cacheKey );
+ return keysFactory.getNaturalIdValues( cacheKey );
}
@Override
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/support/RegionAccessType.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/RegionAccessType.java
new file mode 100644
index 0000000000..b8bab180a4
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/RegionAccessType.java
@@ -0,0 +1,18 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * License: GNU Lesser General Public License (LGPL), version 2.1 or later
+ * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
+ */
+package org.hibernate.cache.spi.support;
+
+/**
+ * @author Steve Ebersole
+ */
+public enum RegionAccessType {
+ ENTITY,
+ NATURAL_ID,
+ COLLECTION,
+ QUERY_RESULTS,
+ TIMESTAMPS
+}
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/support/RegionNameQualifier.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/RegionNameQualifier.java
new file mode 100644
index 0000000000..efe17c0249
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/RegionNameQualifier.java
@@ -0,0 +1,36 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * License: GNU Lesser General Public License (LGPL), version 2.1 or later
+ * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
+ */
+package org.hibernate.cache.spi.support;
+
+import org.hibernate.boot.spi.SessionFactoryOptions;
+
+/**
+ * @author Steve Ebersole
+ */
+public class RegionNameQualifier {
+ /**
+ * Singleton access
+ */
+ public static final RegionNameQualifier INSTANCE = new RegionNameQualifier();
+
+ public String qualify(String regionName, SessionFactoryOptions options) {
+ final String prefix = options.getCacheRegionPrefix();
+ if ( prefix == null ) {
+ return regionName;
+ }
+ else {
+ if ( regionName.startsWith( prefix ) ) {
+ return regionName.substring( prefix.length() );
+ }
+
+ return prefix + regionName;
+ }
+ }
+
+ private RegionNameQualifier() {
+ }
+}
diff --git a/hibernate-jcache/src/main/java/org/hibernate/cache/jcache/time/Timestamper.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/SimpleTimestamper.java
similarity index 75%
rename from hibernate-jcache/src/main/java/org/hibernate/cache/jcache/time/Timestamper.java
rename to hibernate-core/src/main/java/org/hibernate/cache/spi/support/SimpleTimestamper.java
index 345f061519..4c347e1e6b 100644
--- a/hibernate-jcache/src/main/java/org/hibernate/cache/jcache/time/Timestamper.java
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/SimpleTimestamper.java
@@ -1,11 +1,12 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
- * See the lgpl.txt file in the root directory or .
+ * License: GNU Lesser General Public License (LGPL), version 2.1 or later
+ * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.cache.jcache.time;
+package org.hibernate.cache.spi.support;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
/**
@@ -17,11 +18,12 @@
* @author Hibernate team
* @author Alex Snaps
*/
-public final class Timestamper {
+public final class SimpleTimestamper {
private static final int BIN_DIGITS = 12;
- public static final short ONE_MS = 1 << BIN_DIGITS;
private static final AtomicLong VALUE = new AtomicLong();
+ public static final short ONE_MS = 1 << BIN_DIGITS;
+
public static long next() {
while ( true ) {
long base = System.currentTimeMillis() << BIN_DIGITS;
@@ -36,6 +38,10 @@ public static long next() {
}
}
- private Timestamper() {
+ public static int timeOut() {
+ return (int) TimeUnit.SECONDS.toMillis( 60 ) * ONE_MS;
+ }
+
+ private SimpleTimestamper() {
}
}
diff --git a/hibernate-core/src/main/java/org/hibernate/cache/spi/support/StorageAccess.java b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/StorageAccess.java
new file mode 100644
index 0000000000..8ec33dea71
--- /dev/null
+++ b/hibernate-core/src/main/java/org/hibernate/cache/spi/support/StorageAccess.java
@@ -0,0 +1,27 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * License: GNU Lesser General Public License (LGPL), version 2.1 or later
+ * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
+ */
+package org.hibernate.cache.spi.support;
+
+/**
+ * @author Steve Ebersole
+ */
+public interface StorageAccess {
+ default boolean contains(Object key) {
+ return getFromCache( key ) != null;
+ }
+
+ Object getFromCache(Object key);
+
+ void putIntoCache(Object key, Object value);
+
+ void removeFromCache(Object key);
+
+ void clearCache();
+
+ void release();
+
+}
diff --git a/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/lazyCache/InitFromCacheTest.java b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/lazyCache/InitFromCacheTest.java
index 8191d7338f..644b92fc21 100644
--- a/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/lazyCache/InitFromCacheTest.java
+++ b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/lazyCache/InitFromCacheTest.java
@@ -19,7 +19,6 @@
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Formula;
-import org.hibernate.cache.spi.DomainDataRegion;
import org.hibernate.cache.spi.access.EntityDataAccess;
import org.hibernate.cache.spi.entry.StandardCacheEntryImpl;
import org.hibernate.cfg.AvailableSettings;
@@ -28,7 +27,6 @@
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
-import org.hibernate.testing.cache.EntityReadWriteAccess;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Before;
import org.junit.Test;
diff --git a/hibernate-core/src/test/java/org/hibernate/test/converter/caching/BasicStructuredCachingOfConvertedValueTest.java b/hibernate-core/src/test/java/org/hibernate/test/converter/caching/BasicStructuredCachingOfConvertedValueTest.java
index 8e02391ca9..b84efe49f4 100644
--- a/hibernate-core/src/test/java/org/hibernate/test/converter/caching/BasicStructuredCachingOfConvertedValueTest.java
+++ b/hibernate-core/src/test/java/org/hibernate/test/converter/caching/BasicStructuredCachingOfConvertedValueTest.java
@@ -16,7 +16,6 @@
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.cache.CachingRegionFactory;
-import org.hibernate.testing.cache.EntityReadWriteAccess;
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
import org.junit.Test;
diff --git a/hibernate-core/src/test/java/org/hibernate/test/converter/caching/BasicUnstructuredCachingOfConvertedValueTest.java b/hibernate-core/src/test/java/org/hibernate/test/converter/caching/BasicUnstructuredCachingOfConvertedValueTest.java
index 752b4e7bf3..fc312501e2 100644
--- a/hibernate-core/src/test/java/org/hibernate/test/converter/caching/BasicUnstructuredCachingOfConvertedValueTest.java
+++ b/hibernate-core/src/test/java/org/hibernate/test/converter/caching/BasicUnstructuredCachingOfConvertedValueTest.java
@@ -17,7 +17,6 @@
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.cache.CachingRegionFactory;
-import org.hibernate.testing.cache.EntityReadWriteAccess;
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
import org.junit.Test;
diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/cache/SoftLockingSupport.java b/hibernate-jcache/src/main/java/org/hibernate/cache/jcache/ConfigSettings.java
similarity index 71%
rename from hibernate-testing/src/main/java/org/hibernate/testing/cache/SoftLockingSupport.java
rename to hibernate-jcache/src/main/java/org/hibernate/cache/jcache/ConfigSettings.java
index 90662fdfa3..01bbb1ff2d 100644
--- a/hibernate-testing/src/main/java/org/hibernate/testing/cache/SoftLockingSupport.java
+++ b/hibernate-jcache/src/main/java/org/hibernate/cache/jcache/ConfigSettings.java
@@ -4,15 +4,11 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
-package org.hibernate.testing.cache;
+package org.hibernate.cache.jcache;
/**
* @author Steve Ebersole
*/
-public class SoftLockingSupport {
- private SoftLockingSupport() {
- }
-
-
-
+public interface ConfigSettings {
+ String SIMPLE_FACTORY_NAME = "jcache";
}
diff --git a/hibernate-jcache/src/main/java/org/hibernate/cache/jcache/JCacheCollectionRegion.java b/hibernate-jcache/src/main/java/org/hibernate/cache/jcache/JCacheCollectionRegion.java
deleted file mode 100644
index 2b09b8faf2..0000000000
--- a/hibernate-jcache/src/main/java/org/hibernate/cache/jcache/JCacheCollectionRegion.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
- * See the lgpl.txt file in the root directory or .
- */
-package org.hibernate.cache.jcache;
-
-import javax.cache.Cache;
-import org.hibernate.boot.spi.SessionFactoryOptions;
-
-import org.hibernate.cache.CacheException;
-import org.hibernate.cache.jcache.access.NonStrictCollectionRegionAccessStrategy;
-import org.hibernate.cache.jcache.access.ReadOnlyCollectionRegionAccessStrategy;
-import org.hibernate.cache.jcache.access.ReadWriteCollectionRegionAccessStrategy;
-import org.hibernate.cache.spi.access.AccessType;
-
-/**
- * @author Alex Snaps
- */
-public class JCacheCollectionRegion extends JCacheTransactionalDataRegion implements CollectionRegion {
-
- public JCacheCollectionRegion(Cache