Make Hibernate-related test compatible with Hibernate 4 and 5

This commit is contained in:
Andy Wilkinson
2016-04-15 14:38:44 +01:00
parent 2d579c2e52
commit 0d172244cc
4 changed files with 218 additions and 66 deletions

View File

@@ -17,27 +17,22 @@ package org.springframework.webflow.persistence;
import javax.sql.DataSource;
import junit.framework.TestCase;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.orm.hibernate4.HibernateCallback;
import org.springframework.orm.hibernate4.HibernateTemplate;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.webflow.engine.EndState;
import org.springframework.webflow.execution.FlowExecutionException;
import org.springframework.webflow.persistence.HibernateHandler.SessionCallback;
import org.springframework.webflow.test.MockFlowSession;
import org.springframework.webflow.test.MockRequestContext;
import junit.framework.TestCase;
/**
* Tests for {@link HibernateFlowExecutionListener}
*
@@ -45,23 +40,18 @@ import org.springframework.webflow.test.MockRequestContext;
*/
public class HibernateFlowExecutionListenerTests extends TestCase {
private SessionFactory sessionFactory;
private HibernateHandler hibernate;
private JdbcTemplate jdbcTemplate;
private HibernateTemplate hibernateTemplate;
private HibernateFlowExecutionListener hibernateListener;
protected void setUp() throws Exception {
DataSource dataSource = getDataSource();
populateDataBase(dataSource);
jdbcTemplate = new JdbcTemplate(dataSource);
sessionFactory = getSessionFactory(dataSource);
hibernateTemplate = new HibernateTemplate(sessionFactory);
hibernateTemplate.setCheckWriteOperations(false);
HibernateTransactionManager tm = new HibernateTransactionManager(sessionFactory);
hibernateListener = new HibernateFlowExecutionListener(sessionFactory, tm);
hibernate = HibernateHandlerFactory.create(dataSource);
hibernateListener = new HibernateFlowExecutionListener(hibernate.getSessionFactory(), hibernate.getTransactionManager());
}
public void testSameSession() {
@@ -82,10 +72,10 @@ public class HibernateFlowExecutionListenerTests extends TestCase {
hibernateListener.resuming(context);
assertSessionBound();
hibernateTemplate.executeWithNativeSession(new HibernateCallback<Object>() {
public Object doInHibernate(Session session) {
hibernate.templateExecuteWithNativeSession(new SessionCallback() {
@Override
public void doWithSession(Session session) {
assertSame("Should have been original instance", hibSession, session);
return null;
}
});
hibernateListener.paused(context);
@@ -109,7 +99,7 @@ public class HibernateFlowExecutionListenerTests extends TestCase {
assertSessionBound();
TestBean bean = new TestBean("Keith Donald");
hibernateTemplate.save(bean);
hibernate.templateSave(bean);
assertEquals("Table should still only have one row", 1, (int)jdbcTemplate.queryForObject("select count(*) from T_BEAN", Integer.class));
EndState endState = new EndState(flowSession.getDefinitionInternal(), "success");
@@ -132,14 +122,14 @@ public class HibernateFlowExecutionListenerTests extends TestCase {
assertSessionBound();
TestBean bean1 = new TestBean("Keith Donald");
hibernateTemplate.save(bean1);
hibernate.templateSave(bean1);
assertEquals("Table should still only have one row", 1, (int)jdbcTemplate.queryForObject("select count(*) from T_BEAN", Integer.class));
hibernateListener.paused(context);
assertSessionNotBound();
hibernateListener.resuming(context);
TestBean bean2 = new TestBean("Keith Donald");
hibernateTemplate.save(bean2);
hibernate.templateSave(bean2);
assertEquals("Table should still only have one row", 1, (int)jdbcTemplate.queryForObject("select count(*) from T_BEAN", Integer.class));
assertSessionBound();
@@ -164,7 +154,7 @@ public class HibernateFlowExecutionListenerTests extends TestCase {
assertSessionBound();
TestBean bean = new TestBean("Keith Donald");
hibernateTemplate.save(bean);
hibernate.templateSave(bean);
assertEquals("Table should still only have one row", 1, (int)jdbcTemplate.queryForObject("select count(*) from T_BEAN", Integer.class));
EndState endState = new EndState(flowSession.getDefinitionInternal(), "cancel");
@@ -205,7 +195,7 @@ public class HibernateFlowExecutionListenerTests extends TestCase {
assertSessionBound();
TestBean bean1 = new TestBean("Keith Donald");
hibernateTemplate.save(bean1);
hibernate.templateSave(bean1);
assertEquals("Table should still only have one row", 1, (int)jdbcTemplate.queryForObject("select count(*) from T_BEAN", Integer.class));
hibernateListener.exceptionThrown(context, new FlowExecutionException("bla", "bla", "bla"));
assertEquals("Table should still only have one row", 1, (int)jdbcTemplate.queryForObject("select count(*) from T_BEAN", Integer.class));
@@ -231,7 +221,7 @@ public class HibernateFlowExecutionListenerTests extends TestCase {
context.setActiveSession(flowSession);
assertSessionBound();
TestBean bean = hibernateTemplate.get(TestBean.class, Long.valueOf(0));
TestBean bean = hibernate.templateGet(TestBean.class, Long.valueOf(0));
assertFalse("addresses should not be initialized", Hibernate.isInitialized(bean.getAddresses()));
hibernateListener.paused(context);
assertFalse("addresses should not be initialized", Hibernate.isInitialized(bean.getAddresses()));
@@ -250,29 +240,19 @@ public class HibernateFlowExecutionListenerTests extends TestCase {
private void populateDataBase(DataSource dataSource) throws Exception {
ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
databasePopulator.addScript(new ClassPathResource("test-data.sql", this.getClass()));
databasePopulator.addScript(new ClassPathResource("test-data.sql", getClass()));
DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource);
initializer.setDatabasePopulator(databasePopulator);
initializer.afterPropertiesSet();
}
private SessionFactory getSessionFactory(DataSource dataSource) throws Exception {
LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setMappingLocations(new Resource[] {
new ClassPathResource("org/springframework/webflow/persistence/TestBean.hbm.xml"),
new ClassPathResource("org/springframework/webflow/persistence/TestAddress.hbm.xml") });
factory.afterPropertiesSet();
return factory.getObject();
}
private void assertSessionNotBound() {
assertNull(TransactionSynchronizationManager.getResource(sessionFactory));
assertNull(TransactionSynchronizationManager.getResource(hibernate.getSessionFactory()));
}
private void assertSessionBound() {
assertNotNull(TransactionSynchronizationManager.getResource(sessionFactory));
assertNotNull(TransactionSynchronizationManager.getResource(hibernate.getSessionFactory()));
}
}

View File

@@ -0,0 +1,42 @@
/*
* Copyright 2004-2016 the original author or authors.
*
* Licensed 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.springframework.webflow.persistence;
import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.PlatformTransactionManager;
interface HibernateHandler {
void templateSave(Object entity);
<T> T templateGet(Class<T> entityClass, Serializable id);
PlatformTransactionManager getTransactionManager();
SessionFactory getSessionFactory();
void templateExecuteWithNativeSession(SessionCallback callback);
interface SessionCallback {
void doWithSession(Session session);
}
}

View File

@@ -0,0 +1,152 @@
/*
* Copyright 2004-2016 the original author or authors.
*
* Licensed 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.springframework.webflow.persistence;
import java.io.Serializable;
import javax.sql.DataSource;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.orm.hibernate4.HibernateCallback;
import org.springframework.orm.hibernate4.HibernateTemplate;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.util.ClassUtils;
public class HibernateHandlerFactory {
static HibernateHandler create(DataSource dataSource) throws Exception {
if (ClassUtils.isPresent("org.hibernate.engine.transaction.spi.TransactionContext",
HibernateHandlerFactory.class.getClassLoader())) {
return new Hibernate4Handler(dataSource);
}
return new Hibernate5Handler(dataSource);
}
private static class Hibernate4Handler implements HibernateHandler {
private final HibernateTemplate template;
private final PlatformTransactionManager tranasactionManager;
private final SessionFactory sessionFactory;
private Hibernate4Handler(DataSource dataSource) throws Exception {
sessionFactory = createSessionFactory(dataSource);
template = new HibernateTemplate(sessionFactory);
template.setCheckWriteOperations(false);
tranasactionManager = new HibernateTransactionManager(sessionFactory);
}
public void templateSave(Object entity) {
template.save(entity);
}
public <T> T templateGet(Class<T> entityClass, Serializable id) {
return template.get(entityClass, id);
}
public void templateExecuteWithNativeSession(final SessionCallback callback) {
template.executeWithNativeSession(new HibernateCallback<Void>() {
@Override
public Void doInHibernate(Session session) throws HibernateException {
callback.doWithSession(session);
return null;
}
});
}
public PlatformTransactionManager getTransactionManager() {
return tranasactionManager;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
private static SessionFactory createSessionFactory(DataSource dataSource) throws Exception {
LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setMappingLocations(new Resource[] {
new ClassPathResource("org/springframework/webflow/persistence/TestBean.hbm.xml"),
new ClassPathResource("org/springframework/webflow/persistence/TestAddress.hbm.xml") });
factory.afterPropertiesSet();
return factory.getObject();
}
}
private static class Hibernate5Handler implements HibernateHandler {
private final org.springframework.orm.hibernate5.HibernateTemplate template;
private final PlatformTransactionManager tranasactionManager;
private final SessionFactory sessionFactory;
private Hibernate5Handler(DataSource dataSource) throws Exception {
sessionFactory = getSessionFactory(dataSource);
template = new org.springframework.orm.hibernate5.HibernateTemplate(sessionFactory);
template.setCheckWriteOperations(false);
tranasactionManager = new org.springframework.orm.hibernate5.HibernateTransactionManager(sessionFactory);
}
public void templateSave(Object entity) {
template.save(entity);
}
public <T> T templateGet(Class<T> entityClass, Serializable id) {
return template.get(entityClass, id);
}
public void templateExecuteWithNativeSession(final SessionCallback callback) {
template.executeWithNativeSession(new org.springframework.orm.hibernate5.HibernateCallback<Void>() {
@Override
public Void doInHibernate(Session session) throws HibernateException {
callback.doWithSession(session);
return null;
}
});
}
public PlatformTransactionManager getTransactionManager() {
return tranasactionManager;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
private SessionFactory getSessionFactory(DataSource dataSource) throws Exception {
org.springframework.orm.hibernate5.LocalSessionFactoryBean factory = new org.springframework.orm.hibernate5.LocalSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setMappingLocations(new Resource[] {
new ClassPathResource("org/springframework/webflow/persistence/TestBean.hbm.xml"),
new ClassPathResource("org/springframework/webflow/persistence/TestAddress.hbm.xml") });
factory.afterPropertiesSet();
return factory.getObject();
}
}
}

View File

@@ -2,20 +2,12 @@ package org.springframework.webflow.persistence;
import javax.sql.DataSource;
import org.hibernate.SessionFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.orm.hibernate4.HibernateTemplate;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.webflow.execution.FlowExecutionListener;
public class HibernatePersistenceContextPropagationTests extends AbstractPersistenceContextPropagationTests {
private SessionFactory sessionFactory;
private HibernateTemplate hibernateTemplate;
private HibernateHandler hibernate;
private HibernateFlowExecutionListener executionListener;
@@ -23,11 +15,8 @@ public class HibernatePersistenceContextPropagationTests extends AbstractPersist
@Override
protected void setUpResources(DataSource dataSource) throws Exception {
sessionFactory = getSessionFactory(dataSource);
hibernateTemplate = new HibernateTemplate(sessionFactory);
hibernateTemplate.setCheckWriteOperations(false);
HibernateTransactionManager tm = new HibernateTransactionManager(sessionFactory);
executionListener = new HibernateFlowExecutionListener(sessionFactory, tm);
hibernate = HibernateHandlerFactory.create(dataSource);
executionListener = new HibernateFlowExecutionListener(hibernate.getSessionFactory(), hibernate.getTransactionManager());
rowCount = 1;
}
@@ -38,18 +27,18 @@ public class HibernatePersistenceContextPropagationTests extends AbstractPersist
@Override
protected void assertSessionNotBound() {
assertNull(TransactionSynchronizationManager.getResource(sessionFactory));
assertNull(TransactionSynchronizationManager.getResource(hibernate.getSessionFactory()));
}
@Override
protected void assertSessionBound() {
assertNotNull(TransactionSynchronizationManager.getResource(sessionFactory));
assertNotNull(TransactionSynchronizationManager.getResource(hibernate.getSessionFactory()));
}
@Override
protected void assertCommitState(boolean insertRow, boolean isCommited) {
if (insertRow) {
hibernateTemplate.save(new TestBean(rowCount++, "Keith Donald"));
hibernate.templateSave(new TestBean(rowCount++, "Keith Donald"));
}
if (!isCommited) {
assertEquals("Nothing should be committed yet", 1,
@@ -60,15 +49,4 @@ public class HibernatePersistenceContextPropagationTests extends AbstractPersist
}
}
@SuppressWarnings("cast")
private SessionFactory getSessionFactory(DataSource dataSource) throws Exception {
LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setMappingLocations(new Resource[] {
new ClassPathResource("org/springframework/webflow/persistence/TestBean.hbm.xml"),
new ClassPathResource("org/springframework/webflow/persistence/TestAddress.hbm.xml") });
factory.afterPropertiesSet();
return (SessionFactory) factory.getObject();
}
}