Search in sources :

Example 1 with OtherItem

use of org.infinispan.test.hibernate.cache.commons.functional.entities.OtherItem in project infinispan by infinispan.

the class VersionedTest method testCollectionUpdate.

@Test
public void testCollectionUpdate() throws Exception {
    // the first insert puts VersionedEntry(null, null, timestamp), so we have to wait a while to cache the entry
    TIME_SERVICE.advance(1);
    withTxSession(s -> {
        Item item = s.load(Item.class, itemId);
        OtherItem otherItem = new OtherItem();
        otherItem.setName("Other 1");
        s.persist(otherItem);
        item.addOtherItem(otherItem);
    });
    withTxSession(s -> {
        Item item = s.load(Item.class, itemId);
        Set<OtherItem> otherItems = item.getOtherItems();
        assertFalse(otherItems.isEmpty());
        otherItems.remove(otherItems.iterator().next());
    });
    AdvancedCache collectionCache = TEST_SESSION_ACCESS.getRegion(sessionFactory(), Item.class.getName() + ".otherItems").getCache();
    CountDownLatch putFromLoadLatch = new CountDownLatch(1);
    AtomicBoolean committing = new AtomicBoolean(false);
    CollectionUpdateTestInterceptor collectionUpdateTestInterceptor = new CollectionUpdateTestInterceptor(putFromLoadLatch);
    AnotherCollectionUpdateTestInterceptor anotherInterceptor = new AnotherCollectionUpdateTestInterceptor(putFromLoadLatch, committing);
    AsyncInterceptorChain interceptorChain = collectionCache.getAsyncInterceptorChain();
    interceptorChain.addInterceptorBefore(collectionUpdateTestInterceptor, CallInterceptor.class);
    interceptorChain.addInterceptor(anotherInterceptor, 0);
    TIME_SERVICE.advance(1);
    Future<Boolean> addFuture = executor.submit(() -> withTxSessionApply(s -> {
        awaitOrThrow(collectionUpdateTestInterceptor.updateLatch);
        Item item = s.load(Item.class, itemId);
        OtherItem otherItem = new OtherItem();
        otherItem.setName("Other 2");
        s.persist(otherItem);
        item.addOtherItem(otherItem);
        committing.set(true);
        return true;
    }));
    Future<Boolean> readFuture = executor.submit(() -> withTxSessionApply(s -> {
        Item item = s.load(Item.class, itemId);
        assertTrue(item.getOtherItems().isEmpty());
        return true;
    }));
    addFuture.get();
    readFuture.get();
    interceptorChain.removeInterceptor(CollectionUpdateTestInterceptor.class);
    interceptorChain.removeInterceptor(AnotherCollectionUpdateTestInterceptor.class);
    withTxSession(s -> assertFalse(s.load(Item.class, itemId).getOtherItems().isEmpty()));
}
Also used : Arrays(java.util.Arrays) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Session(org.hibernate.Session) Caches(org.infinispan.hibernate.cache.commons.util.Caches) AtomicReference(java.util.concurrent.atomic.AtomicReference) FlagBitSets(org.infinispan.context.impl.FlagBitSets) Future(java.util.concurrent.Future) PessimisticLockException(org.hibernate.PessimisticLockException) InvocationContext(org.infinispan.context.InvocationContext) VersionedEntry(org.infinispan.hibernate.cache.commons.util.VersionedEntry) AdvancedCache(org.infinispan.AdvancedCache) CallInterceptor(org.infinispan.interceptors.impl.CallInterceptor) Map(java.util.Map) BiConsumer(java.util.function.BiConsumer) OtherItem(org.infinispan.test.hibernate.cache.commons.functional.entities.OtherItem) DDAsyncInterceptor(org.infinispan.interceptors.DDAsyncInterceptor) Synchronization(javax.transaction.Synchronization) StaleStateException(org.hibernate.StaleStateException) CyclicBarrier(java.util.concurrent.CyclicBarrier) Item(org.infinispan.test.hibernate.cache.commons.functional.entities.Item) SessionAccess(org.infinispan.hibernate.cache.commons.access.SessionAccess) ByRef(org.infinispan.commons.util.ByRef) Assert.assertTrue(org.junit.Assert.assertTrue) Set(java.util.Set) Test(org.junit.Test) Assert.assertNotEquals(org.junit.Assert.assertNotEquals) TimeUnit(java.util.concurrent.TimeUnit) CountDownLatch(java.util.concurrent.CountDownLatch) List(java.util.List) Assert.assertNull(org.junit.Assert.assertNull) ReadWriteKeyCommand(org.infinispan.commands.functional.ReadWriteKeyCommand) Assert.assertFalse(org.junit.Assert.assertFalse) AsyncInterceptorChain(org.infinispan.interceptors.AsyncInterceptorChain) Assert.assertEquals(org.junit.Assert.assertEquals) OtherItem(org.infinispan.test.hibernate.cache.commons.functional.entities.OtherItem) Item(org.infinispan.test.hibernate.cache.commons.functional.entities.Item) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) OtherItem(org.infinispan.test.hibernate.cache.commons.functional.entities.OtherItem) AsyncInterceptorChain(org.infinispan.interceptors.AsyncInterceptorChain) AdvancedCache(org.infinispan.AdvancedCache) CountDownLatch(java.util.concurrent.CountDownLatch) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Test(org.junit.Test)

Example 2 with OtherItem

use of org.infinispan.test.hibernate.cache.commons.functional.entities.OtherItem in project infinispan by infinispan.

the class ReadWriteTest method testAddNewManyToManyPropertyRefNoInitFlushInitLeaveCacheConsistent.

@Test
public void testAddNewManyToManyPropertyRefNoInitFlushInitLeaveCacheConsistent() throws Exception {
    Statistics stats = sessionFactory().getStatistics();
    stats.clear();
    SecondLevelCacheStatistics cStats = stats.getSecondLevelCacheStatistics(Item.class.getName() + ".items");
    ByRef<Long> otherItemId = new ByRef<>(null);
    withTxSession(s -> {
        OtherItem otherItem = new OtherItem();
        otherItem.setName("steve");
        s.save(otherItem);
        otherItemId.set(otherItem.getId());
    });
    // create an element for otherItem.bagOfItems
    Item item = new Item();
    item.setName("element");
    item.setDescription("element Item");
    withTxSession(s -> {
        OtherItem otherItem = s.get(OtherItem.class, otherItemId.get());
        assertFalse(Hibernate.isInitialized(otherItem.getBagOfItems()));
        // Add an element to otherItem.bagOfItems (a bag); it will not initialize the bag.
        otherItem.addItemToBag(item);
        assertFalse(Hibernate.isInitialized(otherItem.getBagOfItems()));
        s.persist(item);
        s.flush();
        // Now initialize the collection; it will contain the uncommitted itemElement.
        // The many-to-many uses a property-ref
        Hibernate.initialize(otherItem.getBagOfItems());
        markRollbackOnly(s);
    });
    withTxSession(s -> {
        OtherItem otherItem = s.get(OtherItem.class, otherItemId.get());
        // Because of HHH-9231, the following will fail due to ObjectNotFoundException because the
        // collection will be read from the cache and it still contains the uncommitted element,
        // which cannot be found.
        Hibernate.initialize(otherItem.getBagOfItems());
        assertTrue(otherItem.getBagOfItems().isEmpty());
        s.delete(otherItem);
    });
}
Also used : OtherItem(org.infinispan.test.hibernate.cache.commons.functional.entities.OtherItem) Item(org.infinispan.test.hibernate.cache.commons.functional.entities.Item) VersionedItem(org.infinispan.test.hibernate.cache.commons.functional.entities.VersionedItem) OtherItem(org.infinispan.test.hibernate.cache.commons.functional.entities.OtherItem) ByRef(org.infinispan.commons.util.ByRef) SecondLevelCacheStatistics(org.hibernate.stat.SecondLevelCacheStatistics) Statistics(org.hibernate.stat.Statistics) SecondLevelCacheStatistics(org.hibernate.stat.SecondLevelCacheStatistics) Test(org.junit.Test)

Aggregations

ByRef (org.infinispan.commons.util.ByRef)2 Item (org.infinispan.test.hibernate.cache.commons.functional.entities.Item)2 OtherItem (org.infinispan.test.hibernate.cache.commons.functional.entities.OtherItem)2 Test (org.junit.Test)2 Arrays (java.util.Arrays)1 List (java.util.List)1 Map (java.util.Map)1 Set (java.util.Set)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 CyclicBarrier (java.util.concurrent.CyclicBarrier)1 Future (java.util.concurrent.Future)1 TimeUnit (java.util.concurrent.TimeUnit)1 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1 AtomicReference (java.util.concurrent.atomic.AtomicReference)1 BiConsumer (java.util.function.BiConsumer)1 Synchronization (javax.transaction.Synchronization)1 PessimisticLockException (org.hibernate.PessimisticLockException)1 Session (org.hibernate.Session)1 StaleStateException (org.hibernate.StaleStateException)1 SecondLevelCacheStatistics (org.hibernate.stat.SecondLevelCacheStatistics)1