Skip to content

Commit 16ae00a

Browse files
committed
HHH-9840 Allow 2nd level cache implementations to customize the various key implementations
1 parent 9ac0a34 commit 16ae00a

File tree

87 files changed

+1186
-686
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+1186
-686
lines changed

hibernate-core/src/main/java/org/hibernate/action/internal/CollectionAction.java

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
import org.hibernate.action.spi.BeforeTransactionCompletionProcess;
1313
import org.hibernate.action.spi.Executable;
1414
import org.hibernate.cache.CacheException;
15-
import org.hibernate.cache.spi.CacheKey;
15+
import org.hibernate.cache.spi.CollectionCacheKey;
16+
import org.hibernate.cache.spi.access.CollectionRegionAccessStrategy;
1617
import org.hibernate.cache.spi.access.SoftLock;
1718
import org.hibernate.collection.spi.PersistentCollection;
1819
import org.hibernate.engine.spi.SessionImplementor;
@@ -76,12 +77,14 @@ public final void beforeExecutions() throws CacheException {
7677
// bidirectional association and it is one of the earlier entity actions which actually updates
7778
// the database (this action is responsible for second-level cache invalidation only)
7879
if ( persister.hasCache() ) {
79-
final CacheKey ck = session.generateCacheKey(
80+
final CollectionRegionAccessStrategy cache = persister.getCacheAccessStrategy();
81+
final CollectionCacheKey ck = cache.generateCacheKey(
8082
key,
81-
persister.getKeyType(),
82-
persister.getRole()
83+
persister,
84+
session.getFactory(),
85+
session.getTenantIdentifier()
8386
);
84-
final SoftLock lock = persister.getCacheAccessStrategy().lockItem( ck, null );
87+
final SoftLock lock = cache.lockItem( ck, null );
8588
// the old behavior used key as opposed to getKey()
8689
afterTransactionProcess = new CacheCleanupProcess( key, persister, lock );
8790
}
@@ -127,12 +130,14 @@ protected final SessionImplementor getSession() {
127130

128131
protected final void evict() throws CacheException {
129132
if ( persister.hasCache() ) {
130-
final CacheKey ck = session.generateCacheKey(
133+
final CollectionRegionAccessStrategy cache = persister.getCacheAccessStrategy();
134+
final CollectionCacheKey ck = cache.generateCacheKey(
131135
key,
132-
persister.getKeyType(),
133-
persister.getRole()
136+
persister,
137+
session.getFactory(),
138+
session.getTenantIdentifier()
134139
);
135-
persister.getCacheAccessStrategy().remove( ck );
140+
cache.remove( ck );
136141
}
137142
}
138143

@@ -169,12 +174,14 @@ private CacheCleanupProcess(Serializable key, CollectionPersister persister, Sof
169174

170175
@Override
171176
public void doAfterTransactionCompletion(boolean success, SessionImplementor session) {
172-
final CacheKey ck = session.generateCacheKey(
177+
final CollectionRegionAccessStrategy cache = persister.getCacheAccessStrategy();
178+
final CollectionCacheKey ck = cache.generateCacheKey(
173179
key,
174-
persister.getKeyType(),
175-
persister.getRole()
180+
persister,
181+
session.getFactory(),
182+
session.getTenantIdentifier()
176183
);
177-
persister.getCacheAccessStrategy().unlockItem( ck, lock );
184+
cache.unlockItem( ck, lock );
178185
}
179186
}
180187

@@ -191,8 +198,3 @@ protected EventSource eventSource() {
191198
}
192199
}
193200

194-
195-
196-
197-
198-

hibernate-core/src/main/java/org/hibernate/action/internal/EntityDeleteAction.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010

1111
import org.hibernate.AssertionFailure;
1212
import org.hibernate.HibernateException;
13-
import org.hibernate.cache.spi.CacheKey;
13+
import org.hibernate.cache.spi.EntityCacheKey;
14+
import org.hibernate.cache.spi.access.EntityRegionAccessStrategy;
1415
import org.hibernate.cache.spi.access.SoftLock;
1516
import org.hibernate.engine.spi.EntityEntry;
1617
import org.hibernate.engine.spi.PersistenceContext;
@@ -84,10 +85,11 @@ public void execute() throws HibernateException {
8485
version = persister.getVersion( instance );
8586
}
8687

87-
final CacheKey ck;
88+
final EntityCacheKey ck;
8889
if ( persister.hasCache() ) {
89-
ck = session.generateCacheKey( id, persister.getIdentifierType(), persister.getRootEntityName() );
90-
lock = persister.getCacheAccessStrategy().lockItem( ck, version );
90+
final EntityRegionAccessStrategy cache = persister.getCacheAccessStrategy();
91+
ck = cache.generateCacheKey( id, persister, session.getFactory(), session.getTenantIdentifier() );
92+
lock = cache.lockItem( ck, version );
9193
}
9294
else {
9395
ck = null;
@@ -184,13 +186,16 @@ private void postCommitDelete(boolean success) {
184186

185187
@Override
186188
public void doAfterTransactionCompletion(boolean success, SessionImplementor session) throws HibernateException {
187-
if ( getPersister().hasCache() ) {
188-
final CacheKey ck = getSession().generateCacheKey(
189+
EntityPersister entityPersister = getPersister();
190+
if ( entityPersister.hasCache() ) {
191+
EntityRegionAccessStrategy cache = entityPersister.getCacheAccessStrategy();
192+
final EntityCacheKey ck = cache.generateCacheKey(
189193
getId(),
190-
getPersister().getIdentifierType(),
191-
getPersister().getRootEntityName()
194+
entityPersister,
195+
session.getFactory(),
196+
session.getTenantIdentifier()
192197
);
193-
getPersister().getCacheAccessStrategy().unlockItem( ck, lock );
198+
cache.unlockItem( ck, lock );
194199
}
195200
postCommitDelete( success );
196201
}

hibernate-core/src/main/java/org/hibernate/action/internal/EntityInsertAction.java

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@
1010

1111
import org.hibernate.AssertionFailure;
1212
import org.hibernate.HibernateException;
13-
import org.hibernate.cache.spi.CacheKey;
13+
import org.hibernate.cache.spi.EntityCacheKey;
14+
import org.hibernate.cache.spi.access.EntityRegionAccessStrategy;
1415
import org.hibernate.cache.spi.entry.CacheEntry;
1516
import org.hibernate.engine.internal.Versioning;
1617
import org.hibernate.engine.spi.EntityEntry;
1718
import org.hibernate.engine.spi.EntityKey;
19+
import org.hibernate.engine.spi.PersistenceContext;
20+
import org.hibernate.engine.spi.SessionEventListenerManager;
1821
import org.hibernate.engine.spi.SessionFactoryImplementor;
1922
import org.hibernate.engine.spi.SessionImplementor;
2023
import org.hibernate.event.service.spi.EventListenerGroup;
@@ -85,8 +88,8 @@ public void execute() throws HibernateException {
8588
if ( !veto ) {
8689

8790
persister.insert( id, getState(), instance, session );
88-
89-
final EntityEntry entry = session.getPersistenceContext().getEntry( instance );
91+
PersistenceContext persistenceContext = session.getPersistenceContext();
92+
final EntityEntry entry = persistenceContext.getEntry( instance );
9093
if ( entry == null ) {
9194
throw new AssertionFailure( "possible non-threadsafe access to session" );
9295
}
@@ -101,10 +104,10 @@ public void execute() throws HibernateException {
101104
entry.postUpdate( instance, getState(), version );
102105
}
103106

104-
getSession().getPersistenceContext().registerInsertedKey( getPersister(), getId() );
107+
persistenceContext.registerInsertedKey( persister, getId() );
105108
}
106109

107-
final SessionFactoryImplementor factory = getSession().getFactory();
110+
final SessionFactoryImplementor factory = session.getFactory();
108111

109112
if ( isCachePutEnabled( persister, session ) ) {
110113
final CacheEntry ce = persister.buildCacheEntry(
@@ -114,12 +117,13 @@ public void execute() throws HibernateException {
114117
session
115118
);
116119
cacheEntry = persister.getCacheEntryStructure().structure( ce );
117-
final CacheKey ck = session.generateCacheKey( id, persister.getIdentifierType(), persister.getRootEntityName() );
120+
final EntityRegionAccessStrategy cache = persister.getCacheAccessStrategy();
121+
final EntityCacheKey ck = cache.generateCacheKey( id, persister, factory, session.getTenantIdentifier() );
118122

119123
final boolean put = cacheInsert( persister, ck );
120124

121125
if ( put && factory.getStatistics().isStatisticsEnabled() ) {
122-
factory.getStatisticsImplementor().secondLevelCachePut( getPersister().getCacheAccessStrategy().getRegion().getName() );
126+
factory.getStatisticsImplementor().secondLevelCachePut( cache.getRegion().getName() );
123127
}
124128
}
125129

@@ -134,7 +138,7 @@ public void execute() throws HibernateException {
134138
markExecuted();
135139
}
136140

137-
private boolean cacheInsert(EntityPersister persister, CacheKey ck) {
141+
private boolean cacheInsert(EntityPersister persister, EntityCacheKey ck) {
138142
try {
139143
getSession().getEventListenerManager().cachePutStart();
140144
return persister.getCacheAccessStrategy().insert( ck, cacheEntry, version );
@@ -207,24 +211,27 @@ private boolean preInsert() {
207211
public void doAfterTransactionCompletion(boolean success, SessionImplementor session) throws HibernateException {
208212
final EntityPersister persister = getPersister();
209213
if ( success && isCachePutEnabled( persister, getSession() ) ) {
210-
final CacheKey ck = getSession().generateCacheKey( getId(), persister.getIdentifierType(), persister.getRootEntityName() );
211-
final boolean put = cacheAfterInsert( persister, ck );
212-
213-
if ( put && getSession().getFactory().getStatistics().isStatisticsEnabled() ) {
214-
getSession().getFactory().getStatisticsImplementor()
215-
.secondLevelCachePut( getPersister().getCacheAccessStrategy().getRegion().getName() );
214+
final EntityRegionAccessStrategy cache = persister.getCacheAccessStrategy();
215+
SessionFactoryImplementor sessionFactoryImplementor = session.getFactory();
216+
final EntityCacheKey ck = cache.generateCacheKey( getId(), persister, sessionFactoryImplementor, session.getTenantIdentifier() );
217+
final boolean put = cacheAfterInsert( cache, ck );
218+
219+
if ( put && sessionFactoryImplementor.getStatistics().isStatisticsEnabled() ) {
220+
sessionFactoryImplementor.getStatisticsImplementor()
221+
.secondLevelCachePut( cache.getRegion().getName() );
216222
}
217223
}
218224
postCommitInsert( success );
219225
}
220226

221-
private boolean cacheAfterInsert(EntityPersister persister, CacheKey ck) {
227+
private boolean cacheAfterInsert(EntityRegionAccessStrategy cache, EntityCacheKey ck) {
228+
final SessionEventListenerManager eventListenerManager = getSession().getEventListenerManager();
222229
try {
223-
getSession().getEventListenerManager().cachePutStart();
224-
return persister.getCacheAccessStrategy().afterInsert( ck, cacheEntry, version );
230+
eventListenerManager.cachePutStart();
231+
return cache.afterInsert( ck, cacheEntry, version );
225232
}
226233
finally {
227-
getSession().getEventListenerManager().cachePutEnd();
234+
eventListenerManager.cachePutEnd();
228235
}
229236
}
230237

hibernate-core/src/main/java/org/hibernate/action/internal/EntityUpdateAction.java

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
import org.hibernate.AssertionFailure;
1212
import org.hibernate.HibernateException;
1313
import org.hibernate.cache.CacheException;
14-
import org.hibernate.cache.spi.CacheKey;
14+
import org.hibernate.cache.spi.EntityCacheKey;
15+
import org.hibernate.cache.spi.access.EntityRegionAccessStrategy;
1516
import org.hibernate.cache.spi.access.SoftLock;
1617
import org.hibernate.cache.spi.entry.CacheEntry;
1718
import org.hibernate.engine.internal.Versioning;
1819
import org.hibernate.engine.spi.CachedNaturalIdValueSource;
1920
import org.hibernate.engine.spi.EntityEntry;
21+
import org.hibernate.engine.spi.SessionEventListenerManager;
2022
import org.hibernate.engine.spi.SessionFactoryImplementor;
2123
import org.hibernate.engine.spi.SessionImplementor;
2224
import org.hibernate.engine.spi.Status;
@@ -116,7 +118,7 @@ public void execute() throws HibernateException {
116118

117119
final boolean veto = preUpdate();
118120

119-
final SessionFactoryImplementor factory = getSession().getFactory();
121+
final SessionFactoryImplementor factory = session.getFactory();
120122
Object previousVersion = this.previousVersion;
121123
if ( persister.isVersionPropertyGenerated() ) {
122124
// we need to grab the version value from the entity, otherwise
@@ -125,14 +127,16 @@ public void execute() throws HibernateException {
125127
previousVersion = persister.getVersion( instance );
126128
}
127129

128-
final CacheKey ck;
130+
final EntityCacheKey ck;
129131
if ( persister.hasCache() ) {
130-
ck = session.generateCacheKey(
132+
final EntityRegionAccessStrategy cache = persister.getCacheAccessStrategy();
133+
ck = cache.generateCacheKey(
131134
id,
132-
persister.getIdentifierType(),
133-
persister.getRootEntityName()
135+
persister,
136+
factory,
137+
session.getTenantIdentifier()
134138
);
135-
lock = persister.getCacheAccessStrategy().lockItem( ck, previousVersion );
139+
lock = cache.lockItem( ck, previousVersion );
136140
}
137141
else {
138142
ck = null;
@@ -152,7 +156,7 @@ public void execute() throws HibernateException {
152156
);
153157
}
154158

155-
final EntityEntry entry = getSession().getPersistenceContext().getEntry( instance );
159+
final EntityEntry entry = session.getPersistenceContext().getEntry( instance );
156160
if ( entry == null ) {
157161
throw new AssertionFailure( "possible nonthreadsafe access to session" );
158162
}
@@ -212,7 +216,7 @@ public void execute() throws HibernateException {
212216
}
213217
}
214218

215-
private boolean cacheUpdate(EntityPersister persister, Object previousVersion, CacheKey ck) {
219+
private boolean cacheUpdate(EntityPersister persister, Object previousVersion, EntityCacheKey ck) {
216220
try {
217221
getSession().getEventListenerManager().cachePutStart();
218222
return persister.getCacheAccessStrategy().update( ck, cacheEntry, nextVersion, previousVersion );
@@ -307,34 +311,37 @@ protected boolean hasPostCommitEventListeners() {
307311
public void doAfterTransactionCompletion(boolean success, SessionImplementor session) throws CacheException {
308312
final EntityPersister persister = getPersister();
309313
if ( persister.hasCache() ) {
310-
311-
final CacheKey ck = getSession().generateCacheKey(
314+
final EntityRegionAccessStrategy cache = persister.getCacheAccessStrategy();
315+
final EntityCacheKey ck = cache.generateCacheKey(
312316
getId(),
313-
persister.getIdentifierType(),
314-
persister.getRootEntityName()
317+
persister,
318+
session.getFactory(),
319+
session.getTenantIdentifier()
320+
315321
);
316-
322+
317323
if ( success && cacheEntry!=null /*!persister.isCacheInvalidationRequired()*/ ) {
318-
final boolean put = cacheAfterUpdate( persister, ck );
324+
final boolean put = cacheAfterUpdate( cache, ck );
319325

320326
if ( put && getSession().getFactory().getStatistics().isStatisticsEnabled() ) {
321-
getSession().getFactory().getStatisticsImplementor().secondLevelCachePut( getPersister().getCacheAccessStrategy().getRegion().getName() );
327+
getSession().getFactory().getStatisticsImplementor().secondLevelCachePut( cache.getRegion().getName() );
322328
}
323329
}
324330
else {
325-
persister.getCacheAccessStrategy().unlockItem( ck, lock );
331+
cache.unlockItem( ck, lock );
326332
}
327333
}
328334
postCommitUpdate( success );
329335
}
330336

331-
private boolean cacheAfterUpdate(EntityPersister persister, CacheKey ck) {
337+
private boolean cacheAfterUpdate(EntityRegionAccessStrategy cache, EntityCacheKey ck) {
338+
SessionEventListenerManager eventListenerManager = getSession().getEventListenerManager();
332339
try {
333-
getSession().getEventListenerManager().cachePutStart();
334-
return persister.getCacheAccessStrategy().afterUpdate( ck, cacheEntry, nextVersion, previousVersion, lock );
340+
eventListenerManager.cachePutStart();
341+
return cache.afterUpdate( ck, cacheEntry, nextVersion, previousVersion, lock );
335342
}
336343
finally {
337-
getSession().getEventListenerManager().cachePutEnd();
344+
eventListenerManager.cachePutEnd();
338345
}
339346
}
340347

hibernate-core/src/main/java/org/hibernate/cache/internal/CollectionCacheInvalidator.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
import java.util.Set;
1111

1212
import org.hibernate.boot.Metadata;
13-
import org.hibernate.cache.spi.CacheKey;
13+
import org.hibernate.cache.spi.CollectionCacheKey;
14+
import org.hibernate.cache.spi.access.CollectionRegionAccessStrategy;
1415
import org.hibernate.engine.spi.SessionFactoryImplementor;
1516
import org.hibernate.event.service.spi.EventListenerRegistry;
1617
import org.hibernate.event.spi.EventSource;
@@ -136,8 +137,16 @@ private void evictCache(Object entity, EntityPersister persister, EventSource se
136137
}
137138

138139
private void evict(Serializable id, CollectionPersister collectionPersister, EventSource session) {
139-
LOG.debug( "Evict CollectionRegion " + collectionPersister.getRole() + " for id " + id );
140-
CacheKey key = session.generateCacheKey( id, collectionPersister.getKeyType(), collectionPersister.getRole() );
141-
collectionPersister.getCacheAccessStrategy().evict( key );
140+
if ( LOG.isDebugEnabled() ) {
141+
LOG.debug( "Evict CollectionRegion " + collectionPersister.getRole() + " for id " + id );
142+
}
143+
CollectionRegionAccessStrategy cache = collectionPersister.getCacheAccessStrategy();
144+
CollectionCacheKey key = cache.generateCacheKey(
145+
id,
146+
collectionPersister,
147+
session.getFactory(),
148+
session.getTenantIdentifier()
149+
);
150+
cache.evict( key );
142151
}
143152
}

0 commit comments

Comments
 (0)