package org.hibernate.bugs;
import static org.junit.Assert.assertEquals;
import java.lang.reflect.Field;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.engine.query.spi.QueryPlanCache;
import org.hibernate.internal.SessionFactoryImpl;
import org.hibernate.internal.util.collections.BoundedConcurrentHashMap;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* This template demonstrates how to develop a test case for Hibernate ORM, using the Java Persistence API.
*/
public class JPAUnitTestCase {
private EntityManagerFactory entityManagerFactory;
@Before
public void init() {
entityManagerFactory = Persistence.createEntityManagerFactory( "templatePU" );
}
@After
public void destroy() {
entityManagerFactory.close();
}
@Test
public void hhh123Test() throws Exception {
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
Session session = entityManager.unwrap(Session.class);
SessionFactory sessionFactory = session.getSessionFactory();
SessionFactoryImpl factoryImpl = (SessionFactoryImpl) sessionFactory;
QueryPlanCache cache = factoryImpl.getQueryPlanCache();
Field f = cache.getClass().getDeclaredField("queryPlanCache");
f.setAccessible(true);
BoundedConcurrentHashMap queryPlanCache = (BoundedConcurrentHashMap) f.get(cache);
assertEquals(0, queryPlanCache.size());
Event event = new Event( new Date() );
entityManager.persist( event );
System.out.println(Runtime.getRuntime().totalMemory());
for (int i = 0; i < 10000; i++) {
assertEquals(0, queryPlanCache.size());
Event dbEvent = entityManager.createQuery("select e from Event e", Event.class).getSingleResult();
assertEquals(event.getCreatedOn(), dbEvent.getCreatedOn());
assertEquals(1, queryPlanCache.size());
queryPlanCache.clear();
assertEquals(0, queryPlanCache.size());
if(i%100 == 0) {
System.gc();
System.out.println(String.format("i: %d, percentage mem: %f", i, (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) * 100.0/Runtime.getRuntime().totalMemory() ));
}
}
entityManager.getTransaction().commit();
entityManager.close();
}
}