diff --git a/SPR-9215/pom.xml b/SPR-9215/pom.xml
new file mode 100644
index 00000000..27c2efea
--- /dev/null
+++ b/SPR-9215/pom.xml
@@ -0,0 +1,113 @@
+
+ 4.0.0
+ org.springframework.issues
+ SPR-9215
+ 1.0-SNAPSHOT
+ jar
+
+ 1.6
+ 1.6
+ UTF8
+ 3.1.0.RELEASE
+
+
+
+ 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
+ ${spring.version}
+ runtime
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+ org.springframework
+ spring-instrument
+ ${spring.version}
+ runtime
+
+
+ org.springframework
+ spring-orm
+ ${spring.version}
+
+
+ org.springframework
+ spring-tx
+ ${spring.version}
+
+
+ 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
+
+ once
+
+ -javaagent:${settings.localRepository}/org/springframework/spring-instrument/${spring.version}/spring-instrument-${spring.version}.jar
+
+
+ **/*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..5e9ee257
--- /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..b5bd9856
--- /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:test
+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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+