http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/5d694881/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java
----------------------------------------------------------------------
diff --git 
a/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java
 
b/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java
new file mode 100644
index 0000000..cdb91d5
--- /dev/null
+++ 
b/modules/hibernate/src/main/java/org/apache/ignite/cache/hibernate/HibernateTransactionalDataRegion.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.cache.hibernate;
+
+import org.apache.ignite.*;
+import org.apache.ignite.cache.*;
+import org.hibernate.cache.*;
+import org.hibernate.cache.spi.*;
+import org.hibernate.cache.spi.access.*;
+
+import static org.apache.ignite.cache.CacheAtomicityMode.*;
+
+/**
+ * Implementation of {@link TransactionalDataRegion} (transactional means that
+ * data in the region is updated in connection with database transaction).
+ * This interface defines base contract for {@link EntityRegion}, {@link 
CollectionRegion}
+ * and {@link NaturalIdRegion}.
+ */
+public class HibernateTransactionalDataRegion extends HibernateRegion 
implements TransactionalDataRegion {
+    /** */
+    private final CacheDataDescription dataDesc;
+
+    /**
+     * @param factory Region factory.
+     * @param name Region name.
+     * @param ignite Grid.
+     * @param cache Region cache.
+     * @param dataDesc Region data description.
+     */
+    public HibernateTransactionalDataRegion(HibernateRegionFactory factory, 
String name,
+        Ignite ignite, GridCache<Object, Object> cache, CacheDataDescription 
dataDesc) {
+        super(factory, name, ignite, cache);
+
+        this.dataDesc = dataDesc;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isTransactionAware() {
+        return false; // This method is not used by Hibernate.
+    }
+
+    /** {@inheritDoc} */
+    @Override public CacheDataDescription getCacheDataDescription() {
+        return dataDesc;
+    }
+
+    /**
+     * @param accessType Hibernate L2 cache access type.
+     * @return Access strategy for given access type.
+     */
+    protected HibernateAccessStrategyAdapter createAccessStrategy(AccessType 
accessType) {
+        switch (accessType) {
+            case READ_ONLY:
+                return new HibernateReadOnlyAccessStrategy(ignite, cache);
+
+            case NONSTRICT_READ_WRITE:
+                return new HibernateNonStrictAccessStrategy(ignite, cache, 
factory.threadLocalForCache(cache.name()));
+
+            case READ_WRITE:
+                if (cache.configuration().getAtomicityMode() != TRANSACTIONAL)
+                    throw new CacheException("Hibernate READ-WRITE access 
strategy must have Ignite cache with " +
+                        "'TRANSACTIONAL' atomicity mode: " + cache.name());
+
+                return new HibernateReadWriteAccessStrategy(ignite, cache, 
factory.threadLocalForCache(cache.name()));
+
+            case TRANSACTIONAL:
+                if (cache.configuration().getAtomicityMode() != TRANSACTIONAL)
+                    throw new CacheException("Hibernate TRANSACTIONAL access 
strategy must have Ignite cache with " +
+                        "'TRANSACTIONAL' atomicity mode: " + cache.name());
+
+                if 
(cache.configuration().getTransactionManagerLookupClassName() == null)
+                    throw new CacheException("Hibernate TRANSACTIONAL access 
strategy must have Ignite cache with " +
+                        "TransactionManagerLookup configured: " + 
cache.name());
+
+                return new HibernateTransactionalAccessStrategy(ignite, cache);
+
+            default:
+                throw new IllegalArgumentException("Unknown Hibernate access 
type: " + accessType);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/5d694881/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheConfigurationSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheConfigurationSelfTest.java
 
b/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheConfigurationSelfTest.java
deleted file mode 100644
index b012f4e..0000000
--- 
a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheConfigurationSelfTest.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.cache.hibernate;
-
-import org.apache.ignite.*;
-import org.apache.ignite.cache.*;
-import org.apache.ignite.configuration.*;
-import org.apache.ignite.internal.*;
-import org.apache.ignite.spi.discovery.tcp.*;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
-import org.apache.ignite.testframework.junits.common.*;
-import org.hibernate.*;
-import org.hibernate.annotations.*;
-import org.hibernate.cache.spi.access.AccessType;
-import org.hibernate.cfg.*;
-import org.hibernate.service.*;
-
-import javax.cache.Cache;
-import javax.persistence.*;
-import java.util.*;
-
-import static org.apache.ignite.cache.CacheAtomicityMode.*;
-import static org.apache.ignite.cache.CacheMode.*;
-import static org.apache.ignite.cache.hibernate.GridHibernateRegionFactory.*;
-import static org.hibernate.cfg.AvailableSettings.*;
-
-/**
- * Tests Hibernate L2 cache configuration.
- */
-public class GridHibernateL2CacheConfigurationSelfTest extends 
GridCommonAbstractTest {
-    /** */
-    public static final String ENTITY1_NAME = Entity1.class.getName();
-
-    /** */
-    public static final String ENTITY2_NAME = Entity2.class.getName();
-
-    /** */
-    public static final String ENTITY3_NAME = Entity3.class.getName();
-
-    /** */
-    public static final String ENTITY4_NAME = Entity4.class.getName();
-
-    /** */
-    public static final String TIMESTAMP_CACHE = 
"org.hibernate.cache.spi.UpdateTimestampsCache";
-
-    /** */
-    public static final String QUERY_CACHE = 
"org.hibernate.cache.internal.StandardQueryCache";
-
-    /** */
-    public static final String CONNECTION_URL = 
"jdbc:h2:mem:example;DB_CLOSE_DELAY=-1";
-
-    /** If {@code true} then sets default cache in configuration. */
-    private boolean dfltCache;
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTestsStarted() throws Exception {
-        startGrid(0);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void afterTestsStopped() throws Exception {
-        stopAllGrids();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void afterTest() throws Exception {
-        for (GridCache<?, ?> cache : ((IgniteKernal)grid(0)).caches())
-            cache.clear();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected IgniteConfiguration getConfiguration(String gridName) 
throws Exception {
-        IgniteConfiguration cfg = super.getConfiguration(gridName);
-
-        TcpDiscoverySpi discoSpi = new TcpDiscoverySpi();
-
-        discoSpi.setIpFinder(new TcpDiscoveryVmIpFinder(true));
-
-        cfg.setDiscoverySpi(discoSpi);
-
-        cfg.setCacheConfiguration(cacheConfiguration(ENTITY3_NAME), 
cacheConfiguration(ENTITY4_NAME),
-            cacheConfiguration("cache1"), cacheConfiguration("cache2"), 
cacheConfiguration("cache3"),
-            cacheConfiguration(TIMESTAMP_CACHE), 
cacheConfiguration(QUERY_CACHE));
-
-        return cfg;
-    }
-
-    /**
-     * @param cacheName Cache name.
-     * @return Cache configuration.
-     */
-    private CacheConfiguration cacheConfiguration(String cacheName) {
-        CacheConfiguration cfg = new CacheConfiguration();
-
-        cfg.setName(cacheName);
-
-        cfg.setCacheMode(PARTITIONED);
-
-        cfg.setAtomicityMode(ATOMIC);
-
-        return cfg;
-    }
-    /**
-     * @param gridName Grid name.
-     * @return Hibernate configuration.
-     */
-    protected Configuration hibernateConfiguration(String gridName) {
-        Configuration cfg = new Configuration();
-
-        cfg.addAnnotatedClass(Entity1.class);
-        cfg.addAnnotatedClass(Entity2.class);
-        cfg.addAnnotatedClass(Entity3.class);
-        cfg.addAnnotatedClass(Entity4.class);
-
-        cfg.setProperty(DFLT_ACCESS_TYPE_PROPERTY, 
AccessType.NONSTRICT_READ_WRITE.name());
-
-        cfg.setProperty(HBM2DDL_AUTO, "create");
-
-        cfg.setProperty(GENERATE_STATISTICS, "true");
-
-        cfg.setProperty(USE_SECOND_LEVEL_CACHE, "true");
-
-        cfg.setProperty(USE_QUERY_CACHE, "true");
-
-        cfg.setProperty(CACHE_REGION_FACTORY, 
GridHibernateRegionFactory.class.getName());
-
-        cfg.setProperty(RELEASE_CONNECTIONS, "on_close");
-
-        cfg.setProperty(GRID_NAME_PROPERTY, gridName);
-
-        cfg.setProperty(REGION_CACHE_PROPERTY + ENTITY1_NAME, "cache1");
-        cfg.setProperty(REGION_CACHE_PROPERTY + ENTITY2_NAME, "cache2");
-        cfg.setProperty(REGION_CACHE_PROPERTY + TIMESTAMP_CACHE, 
TIMESTAMP_CACHE);
-        cfg.setProperty(REGION_CACHE_PROPERTY + QUERY_CACHE, QUERY_CACHE);
-
-        if (dfltCache)
-            cfg.setProperty(DFLT_CACHE_NAME_PROPERTY, "cache3");
-
-        return cfg;
-    }
-
-    /**
-     * Tests property {@link GridHibernateRegionFactory#REGION_CACHE_PROPERTY}.
-     */
-    public void testPerRegionCacheProperty() {
-        testCacheUsage(1, 1, 0, 1, 1);
-    }
-
-    /**
-     * Tests property {@link 
GridHibernateRegionFactory#DFLT_CACHE_NAME_PROPERTY}.
-     */
-    public void testDefaultCache() {
-        dfltCache = true;
-
-        testCacheUsage(1, 1, 2, 0, 0);
-    }
-
-    /**
-     * @param expCache1 Expected size of cache with name 'cache1'.
-     * @param expCache2 Expected size of cache with name 'cache2'.
-     * @param expCache3 Expected size of cache with name 'cache3'.
-     * @param expCacheE3 Expected size of cache with name {@link 
#ENTITY3_NAME}.
-     * @param expCacheE4 Expected size of cache with name {@link 
#ENTITY4_NAME}.
-     */
-    @SuppressWarnings("unchecked")
-    private void testCacheUsage(int expCache1, int expCache2, int expCache3, 
int expCacheE3, int expCacheE4) {
-        SessionFactory sesFactory = startHibernate(getTestGridName(0));
-
-        try {
-            Session ses = sesFactory.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                ses.save(new Entity1());
-                ses.save(new Entity2());
-                ses.save(new Entity3());
-                ses.save(new Entity4());
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            ses = sesFactory.openSession();
-
-            try {
-                List<Entity1> list1 = ses.createCriteria(ENTITY1_NAME).list();
-
-                assertEquals(1, list1.size());
-
-                for (Entity1 e : list1) {
-                    ses.load(ENTITY1_NAME, e.getId());
-                    assertNotNull(e.getId());
-                }
-
-                List<Entity2> list2 = ses.createCriteria(ENTITY2_NAME).list();
-
-                assertEquals(1, list2.size());
-
-                for (Entity2 e : list2)
-                    assertNotNull(e.getId());
-
-                List<Entity3> list3 = ses.createCriteria(ENTITY3_NAME).list();
-
-                assertEquals(1, list3.size());
-
-                for (Entity3 e : list3)
-                    assertNotNull(e.getId());
-
-                List<Entity4> list4 = ses.createCriteria(ENTITY4_NAME).list();
-
-                assertEquals(1, list4.size());
-
-                for (Entity4 e : list4)
-                    assertNotNull(e.getId());
-            }
-            finally {
-                ses.close();
-            }
-
-            IgniteCache<Object, Object> cache1 = grid(0).jcache("cache1");
-            IgniteCache<Object, Object> cache2 = grid(0).jcache("cache2");
-            IgniteCache<Object, Object> cache3 = grid(0).jcache("cache3");
-            IgniteCache<Object, Object> cacheE3 = grid(0).jcache(ENTITY3_NAME);
-            IgniteCache<Object, Object> cacheE4 = grid(0).jcache(ENTITY4_NAME);
-
-            assertEquals("Unexpected entries: " + toSet(cache1.iterator()), 
expCache1, cache1.size());
-            assertEquals("Unexpected entries: " + toSet(cache2.iterator()), 
expCache2, cache2.size());
-            assertEquals("Unexpected entries: " + toSet(cache3.iterator()), 
expCache3, cache3.size());
-            assertEquals("Unexpected entries: " + toSet(cacheE3.iterator()), 
expCacheE3, cacheE3.size());
-            assertEquals("Unexpected entries: " + toSet(cacheE4.iterator()), 
expCacheE4, cacheE4.size());
-        }
-        finally {
-            sesFactory.close();
-        }
-    }
-
-    /**
-     *
-     */
-    private <K, V> Set<Cache.Entry<K, V>> toSet(Iterator<Cache.Entry<K, V>> 
iter){
-        Set<Cache.Entry<K, V>> set = new HashSet<>();
-
-        while (iter.hasNext())
-            set.add(iter.next());
-
-        return set;
-    }
-
-    /**
-     * @param gridName Name of the grid providing caches.
-     * @return Session factory.
-     */
-    private SessionFactory startHibernate(String gridName) {
-        Configuration cfg = hibernateConfiguration(gridName);
-
-        ServiceRegistryBuilder builder = new ServiceRegistryBuilder();
-
-        builder.applySetting("hibernate.connection.url", CONNECTION_URL);
-        builder.applySetting("hibernate.show_sql", false);
-
-        return cfg.buildSessionFactory(builder.buildServiceRegistry());
-    }
-
-    /**
-     * Test Hibernate entity1.
-     */
-    @javax.persistence.Entity
-    @SuppressWarnings({"PublicInnerClass", "UnnecessaryFullyQualifiedName"})
-    @Cacheable
-    @org.hibernate.annotations.Cache(usage = 
CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-    public static class Entity1 {
-        /** */
-        private int id;
-
-        /**
-         * @return ID.
-         */
-        @Id
-        @GeneratedValue
-        public int getId() {
-            return id;
-        }
-
-        /**
-         * @param id ID.
-         */
-        public void setId(int id) {
-            this.id = id;
-        }
-    }
-
-    /**
-     * Test Hibernate entity2.
-     */
-    @javax.persistence.Entity
-    @SuppressWarnings({"PublicInnerClass", "UnnecessaryFullyQualifiedName"})
-    @Cacheable
-    @org.hibernate.annotations.Cache(usage = 
CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-    public static class Entity2 {
-        /** */
-        private int id;
-
-        /**
-         * @return ID.
-         */
-        @Id
-        @GeneratedValue
-        public int getId() {
-            return id;
-        }
-
-        /**
-         * @param id ID.
-         */
-        public void setId(int id) {
-            this.id = id;
-        }
-    }
-
-    /**
-     * Test Hibernate entity3.
-     */
-    @javax.persistence.Entity
-    @SuppressWarnings({"PublicInnerClass", "UnnecessaryFullyQualifiedName"})
-    @Cacheable
-    @org.hibernate.annotations.Cache(usage = 
CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-    public static class Entity3 {
-        /** */
-        private int id;
-
-        /**
-         * @return ID.
-         */
-        @Id
-        @GeneratedValue
-        public int getId() {
-            return id;
-        }
-
-        /**
-         * @param id ID.
-         */
-        public void setId(int id) {
-            this.id = id;
-        }
-    }
-
-    /**
-     * Test Hibernate entity4.
-     */
-    @javax.persistence.Entity
-    @SuppressWarnings({"PublicInnerClass", "UnnecessaryFullyQualifiedName"})
-    @Cacheable
-    @org.hibernate.annotations.Cache(usage = 
CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-    public static class Entity4 {
-        /** */
-        private int id;
-
-        /**
-         * @return ID.
-         */
-        @Id
-        @GeneratedValue
-        public int getId() {
-            return id;
-        }
-
-        /**
-         * @param id ID.
-         */
-        public void setId(int id) {
-            this.id = id;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/5d694881/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheSelfTest.java
 
b/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheSelfTest.java
deleted file mode 100644
index ba18529..0000000
--- 
a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheSelfTest.java
+++ /dev/null
@@ -1,1923 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.cache.hibernate;
-
-import org.apache.ignite.cache.*;
-import org.apache.ignite.cache.affinity.consistenthash.*;
-import org.apache.ignite.configuration.*;
-import org.apache.ignite.internal.*;
-import org.apache.ignite.spi.discovery.tcp.*;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.*;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
-import org.apache.ignite.testframework.*;
-import org.apache.ignite.testframework.junits.common.*;
-import org.hibernate.*;
-import org.hibernate.Query;
-import org.hibernate.annotations.*;
-import org.hibernate.cache.spi.*;
-import org.hibernate.cache.spi.access.AccessType;
-import org.hibernate.cfg.*;
-import org.hibernate.exception.*;
-import org.hibernate.service.*;
-import org.hibernate.stat.*;
-
-import javax.persistence.*;
-import java.util.*;
-import java.util.concurrent.*;
-
-import static org.apache.ignite.cache.CacheAtomicityMode.*;
-import static org.apache.ignite.cache.CacheMode.*;
-import static org.apache.ignite.cache.CacheWriteSynchronizationMode.*;
-import static org.apache.ignite.cache.hibernate.GridHibernateRegionFactory.*;
-import static org.hibernate.cfg.Environment.*;
-
-/**
- *
- * Tests Hibernate L2 cache.
- */
-public class GridHibernateL2CacheSelfTest extends GridCommonAbstractTest {
-    /** */
-    private static final TcpDiscoveryIpFinder IP_FINDER = new 
TcpDiscoveryVmIpFinder(true);
-
-    /** */
-    public static final String CONNECTION_URL = 
"jdbc:h2:mem:example;DB_CLOSE_DELAY=-1";
-
-    /** */
-    public static final String ENTITY_NAME = Entity.class.getName();
-
-    /** */
-    public static final String ENTITY2_NAME = Entity2.class.getName();
-
-    /** */
-    public static final String VERSIONED_ENTITY_NAME = 
VersionedEntity.class.getName();
-
-    /** */
-    public static final String PARENT_ENTITY_NAME = 
ParentEntity.class.getName();
-
-    /** */
-    public static final String CHILD_COLLECTION_REGION = ENTITY_NAME + 
".children";
-
-    /** */
-    public static final String NATURAL_ID_REGION =
-        
"org.apache.ignite.cache.hibernate.GridHibernateL2CacheSelfTest$Entity##NaturalId";
-
-    /** */
-    public static final String NATURAL_ID_REGION2 =
-        
"org.apache.ignite.cache.hibernate.GridHibernateL2CacheSelfTest$Entity2##NaturalId";
-
-    /** */
-    private SessionFactory sesFactory1;
-
-    /** */
-    private SessionFactory sesFactory2;
-
-    /**
-     * First Hibernate test entity.
-     */
-    @javax.persistence.Entity
-    @NaturalIdCache
-    @SuppressWarnings({"PublicInnerClass", "UnnecessaryFullyQualifiedName"})
-    public static class Entity {
-        /** */
-        private int id;
-
-        /** */
-        private String name;
-
-        /** */
-        private Collection<ChildEntity> children;
-
-        /**
-         * Default constructor required by Hibernate.
-         */
-        public Entity() {
-            // No-op.
-        }
-
-        /**
-         * @param id ID.
-         * @param name Name.
-         */
-        public Entity(int id, String name) {
-            this.id = id;
-            this.name = name;
-        }
-
-        /**
-         * @return ID.
-         */
-        @Id
-        public int getId() {
-            return id;
-        }
-
-        /**
-         * @param id ID.
-         */
-        public void setId(int id) {
-            this.id = id;
-        }
-
-        /**
-         * @return Name.
-         */
-        @NaturalId(mutable = true)
-        public String getName() {
-            return name;
-        }
-
-        /**
-         * @param name Name.
-         */
-        public void setName(String name) {
-            this.name = name;
-        }
-
-        /**
-         * @return Children.
-         */
-        @OneToMany(cascade=javax.persistence.CascadeType.ALL, 
fetch=FetchType.LAZY)
-        @JoinColumn(name="ENTITY_ID")
-        public Collection<ChildEntity> getChildren() {
-            return children;
-        }
-
-        /**
-         * @param children Children.
-         */
-        public void setChildren(Collection<ChildEntity> children) {
-            this.children = children;
-        }
-    }
-
-    /**
-     * Second Hibernate test entity.
-     */
-    @javax.persistence.Entity
-    @NaturalIdCache
-    @SuppressWarnings({"PublicInnerClass", "UnnecessaryFullyQualifiedName"})
-    public static class Entity2 {
-        /** */
-        private int id;
-
-        /** */
-        private String name;
-
-        /** */
-        private Collection<ChildEntity> children;
-
-        /**
-         * Default constructor required by Hibernate.
-         */
-        public Entity2() {
-            // No-op.
-        }
-
-        /**
-         * @param id ID.
-         * @param name Name.
-         */
-        public Entity2(int id, String name) {
-            this.id = id;
-            this.name = name;
-        }
-
-        /**
-         * @return ID.
-         */
-        @Id
-        public int getId() {
-            return id;
-        }
-
-        /**
-         * @param id ID.
-         */
-        public void setId(int id) {
-            this.id = id;
-        }
-
-        /**
-         * @return Name.
-         */
-        @NaturalId(mutable = true)
-        public String getName() {
-            return name;
-        }
-
-        /**
-         * @param name Name.
-         */
-        public void setName(String name) {
-            this.name = name;
-        }
-    }
-
-    /**
-     * Hibernate child entity referenced by {@link Entity}.
-     */
-    @javax.persistence.Entity
-    @SuppressWarnings("PublicInnerClass")
-    public static class ChildEntity {
-        /** */
-        private int id;
-
-        /**
-         * Default constructor required by Hibernate.
-         */
-        public ChildEntity() {
-            // No-op.
-        }
-
-        /**
-         * @param id ID.
-         */
-        public ChildEntity(int id) {
-            this.id = id;
-        }
-
-        /**
-         * @return ID.
-         */
-        @Id
-        @GeneratedValue
-        public int getId() {
-            return id;
-        }
-
-        /**
-         * @param id ID.
-         */
-        public void setId(int id) {
-            this.id = id;
-        }
-    }
-
-    /**
-     * Hibernate entity referencing {@link Entity}.
-     */
-    @javax.persistence.Entity
-    @SuppressWarnings("PublicInnerClass")
-    public static class ParentEntity {
-        /** */
-        private int id;
-
-        /** */
-        private Entity entity;
-
-        /**
-         * Default constructor required by Hibernate.
-         */
-        public ParentEntity() {
-            // No-op.
-        }
-
-        /**
-         * @param id ID.
-         * @param entity Referenced entity.
-         */
-        public ParentEntity(int id, Entity entity) {
-            this.id = id;
-            this.entity = entity;
-        }
-
-        /**
-         * @return ID.
-         */
-        @Id
-        public int getId() {
-            return id;
-        }
-
-        /**
-         * @param id ID.
-         */
-        public void setId(int id) {
-            this.id = id;
-        }
-
-        /**
-         * @return Referenced entity.
-         */
-        @OneToOne
-        public Entity getEntity() {
-            return entity;
-        }
-
-        /**
-         * @param entity Referenced entity.
-         */
-        public void setEntity(Entity entity) {
-            this.entity = entity;
-        }
-    }
-
-    /**
-     * Hibernate entity.
-     */
-    @javax.persistence.Entity
-    @SuppressWarnings({"PublicInnerClass", "UnnecessaryFullyQualifiedName"})
-    public static class VersionedEntity {
-        /** */
-        private int id;
-
-        /** */
-        private long ver;
-
-        /**
-         * Default constructor required by Hibernate.
-         */
-        public VersionedEntity() {
-        }
-
-        /**
-         * @param id ID.
-         */
-        public VersionedEntity(int id) {
-            this.id = id;
-        }
-
-        /**
-         * @return ID.
-         */
-        @Id
-        public int getId() {
-            return id;
-        }
-
-        /**
-         * @param id ID.
-         */
-        public void setId(int id) {
-            this.id = id;
-        }
-
-        /**
-         * @return Version.
-         */
-        @javax.persistence.Version
-        public long getVersion() {
-            return ver;
-        }
-
-        /**
-         * @param ver Version.
-         */
-        public void setVersion(long ver) {
-            this.ver = ver;
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override protected IgniteConfiguration getConfiguration(String gridName) 
throws Exception {
-        IgniteConfiguration cfg = super.getConfiguration(gridName);
-
-        TcpDiscoverySpi discoSpi = new TcpDiscoverySpi();
-
-        discoSpi.setIpFinder(IP_FINDER);
-
-        cfg.setDiscoverySpi(discoSpi);
-
-        
cfg.setCacheConfiguration(generalRegionConfiguration("org.hibernate.cache.spi.UpdateTimestampsCache"),
-            
generalRegionConfiguration("org.hibernate.cache.internal.StandardQueryCache"),
-            transactionalRegionConfiguration(ENTITY_NAME),
-            transactionalRegionConfiguration(ENTITY2_NAME),
-            transactionalRegionConfiguration(VERSIONED_ENTITY_NAME),
-            transactionalRegionConfiguration(PARENT_ENTITY_NAME),
-            transactionalRegionConfiguration(CHILD_COLLECTION_REGION),
-            transactionalRegionConfiguration(NATURAL_ID_REGION),
-            transactionalRegionConfiguration(NATURAL_ID_REGION2));
-
-        return cfg;
-    }
-
-    /**
-     * @param regionName Region name.
-     * @return Cache configuration for {@link GeneralDataRegion}.
-     */
-    private CacheConfiguration generalRegionConfiguration(String regionName) {
-        CacheConfiguration cfg = new CacheConfiguration();
-
-        cfg.setName(regionName);
-
-        cfg.setCacheMode(PARTITIONED);
-
-        cfg.setAtomicityMode(ATOMIC);
-
-        cfg.setWriteSynchronizationMode(FULL_SYNC);
-
-        cfg.setBackups(1);
-
-        cfg.setAffinity(new CacheConsistentHashAffinityFunction(false, 10));
-
-        return cfg;
-    }
-
-    /**
-     * @param regionName Region name.
-     * @return Cache configuration for {@link TransactionalDataRegion}.
-     */
-    protected CacheConfiguration transactionalRegionConfiguration(String 
regionName) {
-        CacheConfiguration cfg = new CacheConfiguration();
-
-        cfg.setName(regionName);
-
-        cfg.setCacheMode(PARTITIONED);
-
-        cfg.setAtomicityMode(TRANSACTIONAL);
-
-        cfg.setWriteSynchronizationMode(FULL_SYNC);
-
-        cfg.setBackups(1);
-
-        cfg.setAffinity(new CacheConsistentHashAffinityFunction(false, 10));
-
-        return cfg;
-    }
-
-    /**
-     * @param accessType Hibernate L2 cache access type.
-     * @param gridName Grid name.
-     * @return Hibernate configuration.
-     */
-    protected Configuration 
hibernateConfiguration(org.hibernate.cache.spi.access.AccessType accessType,
-        String gridName) {
-        Configuration cfg = new Configuration();
-
-        cfg.addAnnotatedClass(Entity.class);
-        cfg.addAnnotatedClass(Entity2.class);
-        cfg.addAnnotatedClass(VersionedEntity.class);
-        cfg.addAnnotatedClass(ChildEntity.class);
-        cfg.addAnnotatedClass(ParentEntity.class);
-
-        cfg.setCacheConcurrencyStrategy(ENTITY_NAME, 
accessType.getExternalName());
-        cfg.setCacheConcurrencyStrategy(ENTITY2_NAME, 
accessType.getExternalName());
-        cfg.setCacheConcurrencyStrategy(VERSIONED_ENTITY_NAME, 
accessType.getExternalName());
-        cfg.setCacheConcurrencyStrategy(PARENT_ENTITY_NAME, 
accessType.getExternalName());
-        cfg.setCollectionCacheConcurrencyStrategy(CHILD_COLLECTION_REGION, 
accessType.getExternalName());
-
-        cfg.setProperty(HBM2DDL_AUTO, "create");
-
-        cfg.setProperty(GENERATE_STATISTICS, "true");
-
-        cfg.setProperty(USE_SECOND_LEVEL_CACHE, "true");
-
-        cfg.setProperty(USE_QUERY_CACHE, "true");
-
-        cfg.setProperty(CACHE_REGION_FACTORY, 
GridHibernateRegionFactory.class.getName());
-
-        cfg.setProperty(RELEASE_CONNECTIONS, "on_close");
-
-        cfg.setProperty(GRID_NAME_PROPERTY, gridName);
-
-        // Use the same cache for Entity and Entity2.
-        cfg.setProperty(REGION_CACHE_PROPERTY + ENTITY2_NAME, ENTITY_NAME);
-
-        cfg.setProperty(DFLT_ACCESS_TYPE_PROPERTY, accessType.name());
-
-        return cfg;
-    }
-
-    /**
-     * @return Hibernate registry builder.
-     */
-    protected ServiceRegistryBuilder registryBuilder() {
-        ServiceRegistryBuilder builder = new ServiceRegistryBuilder();
-
-        builder.applySetting("hibernate.connection.url", CONNECTION_URL);
-
-        return builder;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTestsStarted() throws Exception {
-        startGrids(2);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void afterTestsStopped() throws Exception {
-        stopAllGrids();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void afterTest() throws Exception {
-        cleanup();
-    }
-
-    /**
-     * @return Hibernate L2 cache access types to test.
-     */
-    protected AccessType[] accessTypes() {
-        return new AccessType[]{AccessType.READ_ONLY, 
AccessType.NONSTRICT_READ_WRITE, AccessType.READ_WRITE};
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testCollectionCache() throws Exception {
-        for (AccessType accessType : accessTypes())
-            testCollectionCache(accessType);
-    }
-
-    /**
-     * @param accessType Cache access type.
-     * @throws Exception If failed.
-     */
-    @SuppressWarnings("unchecked")
-    private void testCollectionCache(AccessType accessType) throws Exception {
-        createSessionFactories(accessType);
-
-        Map<Integer, Integer> idToChildCnt = new HashMap<>();
-
-        try {
-            Session ses = sesFactory1.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                for (int i = 0; i < 3; i++) {
-                    Entity e = new Entity(i, "name-" + i);
-
-                    Collection<ChildEntity> children = new ArrayList<>();
-
-                    for (int j = 0; j < 3; j++)
-                        children.add(new ChildEntity());
-
-                    e.setChildren(children);
-
-                    idToChildCnt.put(e.getId(), e.getChildren().size());
-
-                    ses.save(e);
-                }
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            // Load children, this should populate cache.
-
-            ses = sesFactory1.openSession();
-
-            try {
-                List<Entity> list = ses.createCriteria(ENTITY_NAME).list();
-
-                assertEquals(idToChildCnt.size(), list.size());
-
-                for (Entity e : list)
-                    assertEquals((int)idToChildCnt.get(e.getId()), 
e.getChildren().size());
-            }
-            finally {
-                ses.close();
-            }
-
-            assertCollectionCache(sesFactory2, idToChildCnt, 3, 0);
-            assertCollectionCache(sesFactory1, idToChildCnt, 3, 0);
-
-            if (accessType == AccessType.READ_ONLY)
-                return;
-
-            // Update children for one entity.
-
-            ses = sesFactory1.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                Entity e1 = (Entity)ses.load(Entity.class, 1);
-
-                e1.getChildren().remove(e1.getChildren().iterator().next());
-
-                ses.update(e1);
-
-                idToChildCnt.put(e1.getId(), e1.getChildren().size());
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertCollectionCache(sesFactory2, idToChildCnt, 2, 1); // After 
update collection cache entry is removed.
-            assertCollectionCache(sesFactory1, idToChildCnt, 3, 0); // 
'assertCollectionCache' loads children in cache.
-
-            // Update children for the same entity using another 
SessionFactory.
-
-            ses = sesFactory2.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                Entity e1 = (Entity)ses.load(Entity.class, 1);
-
-                e1.getChildren().remove(e1.getChildren().iterator().next());
-
-                ses.update(e1);
-
-                idToChildCnt.put(e1.getId(), e1.getChildren().size());
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertCollectionCache(sesFactory2, idToChildCnt, 2, 1); // After 
update collection cache entry is removed.
-            assertCollectionCache(sesFactory1, idToChildCnt, 3, 0); // 
'assertCollectionCache' loads children in cache.
-        }
-        finally {
-            cleanup();
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testEntityCache() throws Exception {
-        for (AccessType accessType : accessTypes())
-            testEntityCache(accessType);
-    }
-
-    /**
-     * @param accessType Cache access type.
-     * @throws Exception If failed.
-     */
-    private void testEntityCache(AccessType accessType) throws Exception {
-        createSessionFactories(accessType);
-
-        Map<Integer, String> idToName = new HashMap<>();
-
-        try {
-            Session ses = sesFactory1.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                for (int i = 0; i < 2; i++) {
-                    String name = "name-" + i;
-
-                    ses.save(new Entity(i, name));
-
-                    idToName.put(i, name);
-                }
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName, 100);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName, 100);
-
-            if (accessType == AccessType.READ_ONLY)
-                return;
-
-            ses = sesFactory1.openSession();
-
-            try {
-                // Updates and inserts in single transaction.
-
-                Transaction tx = ses.beginTransaction();
-
-                Entity e0 = (Entity)ses.load(Entity.class, 0);
-
-                e0.setName("name-0-changed1");
-
-                ses.update(e0);
-
-                idToName.put(0, e0.getName());
-
-                ses.save(new Entity(2, "name-2"));
-
-                idToName.put(2, "name-2");
-
-                Entity e1 = (Entity)ses.load(Entity.class, 1);
-
-                e1.setName("name-1-changed1");
-
-                ses.update(e1);
-
-                idToName.put(1, e1.getName());
-
-                ses.save(new Entity(3, "name-3"));
-
-                idToName.put(3, "name-3");
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName);
-
-            ses = sesFactory1.openSession();
-
-            try {
-                // Updates, inserts and deletes in single transaction.
-
-                Transaction tx = ses.beginTransaction();
-
-                ses.save(new Entity(4, "name-4"));
-
-                idToName.put(4, "name-4");
-
-                Entity e0 = (Entity)ses.load(Entity.class, 0);
-
-                e0.setName("name-0-changed2");
-
-                ses.update(e0);
-
-                idToName.put(e0.getId(), e0.getName());
-
-                ses.delete(ses.load(Entity.class, 1));
-
-                idToName.remove(1);
-
-                Entity e2 = (Entity)ses.load(Entity.class, 2);
-
-                e2.setName("name-2-changed1");
-
-                ses.update(e2);
-
-                idToName.put(e2.getId(), e2.getName());
-
-                ses.delete(ses.load(Entity.class, 3));
-
-                idToName.remove(3);
-
-                ses.save(new Entity(5, "name-5"));
-
-                idToName.put(5, "name-5");
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName, 1, 3);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName, 1, 3);
-
-            // Try to update the same entity using another SessionFactory.
-
-            ses = sesFactory2.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                Entity e0 = (Entity)ses.load(Entity.class, 0);
-
-                e0.setName("name-0-changed3");
-
-                ses.update(e0);
-
-                idToName.put(e0.getId(), e0.getName());
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName);
-        }
-        finally {
-            cleanup();
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testTwoEntitiesSameCache() throws Exception {
-        for (AccessType accessType : accessTypes())
-            testTwoEntitiesSameCache(accessType);
-    }
-
-    /**
-     * @param accessType Cache access type.
-     * @throws Exception If failed.
-     */
-    private void testTwoEntitiesSameCache(AccessType accessType) throws 
Exception {
-        createSessionFactories(accessType);
-
-        try {
-            Session ses = sesFactory1.openSession();
-
-            Map<Integer, String> idToName1 = new HashMap<>();
-            Map<Integer, String> idToName2 = new HashMap<>();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                for (int i = 0; i < 2; i++) {
-                    String name = "name-" + i;
-
-                    ses.save(new Entity(i, name));
-                    ses.save(new Entity2(i, name));
-
-                    idToName1.put(i, name);
-                    idToName2.put(i, name);
-                }
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName1, 100);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName1, 100);
-
-            assertEntityCache(ENTITY2_NAME, sesFactory2, idToName2, 100);
-            assertEntityCache(ENTITY2_NAME, sesFactory1, idToName2, 100);
-
-            if (accessType == AccessType.READ_ONLY)
-                return;
-
-            ses = sesFactory1.openSession();
-
-            try {
-                // Updates both entities in single transaction.
-
-                Transaction tx = ses.beginTransaction();
-
-                Entity e = (Entity)ses.load(Entity.class, 0);
-
-                e.setName("name-0-changed1");
-
-                ses.update(e);
-
-                Entity2 e2 = (Entity2)ses.load(Entity2.class, 0);
-
-                e2.setName("name-e2-0-changed1");
-
-                ses.update(e2);
-
-                idToName1.put(0, e.getName());
-                idToName2.put(0, e2.getName());
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName1, 100);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName1, 100);
-
-            assertEntityCache(ENTITY2_NAME, sesFactory2, idToName2, 100);
-            assertEntityCache(ENTITY2_NAME, sesFactory1, idToName2, 100);
-
-            ses = sesFactory1.openSession();
-
-            try {
-                // Remove entity1 and insert entity2 in single transaction.
-
-                Transaction tx = ses.beginTransaction();
-
-                Entity e = (Entity)ses.load(Entity.class, 0);
-
-                ses.delete(e);
-
-                Entity2 e2 = new Entity2(2, "name-2");
-
-                ses.save(e2);
-
-                idToName1.remove(0);
-                idToName2.put(2, e2.getName());
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName1, 0, 100);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName1, 0, 100);
-
-            assertEntityCache(ENTITY2_NAME, sesFactory2, idToName2, 100);
-            assertEntityCache(ENTITY2_NAME, sesFactory1, idToName2, 100);
-
-            ses = sesFactory1.openSession();
-
-            Transaction tx = ses.beginTransaction();
-
-            try {
-                // Update, remove, insert in single transaction, transaction 
fails.
-
-                Entity e = (Entity)ses.load(Entity.class, 1);
-
-                e.setName("name-1-changed1");
-
-                ses.update(e); // Valid update.
-
-                ses.save(new Entity(2, "name-2")); // Valid insert.
-
-                ses.delete(ses.load(Entity2.class, 0)); // Valid delete.
-
-                Entity2 e2 = (Entity2)ses.load(Entity2.class, 1);
-
-                e2.setName("name-2");  // Invalid update, not-unique name.
-
-                ses.update(e2);
-
-                tx.commit();
-
-                fail("Commit must fail.");
-            }
-            catch (ConstraintViolationException e) {
-                log.info("Expected exception: " + e);
-
-                tx.rollback();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName1, 0, 2, 100);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName1, 0, 2, 100);
-
-            assertEntityCache(ENTITY2_NAME, sesFactory2, idToName2, 100);
-            assertEntityCache(ENTITY2_NAME, sesFactory1, idToName2, 100);
-
-            ses = sesFactory2.openSession();
-
-            try {
-                // Update, remove, insert in single transaction.
-
-                tx = ses.beginTransaction();
-
-                Entity e = (Entity)ses.load(Entity.class, 1);
-
-                e.setName("name-1-changed1");
-
-                ses.update(e);
-
-                idToName1.put(1, e.getName());
-
-                ses.save(new Entity(2, "name-2"));
-
-                idToName1.put(2, "name-2");
-
-                ses.delete(ses.load(Entity2.class, 0));
-
-                idToName2.remove(0);
-
-                Entity2 e2 = (Entity2)ses.load(Entity2.class, 1);
-
-                e2.setName("name-e2-2-changed");
-
-                ses.update(e2);
-
-                idToName2.put(1, e2.getName());
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName1, 0, 100);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName1, 0, 100);
-
-            assertEntityCache(ENTITY2_NAME, sesFactory2, idToName2, 0, 100);
-            assertEntityCache(ENTITY2_NAME, sesFactory1, idToName2, 0, 100);
-        }
-        finally {
-            cleanup();
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testVersionedEntity() throws Exception {
-        for (AccessType accessType : accessTypes())
-            testVersionedEntity(accessType);
-    }
-
-    /**
-     * @param accessType Cache access type.
-     * @throws Exception If failed.
-     */
-    private void testVersionedEntity(AccessType accessType) throws Exception {
-        createSessionFactories(accessType);
-
-        try {
-            Session ses = sesFactory1.openSession();
-
-            VersionedEntity e0 = new VersionedEntity(0);
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                ses.save(e0);
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            ses = sesFactory1.openSession();
-
-            long ver;
-
-            try {
-                ver = ((VersionedEntity)ses.load(VersionedEntity.class, 
0)).getVersion();
-            }
-            finally {
-                ses.close();
-            }
-
-            SecondLevelCacheStatistics stats1 =
-                
sesFactory1.getStatistics().getSecondLevelCacheStatistics(VERSIONED_ENTITY_NAME);
-            SecondLevelCacheStatistics stats2 =
-                
sesFactory2.getStatistics().getSecondLevelCacheStatistics(VERSIONED_ENTITY_NAME);
-
-            assertEquals(1, stats1.getElementCountInMemory());
-            assertEquals(1, stats2.getElementCountInMemory());
-
-            ses = sesFactory2.openSession();
-
-            try {
-                assertEquals(ver, 
((VersionedEntity)ses.load(VersionedEntity.class, 0)).getVersion());
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEquals(1, stats2.getElementCountInMemory());
-            assertEquals(1, stats2.getHitCount());
-
-            if (accessType == AccessType.READ_ONLY)
-                return;
-
-            e0.setVersion(ver - 1);
-
-            ses = sesFactory1.openSession();
-
-            Transaction tx = ses.beginTransaction();
-
-            try {
-                ses.update(e0);
-
-                tx.commit();
-
-                fail("Commit must fail.");
-            }
-            catch (StaleObjectStateException e) {
-                log.info("Expected exception: " + e);
-            }
-            finally {
-                tx.rollback();
-
-                ses.close();
-            }
-
-            sesFactory1.getStatistics().clear();
-
-            stats1 = 
sesFactory1.getStatistics().getSecondLevelCacheStatistics(VERSIONED_ENTITY_NAME);
-
-            ses = sesFactory1.openSession();
-
-            try {
-                assertEquals(ver, 
((VersionedEntity)ses.load(VersionedEntity.class, 0)).getVersion());
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEquals(1, stats1.getElementCountInMemory());
-            assertEquals(1, stats1.getHitCount());
-            assertEquals(1, stats2.getElementCountInMemory());
-            assertEquals(1, stats2.getHitCount());
-        }
-        finally {
-            cleanup();
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testNaturalIdCache() throws Exception {
-        for (AccessType accessType : accessTypes())
-            testNaturalIdCache(accessType);
-    }
-
-    /**
-     * @param accessType Cache access type.
-     * @throws Exception If failed.
-     */
-    private void testNaturalIdCache(AccessType accessType) throws Exception {
-        createSessionFactories(accessType);
-
-        Map<String, Integer> nameToId = new HashMap<>();
-
-        try {
-            Session ses = sesFactory1.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                for (int i = 0; i < 3; i++) {
-                    String name = "name-" + i;
-
-                    ses.save(new Entity(i, name));
-
-                    nameToId.put(name, i);
-                }
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            ses = sesFactory1.openSession();
-
-            try {
-                for (Map.Entry<String, Integer> e : nameToId.entrySet())
-                    
((Entity)ses.bySimpleNaturalId(Entity.class).load(e.getKey())).getId();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertNaturalIdCache(sesFactory2, nameToId, "name-100");
-            assertNaturalIdCache(sesFactory1, nameToId, "name-100");
-
-            if (accessType == AccessType.READ_ONLY)
-                return;
-
-            // Update naturalId.
-
-            ses = sesFactory1.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                Entity e1 = (Entity)ses.load(Entity.class, 1);
-
-                nameToId.remove(e1.getName());
-
-                e1.setName("name-1-changed1");
-
-                nameToId.put(e1.getName(), e1.getId());
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertNaturalIdCache(sesFactory2, nameToId, "name-1");
-            assertNaturalIdCache(sesFactory1, nameToId, "name-1");
-
-            // Update entity using another SessionFactory.
-
-            ses = sesFactory2.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                Entity e1 = (Entity)ses.load(Entity.class, 1);
-
-                nameToId.remove(e1.getName());
-
-                e1.setName("name-1-changed2");
-
-                nameToId.put(e1.getName(), e1.getId());
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertNaturalIdCache(sesFactory2, nameToId, "name-1-changed1");
-            assertNaturalIdCache(sesFactory1, nameToId, "name-1-changed1");
-
-            // Try invalid NaturalId update.
-
-            ses = sesFactory1.openSession();
-
-            Transaction tx = ses.beginTransaction();
-
-            try {
-                Entity e1 = (Entity)ses.load(Entity.class, 1);
-
-                e1.setName("name-0"); // Invalid update (duplicated name).
-
-                tx.commit();
-
-                fail("Commit must fail.");
-            }
-            catch (ConstraintViolationException e) {
-                log.info("Expected exception: " + e);
-
-                tx.rollback();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertNaturalIdCache(sesFactory2, nameToId);
-            assertNaturalIdCache(sesFactory1, nameToId);
-
-            // Delete entity.
-
-            ses = sesFactory2.openSession();
-
-            try {
-                tx = ses.beginTransaction();
-
-                Entity e2 = (Entity)ses.load(Entity.class, 2);
-
-                ses.delete(e2);
-
-                nameToId.remove(e2.getName());
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertNaturalIdCache(sesFactory2, nameToId, "name-2");
-            assertNaturalIdCache(sesFactory1, nameToId, "name-2");
-        }
-        finally {
-            cleanup();
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testEntityCacheTransactionFails() throws Exception {
-        for (AccessType accessType : accessTypes())
-            testEntityCacheTransactionFails(accessType);
-    }
-
-    /**
-     * @param accessType Cache access type.
-     * @throws Exception If failed.
-     */
-    private void testEntityCacheTransactionFails(AccessType accessType) throws 
Exception {
-        createSessionFactories(accessType);
-
-        Map<Integer, String> idToName = new HashMap<>();
-
-        try {
-            Session ses = sesFactory1.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                for (int i = 0; i < 3; i++) {
-                    String name = "name-" + i;
-
-                    ses.save(new Entity(i, name));
-
-                    idToName.put(i, name);
-                }
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName, 100);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName, 100);
-
-            ses = sesFactory1.openSession();
-
-            Transaction tx = ses.beginTransaction();
-
-            try {
-                ses.save(new Entity(3, "name-3")); // Valid insert.
-
-                ses.save(new Entity(0, "name-0")); // Invalid insert 
(duplicated ID).
-
-                tx.commit();
-
-                fail("Commit must fail.");
-            }
-            catch (ConstraintViolationException e) {
-                log.info("Expected exception: " + e);
-
-                tx.rollback();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName, 3);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName, 3);
-
-            if (accessType == AccessType.READ_ONLY)
-                return;
-
-            ses = sesFactory1.openSession();
-
-            tx = ses.beginTransaction();
-
-            try {
-                Entity e0 = (Entity)ses.load(Entity.class, 0);
-                Entity e1 = (Entity)ses.load(Entity.class, 1);
-
-                e0.setName("name-10"); // Valid update.
-                e1.setName("name-2"); // Invalid update (violates unique 
constraint).
-
-                ses.update(e0);
-                ses.update(e1);
-
-                tx.commit();
-
-                fail("Commit must fail.");
-            }
-            catch (ConstraintViolationException e) {
-                log.info("Expected exception: " + e);
-
-                tx.rollback();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName);
-
-            ses = sesFactory1.openSession();
-
-            try {
-                // Create parent entity referencing Entity with ID = 0.
-
-                tx = ses.beginTransaction();
-
-                ses.save(new ParentEntity(0, (Entity) ses.load(Entity.class, 
0)));
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            ses = sesFactory1.openSession();
-
-            tx = ses.beginTransaction();
-
-            try {
-                ses.save(new Entity(3, "name-3")); // Valid insert.
-
-                Entity e1 = (Entity)ses.load(Entity.class, 1);
-
-                e1.setName("name-10"); // Valid update.
-
-                ses.delete(ses.load(Entity.class, 0)); // Invalid delete 
(there is a parent entity referencing it).
-
-                tx.commit();
-
-                fail("Commit must fail.");
-            }
-            catch (ConstraintViolationException e) {
-                log.info("Expected exception: " + e);
-
-                tx.rollback();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName, 3);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName, 3);
-
-            ses = sesFactory1.openSession();
-
-            tx = ses.beginTransaction();
-
-            try {
-                ses.delete(ses.load(Entity.class, 1)); // Valid delete.
-
-                idToName.remove(1);
-
-                ses.delete(ses.load(Entity.class, 0)); // Invalid delete 
(there is a parent entity referencing it).
-
-                tx.commit();
-
-                fail("Commit must fail.");
-            }
-            catch (ConstraintViolationException e) {
-                log.info("Expected exception: " + e);
-
-                tx.rollback();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEntityCache(ENTITY_NAME, sesFactory2, idToName);
-            assertEntityCache(ENTITY_NAME, sesFactory1, idToName);
-        }
-        finally {
-            cleanup();
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testQueryCache() throws Exception {
-        for (AccessType accessType : accessTypes())
-            testQueryCache(accessType);
-    }
-
-    /**
-     * @param accessType Cache access type.
-     * @throws Exception If failed.
-     */
-    private void testQueryCache(AccessType accessType) throws Exception {
-        createSessionFactories(accessType);
-
-        try {
-            Session ses = sesFactory1.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                for (int i = 0; i < 5; i++)
-                    ses.save(new Entity(i, "name-" + i));
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            // Run some queries.
-
-            ses = sesFactory1.openSession();
-
-            try {
-                Query qry1 = ses.createQuery("from " + ENTITY_NAME + " where 
id > 2");
-
-                qry1.setCacheable(true);
-
-                assertEquals(2, qry1.list().size());
-
-                Query qry2 = ses.createQuery("from " + ENTITY_NAME + " where 
name = 'name-0'");
-
-                qry2.setCacheable(true);
-
-                assertEquals(1, qry2.list().size());
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEquals(0, 
sesFactory1.getStatistics().getQueryCacheHitCount());
-            assertEquals(2, 
sesFactory1.getStatistics().getQueryCacheMissCount());
-            assertEquals(2, 
sesFactory1.getStatistics().getQueryCachePutCount());
-
-            // Run queries using another SessionFactory.
-
-            ses = sesFactory2.openSession();
-
-            try {
-                Query qry1 = ses.createQuery("from " + ENTITY_NAME + " where 
id > 2");
-
-                qry1.setCacheable(true);
-
-                assertEquals(2, qry1.list().size());
-
-                Query qry2 = ses.createQuery("from " + ENTITY_NAME + " where 
name = 'name-0'");
-
-                qry2.setCacheable(true);
-
-                assertEquals(1, qry2.list().size());
-
-                Query qry3 = ses.createQuery("from " + ENTITY_NAME + " where 
id > 1");
-
-                qry3.setCacheable(true);
-
-                assertEquals(3, qry3.list().size());
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEquals(2, 
sesFactory2.getStatistics().getQueryCacheHitCount());
-            assertEquals(1, 
sesFactory2.getStatistics().getQueryCacheMissCount());
-            assertEquals(1, 
sesFactory2.getStatistics().getQueryCachePutCount());
-
-            // Update entity, it should invalidate query cache.
-
-            ses = sesFactory1.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                ses.save(new Entity(5, "name-5"));
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            // Run queries.
-
-            ses = sesFactory1.openSession();
-
-            sesFactory1.getStatistics().clear();
-
-            try {
-                Query qry1 = ses.createQuery("from " + ENTITY_NAME + " where 
id > 2");
-
-                qry1.setCacheable(true);
-
-                assertEquals(3, qry1.list().size());
-
-                Query qry2 = ses.createQuery("from " + ENTITY_NAME + " where 
name = 'name-0'");
-
-                qry2.setCacheable(true);
-
-                assertEquals(1, qry2.list().size());
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEquals(0, 
sesFactory1.getStatistics().getQueryCacheHitCount());
-            assertEquals(2, 
sesFactory1.getStatistics().getQueryCacheMissCount());
-            assertEquals(2, 
sesFactory1.getStatistics().getQueryCachePutCount());
-
-            // Clear query cache using another SessionFactory.
-
-            sesFactory2.getCache().evictDefaultQueryRegion();
-
-            ses = sesFactory1.openSession();
-
-            // Run queries again.
-
-            sesFactory1.getStatistics().clear();
-
-            try {
-                Query qry1 = ses.createQuery("from " + ENTITY_NAME + " where 
id > 2");
-
-                qry1.setCacheable(true);
-
-                assertEquals(3, qry1.list().size());
-
-                Query qry2 = ses.createQuery("from " + ENTITY_NAME + " where 
name = 'name-0'");
-
-                qry2.setCacheable(true);
-
-                assertEquals(1, qry2.list().size());
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEquals(0, 
sesFactory1.getStatistics().getQueryCacheHitCount());
-            assertEquals(2, 
sesFactory1.getStatistics().getQueryCacheMissCount());
-            assertEquals(2, 
sesFactory1.getStatistics().getQueryCachePutCount());
-        }
-        finally {
-            cleanup();
-        }
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    public void testRegionClear() throws Exception {
-        for (AccessType accessType : accessTypes())
-            testRegionClear(accessType);
-    }
-
-    /**
-     * @param accessType Cache access type.
-     * @throws Exception If failed.
-     */
-    private void testRegionClear(AccessType accessType) throws Exception {
-        createSessionFactories(accessType);
-
-        try {
-            final int ENTITY_CNT = 100;
-
-            Session ses = sesFactory1.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                for (int i = 0; i < ENTITY_CNT; i++) {
-                    Entity e = new Entity(i, "name-" + i);
-
-                    Collection<ChildEntity> children = new ArrayList<>();
-
-                    for (int j = 0; j < 3; j++)
-                        children.add(new ChildEntity());
-
-                    e.setChildren(children);
-
-                    ses.save(e);
-                }
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            loadEntities(sesFactory2, ENTITY_CNT);
-
-            SecondLevelCacheStatistics stats1 = 
sesFactory1.getStatistics().getSecondLevelCacheStatistics(ENTITY_NAME);
-            SecondLevelCacheStatistics stats2 = 
sesFactory2.getStatistics().getSecondLevelCacheStatistics(ENTITY_NAME);
-
-            NaturalIdCacheStatistics idStats1 =
-                
sesFactory1.getStatistics().getNaturalIdCacheStatistics(NATURAL_ID_REGION);
-            NaturalIdCacheStatistics idStats2 =
-                
sesFactory2.getStatistics().getNaturalIdCacheStatistics(NATURAL_ID_REGION);
-
-            SecondLevelCacheStatistics colStats1 =
-                
sesFactory1.getStatistics().getSecondLevelCacheStatistics(CHILD_COLLECTION_REGION);
-            SecondLevelCacheStatistics colStats2 =
-                
sesFactory2.getStatistics().getSecondLevelCacheStatistics(CHILD_COLLECTION_REGION);
-
-            assertEquals(ENTITY_CNT, stats1.getElementCountInMemory());
-            assertEquals(ENTITY_CNT, stats2.getElementCountInMemory());
-
-            assertEquals(ENTITY_CNT, idStats1.getElementCountInMemory());
-            assertEquals(ENTITY_CNT, idStats2.getElementCountInMemory());
-
-            assertEquals(ENTITY_CNT, colStats1.getElementCountInMemory());
-            assertEquals(ENTITY_CNT, colStats2.getElementCountInMemory());
-
-            // Test cache is cleared after update query.
-
-            ses = sesFactory1.openSession();
-
-            try {
-                Transaction tx = ses.beginTransaction();
-
-                ses.createQuery("delete from " + ENTITY_NAME + " where 
name='no such name'").executeUpdate();
-
-                ses.createQuery("delete from " + ChildEntity.class.getName() + 
" where id=-1").executeUpdate();
-
-                tx.commit();
-            }
-            finally {
-                ses.close();
-            }
-
-            assertEquals(0, stats1.getElementCountInMemory());
-            assertEquals(0, stats2.getElementCountInMemory());
-
-            assertEquals(0, idStats1.getElementCountInMemory());
-            assertEquals(0, idStats2.getElementCountInMemory());
-
-            assertEquals(0, colStats1.getElementCountInMemory());
-            assertEquals(0, colStats2.getElementCountInMemory());
-
-            // Load some data in cache.
-
-            loadEntities(sesFactory1, 10);
-
-            assertEquals(10, stats1.getElementCountInMemory());
-            assertEquals(10, stats2.getElementCountInMemory());
-            assertEquals(10, idStats1.getElementCountInMemory());
-            assertEquals(10, idStats2.getElementCountInMemory());
-
-            // Test evictAll method.
-
-            sesFactory2.getCache().evictEntityRegion(ENTITY_NAME);
-
-            assertEquals(0, stats1.getElementCountInMemory());
-            assertEquals(0, stats2.getElementCountInMemory());
-
-            sesFactory2.getCache().evictNaturalIdRegion(ENTITY_NAME);
-
-            assertEquals(0, idStats1.getElementCountInMemory());
-            assertEquals(0, idStats2.getElementCountInMemory());
-
-            
sesFactory2.getCache().evictCollectionRegion(CHILD_COLLECTION_REGION);
-
-            assertEquals(0, colStats1.getElementCountInMemory());
-            assertEquals(0, colStats2.getElementCountInMemory());
-        }
-        finally {
-            cleanup();
-        }
-    }
-
-    /**
-     * @param sesFactory Session factory.
-     * @param nameToId Name-ID mapping.
-     * @param absentNames Absent entities' names.
-     */
-    private void assertNaturalIdCache(SessionFactory sesFactory, Map<String, 
Integer> nameToId, String... absentNames) {
-        sesFactory.getStatistics().clear();
-
-        NaturalIdCacheStatistics stats =
-            
sesFactory.getStatistics().getNaturalIdCacheStatistics(NATURAL_ID_REGION);
-
-        long hitBefore = stats.getHitCount();
-
-        long missBefore = stats.getMissCount();
-
-        final Session ses = sesFactory.openSession();
-
-        try {
-            for (Map.Entry<String, Integer> e : nameToId.entrySet())
-                assertEquals((int)e.getValue(), 
((Entity)ses.bySimpleNaturalId(Entity.class).load(e.getKey())).getId());
-
-            for (String name : absentNames)
-                assertNull((ses.bySimpleNaturalId(Entity.class).load(name)));
-
-            assertEquals(nameToId.size() + hitBefore, stats.getHitCount());
-
-            assertEquals(absentNames.length + missBefore, 
stats.getMissCount());
-        }
-        finally {
-            ses.close();
-        }
-    }
-
-    /**
-     * @param sesFactory Session factory.
-     * @param idToChildCnt Number of children per entity.
-     * @param expHit Expected cache hits.
-     * @param expMiss Expected cache misses.
-     */
-    @SuppressWarnings("unchecked")
-    private void assertCollectionCache(SessionFactory sesFactory, Map<Integer, 
Integer> idToChildCnt, int expHit,
-        int expMiss) {
-        sesFactory.getStatistics().clear();
-
-        Session ses = sesFactory.openSession();
-
-        try {
-            for(Map.Entry<Integer, Integer> e : idToChildCnt.entrySet()) {
-                Entity entity = (Entity)ses.load(Entity.class, e.getKey());
-
-                assertEquals((int)e.getValue(), entity.getChildren().size());
-            }
-        }
-        finally {
-            ses.close();
-        }
-
-        SecondLevelCacheStatistics stats =
-            
sesFactory.getStatistics().getSecondLevelCacheStatistics(CHILD_COLLECTION_REGION);
-
-        assertEquals(expHit, stats.getHitCount());
-
-        assertEquals(expMiss, stats.getMissCount());
-    }
-
-    /**
-     * @param sesFactory Session factory.
-     * @param cnt Number of entities to load.
-     */
-    private void loadEntities(SessionFactory sesFactory, int cnt) {
-        Session ses = sesFactory.openSession();
-
-        try {
-            for (int i = 0; i < cnt; i++) {
-                Entity e = (Entity)ses.load(Entity.class, i);
-
-                assertEquals("name-" + i, e.getName());
-
-                assertFalse(e.getChildren().isEmpty());
-
-                ses.bySimpleNaturalId(Entity.class).load(e.getName());
-            }
-        }
-        finally {
-            ses.close();
-        }
-    }
-
-    /**
-     * @param entityName Entity name.
-     * @param sesFactory Session factory.
-     * @param idToName ID to name mapping.
-     * @param absentIds Absent entities' IDs.
-     */
-    private void assertEntityCache(String entityName, SessionFactory 
sesFactory, Map<Integer, String> idToName,
-        Integer... absentIds) {
-        assert entityName.equals(ENTITY_NAME) || 
entityName.equals(ENTITY2_NAME) : entityName;
-
-        sesFactory.getStatistics().clear();
-
-        final Session ses = sesFactory.openSession();
-
-        final boolean entity1 = entityName.equals(ENTITY_NAME);
-
-        try {
-            if (entity1) {
-                for (Map.Entry<Integer, String> e : idToName.entrySet())
-                    assertEquals(e.getValue(), ((Entity)ses.load(Entity.class, 
e.getKey())).getName());
-            }
-            else {
-                for (Map.Entry<Integer, String> e : idToName.entrySet())
-                    assertEquals(e.getValue(), 
((Entity2)ses.load(Entity2.class, e.getKey())).getName());
-            }
-
-            for (final int id : absentIds) {
-                GridTestUtils.assertThrows(log, new Callable<Void>() {
-                    @Override public Void call() throws Exception {
-                        if (entity1)
-                            ((Entity)ses.load(Entity.class, id)).getName();
-                        else
-                            ((Entity2)ses.load(Entity2.class, id)).getName();
-
-                        return null;
-                    }
-                }, ObjectNotFoundException.class, null);
-            }
-
-            SecondLevelCacheStatistics stats = 
sesFactory.getStatistics().getSecondLevelCacheStatistics(entityName);
-
-            assertEquals(idToName.size(), stats.getHitCount());
-
-            assertEquals(absentIds.length, stats.getMissCount());
-        }
-        finally {
-            ses.close();
-        }
-    }
-
-    /**
-     * Creates session factories.
-     *
-     * @param accessType Cache access type.
-     */
-    private void createSessionFactories(AccessType accessType) {
-        sesFactory1 = startHibernate(accessType, getTestGridName(0));
-
-        sesFactory2 = startHibernate(accessType, getTestGridName(1));
-    }
-
-    /**
-     * Starts Hibernate.
-     *
-     * @param accessType Cache access type.
-     * @param gridName Grid name.
-     * @return Session factory.
-     */
-    private SessionFactory 
startHibernate(org.hibernate.cache.spi.access.AccessType accessType, String 
gridName) {
-        Configuration cfg = hibernateConfiguration(accessType, gridName);
-
-        ServiceRegistryBuilder builder = registryBuilder();
-
-        builder.applySetting("hibernate.show_sql", false);
-
-        return cfg.buildSessionFactory(builder.buildServiceRegistry());
-    }
-
-    /**
-     * Closes session factories and clears data from caches.
-     *
-     * @throws Exception If failed.
-     */
-    private void cleanup() throws Exception {
-        if (sesFactory1 != null)
-            sesFactory1.close();
-
-        sesFactory1 = null;
-
-        if (sesFactory2 != null)
-            sesFactory2.close();
-
-        sesFactory2 = null;
-
-        for (GridCache<?, ?> cache : ((IgniteKernal)grid(0)).caches())
-            cache.clear();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/5d694881/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheTransactionalSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheTransactionalSelfTest.java
 
b/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheTransactionalSelfTest.java
deleted file mode 100644
index 87e9bb3..0000000
--- 
a/modules/hibernate/src/test/java/org/apache/ignite/cache/hibernate/GridHibernateL2CacheTransactionalSelfTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.cache.hibernate;
-
-import org.apache.commons.dbcp.managed.*;
-import org.apache.ignite.cache.*;
-import org.apache.ignite.cache.jta.*;
-import org.apache.ignite.configuration.*;
-import org.h2.jdbcx.*;
-import org.hibernate.cache.spi.access.*;
-import org.hibernate.engine.transaction.internal.jta.*;
-import org.hibernate.engine.transaction.spi.TransactionFactory;
-import org.hibernate.service.*;
-import org.hibernate.service.jdbc.connections.internal.*;
-import org.hibernate.service.jdbc.connections.spi.*;
-import org.hibernate.service.jta.platform.internal.*;
-import org.hibernate.service.jta.platform.spi.*;
-import org.jetbrains.annotations.*;
-import org.objectweb.jotm.*;
-
-import javax.transaction.*;
-import java.util.*;
-
-/**
- *
- * Tests Hibernate L2 cache with TRANSACTIONAL access mode (Hibernate and 
Cache are configured
- * to used the same TransactionManager).
- */
-public class GridHibernateL2CacheTransactionalSelfTest extends 
GridHibernateL2CacheSelfTest {
-    /** */
-    private static Jotm jotm;
-
-    /**
-     */
-    private static class TestJtaPlatform extends AbstractJtaPlatform {
-        /** {@inheritDoc} */
-        @Override protected TransactionManager locateTransactionManager() {
-            return jotm.getTransactionManager();
-        }
-
-        /** {@inheritDoc} */
-        @Override protected UserTransaction locateUserTransaction() {
-            return jotm.getUserTransaction();
-        }
-    }
-
-    /**
-     */
-    @SuppressWarnings("PublicInnerClass")
-    public static class TestTmLookup implements CacheTmLookup {
-        /** {@inheritDoc} */
-        @Override public TransactionManager getTm() {
-            return jotm.getTransactionManager();
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTestsStarted() throws Exception {
-        jotm = new Jotm(true, false);
-
-        super.beforeTestsStarted();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void afterTestsStopped() throws Exception {
-        super.afterTestsStopped();
-
-        if (jotm != null)
-            jotm.stop();
-
-        jotm = null;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected CacheConfiguration 
transactionalRegionConfiguration(String regionName) {
-        CacheConfiguration cfg = 
super.transactionalRegionConfiguration(regionName);
-
-        cfg.setTransactionManagerLookupClassName(TestTmLookup.class.getName());
-
-        cfg.setDistributionMode(CacheDistributionMode.PARTITIONED_ONLY);
-
-        return cfg;
-    }
-
-    /** {@inheritDoc} */
-    @Nullable @Override protected ServiceRegistryBuilder registryBuilder() {
-        ServiceRegistryBuilder builder = new ServiceRegistryBuilder();
-
-        DatasourceConnectionProviderImpl connProvider = new 
DatasourceConnectionProviderImpl();
-
-        BasicManagedDataSource dataSrc = new BasicManagedDataSource(); // 
JTA-aware data source.
-
-        dataSrc.setTransactionManager(jotm.getTransactionManager());
-
-        dataSrc.setDefaultAutoCommit(false);
-
-        JdbcDataSource h2DataSrc = new JdbcDataSource();
-
-        h2DataSrc.setURL(CONNECTION_URL);
-
-        dataSrc.setXaDataSourceInstance(h2DataSrc);
-
-        connProvider.setDataSource(dataSrc);
-
-        connProvider.configure(Collections.emptyMap());
-
-        builder.addService(ConnectionProvider.class, connProvider);
-
-        builder.addService(JtaPlatform.class, new TestJtaPlatform());
-
-        builder.addService(TransactionFactory.class, new 
JtaTransactionFactory());
-
-        return builder;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected AccessType[] accessTypes() {
-        return new AccessType[]{AccessType.TRANSACTIONAL};
-    }
-}

Reply via email to