package org.springframework.issues.spr11669; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.dao.DuplicateKeyException; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.issues.spr11669.domain.model.Member; import org.springframework.issues.spr11669.domain.repository.MemberRepository; import org.springframework.issues.spr11669.domain.service.MemberService; import org.springframework.jdbc.datasource.init.DataSourceInitializer; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.JpaVendorAdapter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.Database; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.EnableTransactionManagement; /** * @author Stephane Nicoll */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = ReproTests.Config.class) public class ReproTests { @Rule public final ExpectedException thrown = ExpectedException.none(); @Autowired private MemberService memberService; @Test public void duplicateKey() { Member member = new Member(); member.setId("duplicateId"); member.setName("foo bar"); member.setEmail("info@bar.com"); memberService.create(member); thrown.expect(DuplicateKeyException.class); memberService.create(member); } @Configuration @ComponentScan(basePackages = "org.springframework.issues.spr11669.domain") @EnableTransactionManagement @EnableJpaRepositories(basePackages = "org.springframework.issues.spr11669.domain.repository") public static class Config { @Bean(destroyMethod = "close") public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName("org.h2.Driver"); dataSource.setUrl("jdbc:h2:mem:SPR-11669;DB_CLOSE_DELAY=-1;"); dataSource.setDefaultAutoCommit(false); return dataSource; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setDataSource(dataSource()); factory.setPackagesToScan("org.springframework.issues.spr11669.domain.model"); factory.setJpaVendorAdapter(jpaVendorAdapter()); factory.setJpaProperties(jpaProperties()); return factory; } @Bean public JpaTransactionManager transactionManager() { return new JpaTransactionManager(entityManagerFactory().getObject()); } @Bean public DataSourceInitializer dataSourceInitializer() { DataSourceInitializer initializer = new DataSourceInitializer(); initializer.setDataSource(dataSource()); ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); databasePopulator.setContinueOnError(true); databasePopulator.addScript(new ClassPathResource("database/ddl.sql")); databasePopulator.addScript(new ClassPathResource("database/dml.sql")); initializer.setDatabasePopulator(databasePopulator); return initializer; } private JpaVendorAdapter jpaVendorAdapter() { HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); jpaVendorAdapter.setShowSql(false); jpaVendorAdapter.setDatabase(Database.H2); return jpaVendorAdapter; } private Properties jpaProperties() { Properties p = new Properties(); p.put("hibernate.hbm2ddl.auto", "none"); p.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy"); p.put("hibernate.connection.charSet", "UTF-8"); p.put("hibernate.show_sql", "false"); p.put("hibernate.format_sql", "false"); p.put("hibernate.use_sql_comments", "true"); p.put("hibernate.jdbc.batch_size", "30"); p.put("hibernate.jdbc.fetch_size", "100"); return p; } } }