From 8a412ec9fa1ef7de87a7ec697fc80cc56c466077 Mon Sep 17 00:00:00 2001 From: Wei Gao Date: Fri, 9 Mar 2012 14:12:37 -0800 Subject: [PATCH 1/2] Add repro project for SPR-9215 --- SPR-9215/pom.xml | 103 ++++++++++++++++ .../springframework/issues/dao/TestDAO.java | 9 ++ .../issues/dao/impl/TestDAOImpl.java | 25 ++++ .../issues/datamodel/TestData.java | 44 +++++++ .../issues/service/TestService.java | 9 ++ .../issues/service/impl/TestServiceImpl.java | 27 ++++ SPR-9215/src/main/resources/.gitignore | 0 SPR-9215/src/main/resources/META-INF/aop.xml | 7 ++ .../main/resources/META-INF/persistence.xml | 9 ++ .../org/springframework/issues/AppConfig.java | 115 ++++++++++++++++++ .../issues/JavaConfigTests.java | 31 +++++ .../issues/XmlConfigTests.java | 37 ++++++ SPR-9215/src/test/resources/config.properties | 4 + SPR-9215/src/test/resources/log4j.properties | 7 ++ .../issues/ReproTests-context.xml | 71 +++++++++++ 15 files changed, 498 insertions(+) create mode 100644 SPR-9215/pom.xml create mode 100644 SPR-9215/src/main/java/org/springframework/issues/dao/TestDAO.java create mode 100644 SPR-9215/src/main/java/org/springframework/issues/dao/impl/TestDAOImpl.java create mode 100644 SPR-9215/src/main/java/org/springframework/issues/datamodel/TestData.java create mode 100644 SPR-9215/src/main/java/org/springframework/issues/service/TestService.java create mode 100644 SPR-9215/src/main/java/org/springframework/issues/service/impl/TestServiceImpl.java create mode 100644 SPR-9215/src/main/resources/.gitignore create mode 100644 SPR-9215/src/main/resources/META-INF/aop.xml create mode 100644 SPR-9215/src/main/resources/META-INF/persistence.xml create mode 100644 SPR-9215/src/test/java/org/springframework/issues/AppConfig.java create mode 100644 SPR-9215/src/test/java/org/springframework/issues/JavaConfigTests.java create mode 100644 SPR-9215/src/test/java/org/springframework/issues/XmlConfigTests.java create mode 100644 SPR-9215/src/test/resources/config.properties create mode 100644 SPR-9215/src/test/resources/log4j.properties create mode 100644 SPR-9215/src/test/resources/org/springframework/issues/ReproTests-context.xml diff --git a/SPR-9215/pom.xml b/SPR-9215/pom.xml new file mode 100644 index 00000000..543e6823 --- /dev/null +++ b/SPR-9215/pom.xml @@ -0,0 +1,103 @@ + + 4.0.0 + org.springframework.issues + SPR-9215 + 1.0-SNAPSHOT + jar + + 1.6 + 1.6 + UTF8 + + + + org.aspectj + aspectjweaver + 1.6.12 + runtime + + + org.apache.tomcat + tomcat-jdbc + 7.0.26 + runtime + + + org.hibernate + hibernate-entitymanager + 3.6.9.Final + + + org.hsqldb + hsqldb + 2.2.8 + runtime + + + org.springframework + spring-aspects + 3.1.0.RELEASE + runtime + + + org.springframework + spring-context + 3.1.0.RELEASE + + + org.springframework + spring-tx + 3.1.0.RELEASE + + + org.springframework + spring-orm + 3.1.0.RELEASE + + + log4j + log4j + 1.2.16 + + + junit + junit + 4.10 + test + + + + + spring-maven-snapshot + Springframework Maven Snapshot Repository + http://repo.springsource.org/snapshot + + + + + + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + maven-surefire-plugin + 2.7.2 + + + **/*Tests.java + + + **/*Abstract*.java + + + + + + + diff --git a/SPR-9215/src/main/java/org/springframework/issues/dao/TestDAO.java b/SPR-9215/src/main/java/org/springframework/issues/dao/TestDAO.java new file mode 100644 index 00000000..f74e2f57 --- /dev/null +++ b/SPR-9215/src/main/java/org/springframework/issues/dao/TestDAO.java @@ -0,0 +1,9 @@ +package org.springframework.issues.dao; + +import org.springframework.issues.datamodel.TestData; + +public interface TestDAO { + public TestData saveTestData(TestData entity); + + public TestData loadTestDataById(Long id); +} diff --git a/SPR-9215/src/main/java/org/springframework/issues/dao/impl/TestDAOImpl.java b/SPR-9215/src/main/java/org/springframework/issues/dao/impl/TestDAOImpl.java new file mode 100644 index 00000000..c9e14669 --- /dev/null +++ b/SPR-9215/src/main/java/org/springframework/issues/dao/impl/TestDAOImpl.java @@ -0,0 +1,25 @@ +package org.springframework.issues.dao.impl; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.springframework.issues.dao.TestDAO; +import org.springframework.issues.datamodel.TestData; +import org.springframework.stereotype.Repository; + +@Repository +public class TestDAOImpl implements TestDAO { + @PersistenceContext + private EntityManager em; + + @Override + public TestData saveTestData(TestData entity) { + TestData ret = em.merge(entity); + return ret; + } + + @Override + public TestData loadTestDataById(Long id) { + return em.find(TestData.class, id); + } +} diff --git a/SPR-9215/src/main/java/org/springframework/issues/datamodel/TestData.java b/SPR-9215/src/main/java/org/springframework/issues/datamodel/TestData.java new file mode 100644 index 00000000..9a878e94 --- /dev/null +++ b/SPR-9215/src/main/java/org/springframework/issues/datamodel/TestData.java @@ -0,0 +1,44 @@ +package org.springframework.issues.datamodel; + +import java.io.Serializable; + +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.TableGenerator; + +@Entity +@Table(name = "TBL_TEST") +public class TestData implements Serializable { + private static final long serialVersionUID = 6731190069981115642L; + + @Id + @GeneratedValue(strategy = GenerationType.TABLE, generator = "test-gen") + @TableGenerator(name = "test-gen", pkColumnName = "TEST", allocationSize = 150, table = "TBL_IDS") + @Column(name = "ID") + private Long id; + + @Basic + @Column(name = "NAME", length = 255) + private String name; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/SPR-9215/src/main/java/org/springframework/issues/service/TestService.java b/SPR-9215/src/main/java/org/springframework/issues/service/TestService.java new file mode 100644 index 00000000..711045ee --- /dev/null +++ b/SPR-9215/src/main/java/org/springframework/issues/service/TestService.java @@ -0,0 +1,9 @@ +package org.springframework.issues.service; + +import org.springframework.issues.datamodel.TestData; + +public interface TestService { + public TestData saveTestData(TestData entity); + + public TestData loadTestDataById(Long id); +} diff --git a/SPR-9215/src/main/java/org/springframework/issues/service/impl/TestServiceImpl.java b/SPR-9215/src/main/java/org/springframework/issues/service/impl/TestServiceImpl.java new file mode 100644 index 00000000..1b9692fa --- /dev/null +++ b/SPR-9215/src/main/java/org/springframework/issues/service/impl/TestServiceImpl.java @@ -0,0 +1,27 @@ +package org.springframework.issues.service.impl; + +import javax.annotation.Resource; + +import org.springframework.issues.dao.TestDAO; +import org.springframework.issues.datamodel.TestData; +import org.springframework.issues.service.TestService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class TestServiceImpl implements TestService { + @Resource + private TestDAO dao; + + @Override + @Transactional + public TestData saveTestData(TestData entity) { + return dao.saveTestData(entity); + } + + @Override + @Transactional(readOnly = true) + public TestData loadTestDataById(Long id) { + return dao.loadTestDataById(id); + } +} diff --git a/SPR-9215/src/main/resources/.gitignore b/SPR-9215/src/main/resources/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/SPR-9215/src/main/resources/META-INF/aop.xml b/SPR-9215/src/main/resources/META-INF/aop.xml new file mode 100644 index 00000000..a47d1e9c --- /dev/null +++ b/SPR-9215/src/main/resources/META-INF/aop.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/SPR-9215/src/main/resources/META-INF/persistence.xml b/SPR-9215/src/main/resources/META-INF/persistence.xml new file mode 100644 index 00000000..08163589 --- /dev/null +++ b/SPR-9215/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/SPR-9215/src/test/java/org/springframework/issues/AppConfig.java b/SPR-9215/src/test/java/org/springframework/issues/AppConfig.java new file mode 100644 index 00000000..0217e570 --- /dev/null +++ b/SPR-9215/src/test/java/org/springframework/issues/AppConfig.java @@ -0,0 +1,115 @@ +package org.springframework.issues; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Resource; +import javax.sql.DataSource; + +import org.hibernate.cache.HashtableCacheProvider; +import org.hibernate.dialect.HSQLDialect; +import org.springframework.context.annotation.AdviceMode; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableLoadTimeWeaving; +import org.springframework.context.annotation.EnableLoadTimeWeaving.AspectJWeaving; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.orm.jpa.JpaDialect; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.JpaVendorAdapter; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager; +import org.springframework.orm.jpa.persistenceunit.PersistenceUnitManager; +import org.springframework.orm.jpa.vendor.Database; +import org.springframework.orm.jpa.vendor.HibernateJpaDialect; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.aspectj.AnnotationTransactionAspect; + +@Configuration +@ComponentScan("org.springframework.issues") +@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, order = 0) +@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED) +@PropertySource("/config.properties") +public class AppConfig { + @Resource + private Environment env; + + @Bean + public Map jpaProperties() { + Map props = new HashMap(); + props.put("hibernate.dialect", HSQLDialect.class.getName()); + props.put("hibernate.cache.provider_class", + HashtableCacheProvider.class.getName()); + props.put("hibernate.show_sql", true); + props.put("hibernate.format_sql", true); + return props; + } + + @Bean + public JpaVendorAdapter jpaVendorAdapter() { + HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter(); + hibernateJpaVendorAdapter.setShowSql(true); + hibernateJpaVendorAdapter.setGenerateDdl(true); + hibernateJpaVendorAdapter.setDatabase(Database.HSQL); + return hibernateJpaVendorAdapter; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + LocalContainerEntityManagerFactoryBean lcemfb = new LocalContainerEntityManagerFactoryBean(); + lcemfb.setJpaVendorAdapter(jpaVendorAdapter()); + lcemfb.setJpaDialect(jpaDialect()); + lcemfb.setPersistenceUnitName("default"); + lcemfb.setPersistenceUnitManager(persistenceUnitManager()); + lcemfb.setJpaPropertyMap(jpaProperties()); + lcemfb.setDataSource(dataSource()); + return lcemfb; + } + + @Bean + public PersistenceUnitManager persistenceUnitManager() { + DefaultPersistenceUnitManager dpum = new DefaultPersistenceUnitManager(); + dpum.setDefaultDataSource(dataSource()); + return dpum; + } + + @Bean + public JpaDialect jpaDialect() { + return new HibernateJpaDialect(); + } + + @Bean + public AnnotationTransactionAspect annotationTransactionAspect() { + AnnotationTransactionAspect ata = AnnotationTransactionAspect + .aspectOf(); + ata.setTransactionManager(txManager()); + return ata; + } + + @Bean(destroyMethod = "close") + public DataSource dataSource() { + org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(); + ds.setDriverClassName(env.getProperty("jdbc.driverClass")); + ds.setUrl(env.getProperty("jdbc.url")); + ds.setUsername(env.getProperty("jdbc.user")); + ds.setPassword(env.getProperty("jdbc.password")); + ds.setInitialSize(1); + ds.setMinIdle(1); + ds.setMaxIdle(1); + ds.setMaxActive(2); + ds.setMaxWait(5000); + return ds; + } + + @Bean + public PlatformTransactionManager txManager() { + JpaTransactionManager txManager = new JpaTransactionManager(); + txManager.setEntityManagerFactory(entityManagerFactory().getObject()); + txManager.setDataSource(dataSource()); + return txManager; + } +} diff --git a/SPR-9215/src/test/java/org/springframework/issues/JavaConfigTests.java b/SPR-9215/src/test/java/org/springframework/issues/JavaConfigTests.java new file mode 100644 index 00000000..6df83377 --- /dev/null +++ b/SPR-9215/src/test/java/org/springframework/issues/JavaConfigTests.java @@ -0,0 +1,31 @@ +package org.springframework.issues; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.issues.datamodel.TestData; +import org.springframework.issues.service.TestService; + +public class JavaConfigTests { + + @Test + public void javaConfigurationTest() { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( + AppConfig.class); + try { + TestService ts = ctx.getBean(TestService.class); + + TestData entity = new TestData(); + entity.setName("This is a test."); + entity = ts.saveTestData(entity); + Long id = entity.getId(); + TestData e1 = ts.loadTestDataById(id); + assertNotNull(e1); + assertEquals("This is a test.", e1.getName()); + } finally { + ctx.close(); + } + } +} diff --git a/SPR-9215/src/test/java/org/springframework/issues/XmlConfigTests.java b/SPR-9215/src/test/java/org/springframework/issues/XmlConfigTests.java new file mode 100644 index 00000000..a54df84e --- /dev/null +++ b/SPR-9215/src/test/java/org/springframework/issues/XmlConfigTests.java @@ -0,0 +1,37 @@ +package org.springframework.issues; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.springframework.context.support.GenericXmlApplicationContext; +import org.springframework.issues.datamodel.TestData; +import org.springframework.issues.service.TestService; + +/** + * Unit test that reproduces an issue reported against SPR JIRA. @Test methods + * within need not pass with the green bar! Rather they should fail in such a + * way that demonstrates the reported issue. + */ +public class XmlConfigTests { + + @Test + public void xmlConfigurationTest() { + GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); + ctx.load("classpath:org/springframework/issues/ReproTests-context.xml"); + ctx.refresh(); + try { + TestService ts = ctx.getBean(TestService.class); + + TestData entity = new TestData(); + entity.setName("This is a test."); + entity = ts.saveTestData(entity); + Long id = entity.getId(); + TestData e1 = ts.loadTestDataById(id); + assertNotNull(e1); + assertEquals("This is a test.", e1.getName()); + } finally { + ctx.close(); + } + } +} diff --git a/SPR-9215/src/test/resources/config.properties b/SPR-9215/src/test/resources/config.properties new file mode 100644 index 00000000..6c1f19c6 --- /dev/null +++ b/SPR-9215/src/test/resources/config.properties @@ -0,0 +1,4 @@ +jdbc.driverClass=org.hsqldb.jdbc.JDBCDriver +jdbc.url=jdbc:hsqldb:mem +jdbc.user=SA +jdbc.password= \ No newline at end of file diff --git a/SPR-9215/src/test/resources/log4j.properties b/SPR-9215/src/test/resources/log4j.properties new file mode 100644 index 00000000..82776b7b --- /dev/null +++ b/SPR-9215/src/test/resources/log4j.properties @@ -0,0 +1,7 @@ +log4j.rootCategory=ERROR, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n + +log4j.category.org.springframework=WARN \ No newline at end of file diff --git a/SPR-9215/src/test/resources/org/springframework/issues/ReproTests-context.xml b/SPR-9215/src/test/resources/org/springframework/issues/ReproTests-context.xml new file mode 100644 index 00000000..119ad994 --- /dev/null +++ b/SPR-9215/src/test/resources/org/springframework/issues/ReproTests-context.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + org.hibernate.dialect.HSQLDialect + org.hibernate.cache.HashtableCacheProvider + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f1ea442ccbd74e732ab06a6226f0efef553538d6 Mon Sep 17 00:00:00 2001 From: Wei Gao Date: Sat, 10 Mar 2012 12:10:58 -0800 Subject: [PATCH 2/2] Change pom to run test with -javaagent command line option --- SPR-9215/pom.xml | 26 +++++++++++++------ .../issues/XmlConfigTests.java | 2 +- SPR-9215/src/test/resources/config.properties | 2 +- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/SPR-9215/pom.xml b/SPR-9215/pom.xml index 543e6823..27c2efea 100644 --- a/SPR-9215/pom.xml +++ b/SPR-9215/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 org.springframework.issues SPR-9215 @@ -10,6 +9,7 @@ 1.6 1.6 UTF8 + 3.1.0.RELEASE @@ -38,23 +38,29 @@ org.springframework spring-aspects - 3.1.0.RELEASE + ${spring.version} runtime org.springframework spring-context - 3.1.0.RELEASE + ${spring.version} org.springframework - spring-tx - 3.1.0.RELEASE + spring-instrument + ${spring.version} + runtime org.springframework spring-orm - 3.1.0.RELEASE + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} log4j @@ -89,6 +95,10 @@ maven-surefire-plugin 2.7.2 + once + + -javaagent:${settings.localRepository}/org/springframework/spring-instrument/${spring.version}/spring-instrument-${spring.version}.jar + **/*Tests.java diff --git a/SPR-9215/src/test/java/org/springframework/issues/XmlConfigTests.java b/SPR-9215/src/test/java/org/springframework/issues/XmlConfigTests.java index a54df84e..5e9ee257 100644 --- a/SPR-9215/src/test/java/org/springframework/issues/XmlConfigTests.java +++ b/SPR-9215/src/test/java/org/springframework/issues/XmlConfigTests.java @@ -18,7 +18,7 @@ public class XmlConfigTests { @Test public void xmlConfigurationTest() { GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); - ctx.load("classpath:org/springframework/issues/ReproTests-context.xml"); + ctx.load("classpath:/org/springframework/issues/ReproTests-context.xml"); ctx.refresh(); try { TestService ts = ctx.getBean(TestService.class); diff --git a/SPR-9215/src/test/resources/config.properties b/SPR-9215/src/test/resources/config.properties index 6c1f19c6..b5bd9856 100644 --- a/SPR-9215/src/test/resources/config.properties +++ b/SPR-9215/src/test/resources/config.properties @@ -1,4 +1,4 @@ jdbc.driverClass=org.hsqldb.jdbc.JDBCDriver -jdbc.url=jdbc:hsqldb:mem +jdbc.url=jdbc:hsqldb:mem:test jdbc.user=SA jdbc.password= \ No newline at end of file