Search in sources :

Example 1 with VersionedItem

use of org.hibernate.jcache.test.domain.VersionedItem in project hibernate-orm by hibernate.

the class HibernateCacheTest method testStaleWritesLeaveCacheConsistent.

// @Test
// public void testEmptySecondLevelCacheEntry() throws Exception {
// sessionFactory().getCache().evictEntityRegion( Item.class.getName() );
// Statistics stats = sessionFactory().getStatistics();
// stats.clear();
// CacheRegionStatistics statistics = stats.getDomainDataRegionStatistics( Item.class.getName() );
// Map cacheEntries = statistics.getEntries();
// assertThat( cacheEntries.size(), equalTo( 0 ) );
// }
@Test
public void testStaleWritesLeaveCacheConsistent() {
    Session s = sessionFactory().openSession();
    Transaction txn = s.beginTransaction();
    VersionedItem item = new VersionedItem();
    item.setName("steve");
    item.setDescription("steve's item");
    s.save(item);
    txn.commit();
    s.close();
    Long initialVersion = item.getVersion();
    // manually revert the version property
    item.setVersion(item.getVersion() - 1);
    try {
        s = sessionFactory().openSession();
        txn = s.beginTransaction();
        s.update(item);
        txn.commit();
        s.close();
        fail("expected stale write to fail");
    } catch (Throwable expected) {
        // expected behavior here
        if (txn != null) {
            try {
                txn.rollback();
            } catch (Throwable ignore) {
            }
        }
    } finally {
        if (s != null && s.isOpen()) {
            try {
                s.close();
            } catch (Throwable ignore) {
            }
        }
    }
    // // check the version value in the cache...
    // CacheRegionStatistics slcs = sessionFactory().getStatistics()
    // .getDomainDataRegionStatistics( VersionedItem.class.getName() );
    // assertNotNull(slcs);
    // final Map entries = slcs.getEntries();
    // Object entry = entries.get( item.getId() );
    // Long cachedVersionValue;
    // if ( entry instanceof SoftLock ) {
    // //FIXME don't know what to test here
    // //cachedVersionValue = new Long( ( (ReadWriteCache.Lock) entry).getUnlockTimestamp() );
    // }
    // else {
    // cachedVersionValue = (Long) ( (Map) entry ).get( "_version" );
    // assertThat( initialVersion, equalTo( cachedVersionValue ) );
    // }
    final DomainDataRegionTemplate region = (DomainDataRegionTemplate) sessionFactory().getMetamodel().entityPersister(Item.class).getCacheAccessStrategy().getRegion();
    final Object fromCache = region.getCacheStorageAccess().getFromCache(region.getEffectiveKeysFactory().createEntityKey(item.getId(), sessionFactory().getMetamodel().entityPersister(Item.class), sessionFactory(), null), (SharedSessionContractImplementor) s);
    assertTrue(fromCache == null || fromCache instanceof SoftLock);
    // cleanup
    s = sessionFactory().openSession();
    txn = s.beginTransaction();
    item = s.load(VersionedItem.class, item.getId());
    s.delete(item);
    txn.commit();
    s.close();
}
Also used : VersionedItem(org.hibernate.jcache.test.domain.VersionedItem) Item(org.hibernate.jcache.test.domain.Item) Transaction(org.hibernate.Transaction) VersionedItem(org.hibernate.jcache.test.domain.VersionedItem) DomainDataRegionTemplate(org.hibernate.cache.spi.support.DomainDataRegionTemplate) Session(org.hibernate.Session) SoftLock(org.hibernate.cache.spi.access.SoftLock) Test(org.junit.Test) BaseFunctionalTest(org.hibernate.jcache.test.BaseFunctionalTest)

Aggregations

Session (org.hibernate.Session)1 Transaction (org.hibernate.Transaction)1 SoftLock (org.hibernate.cache.spi.access.SoftLock)1 DomainDataRegionTemplate (org.hibernate.cache.spi.support.DomainDataRegionTemplate)1 BaseFunctionalTest (org.hibernate.jcache.test.BaseFunctionalTest)1 Item (org.hibernate.jcache.test.domain.Item)1 VersionedItem (org.hibernate.jcache.test.domain.VersionedItem)1 Test (org.junit.Test)1