/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.test.naturalid.mutable.cached;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.io.Serializable;
import java.util.Map;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import org.hibernate.stat.NaturalIdCacheStatistics;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.cache.CachingRegionFactory;
import org.junit.Test;
public class CachedMutableNaturalIdStrictReadWriteTest extends
CachedMutableNaturalIdTest {
@Override
public void configure(Configuration cfg) {
super.configure(cfg);
cfg.setProperty( CachingRegionFactory.DEFAULT_ACCESSTYPE, "read-write" );
}
@Test
@TestForIssue( jiraKey = "HHH-9203" )
public void testToMapConversion() {
sessionFactory().getStatistics().clear();
final Session session = openSession();
session.getTransaction().begin();
final AllCached it = new AllCached( "IT" );
session.save( it );
session.getTransaction().commit();
session.close();
final NaturalIdCacheStatistics stats = sessionFactory().getStatistics().getNaturalIdCacheStatistics(
"hibernate.test." + AllCached.class.getName() + "##NaturalId"
);
final Map entries = stats.getEntries();
assertEquals( 1, entries.size() );
final Serializable[] cacheKey = (Serializable[]) entries.keySet().iterator().next();
assertEquals( 1, cacheKey.length );
assertEquals( it.getName(), cacheKey[0] );
assertNotNull( entries.get( cacheKey ) );
}
@Test
@TestForIssue( jiraKey = "HHH-7278" )
public void testInsertedNaturalIdCachedAfterTransactionSuccess() {
Session session = openSession();
session.getSessionFactory().getStatistics().clear();
session.beginTransaction();
Another it = new Another( "it");
session.save( it );
session.flush();
session.getTransaction().commit();
session.close();
session = openSession();
session.beginTransaction();
it = (Another) session.bySimpleNaturalId(Another.class).load("it");
assertNotNull(it);
session.delete(it);
session.getTransaction().commit();
assertEquals(1, session.getSessionFactory().getStatistics().getNaturalIdCacheHitCount());
}
@Test
@TestForIssue( jiraKey = "HHH-7278" )
public void testInsertedNaturalIdNotCachedAfterTransactionFailure() {
Session session = openSession();
session.getSessionFactory().getStatistics().clear();
session.beginTransaction();
Another it = new Another( "it");
session.save( it );
session.flush();
session.getTransaction().rollback();
session.close();
session = openSession();
session.beginTransaction();
it = (Another) session.bySimpleNaturalId(Another.class).load("it");
assertNull(it);
assertEquals(0, session.getSessionFactory().getStatistics().getNaturalIdCacheHitCount());
}
@Test
@TestForIssue( jiraKey = "HHH-7278" )
public void testChangedNaturalIdCachedAfterTransactionSuccess() {
Session session = openSession();
session.beginTransaction();
Another it = new Another( "it");
session.save( it );
session.getTransaction().commit();
session.close();
session = openSession();
session.beginTransaction();
it = (Another) session.bySimpleNaturalId(Another.class).load("it");
assertNotNull(it);
it.setName("modified");
session.flush();
session.getTransaction().commit();
session.close();
session.getSessionFactory().getStatistics().clear();
session = openSession();
session.beginTransaction();
it = (Another) session.bySimpleNaturalId(Another.class).load("modified");
assertNotNull(it);
session.delete(it);
session.getTransaction().commit();
session.close();
assertEquals(1, session.getSessionFactory().getStatistics().getNaturalIdCacheHitCount());
}
@Test
@TestForIssue( jiraKey = "HHH-7278" )
public void testChangedNaturalIdNotCachedAfterTransactionFailure() {
Session session = openSession();
session.beginTransaction();
Another it = new Another( "it");
session.save( it );
session.getTransaction().commit();
session.close();
session = openSession();
session.beginTransaction();
it = (Another) session.bySimpleNaturalId(Another.class).load("it");
assertNotNull(it);
it.setName("modified");
session.flush();
session.getTransaction().rollback();
session.close();
session.getSessionFactory().getStatistics().clear();
session = openSession();
session.beginTransaction();
it = (Another) session.bySimpleNaturalId(Another.class).load("modified");
assertNull(it);
it = (Another) session.bySimpleNaturalId(Another.class).load("it");
session.delete(it);
session.getTransaction().commit();
session.close();
assertEquals(0, session.getSessionFactory().getStatistics().getNaturalIdCacheHitCount());
}
@Test
@TestForIssue( jiraKey = "HHH-7309" )
public void testInsertUpdateEntity_NaturalIdCachedAfterTransactionSuccess() {
Session session = openSession();
session.getSessionFactory().getStatistics().clear();
session.beginTransaction();
Another it = new Another( "it");
session.save( it ); // schedules an InsertAction
it.setSurname("1234"); // schedules an UpdateAction, without bug-fix
// this will re-cache natural-id with identical key and at same time invalidate it
session.flush();
session.getTransaction().commit();
session.close();
session = openSession();
session.beginTransaction();
it = (Another) session.bySimpleNaturalId(Another.class).load("it");
assertNotNull(it);
session.delete(it);
session.getTransaction().commit();
assertEquals("In a strict access strategy we would excpect a hit here", 1, session.getSessionFactory().getStatistics().getNaturalIdCacheHitCount());
}
@Test
@TestForIssue( jiraKey = "HHH-9200" )
public void testNaturalIdCacheStatisticsReset() {
final String naturalIdCacheRegion = "hibernate.test.org.hibernate.test.naturalid.mutable.cached.Another##NaturalId";
sessionFactory().getStatistics().clear();
Session session = openSession();
session.beginTransaction();
final Another it = new Another( "IT");
session.save( it );
session.getTransaction().commit();
session.close();
NaturalIdCacheStatistics statistics = sessionFactory().getStatistics().getNaturalIdCacheStatistics( naturalIdCacheRegion );
assertEquals( 1, statistics.getPutCount() );
sessionFactory().getStatistics().clear();
// Refresh statistics reference.
statistics = sessionFactory().getStatistics().getNaturalIdCacheStatistics( naturalIdCacheRegion );
assertEquals( 0, statistics.getPutCount() );
session = openSession();
session.beginTransaction();
session.delete( it );
session.getTransaction().commit();
session.clear();
}
}