Add Maven dependency:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Persistence configuration for production:
@Configuration
@Profile("prd")
public class PersistenceConfiguration {
@Value("${db.driverClassName}")
protected String jdbcDriverClassName;
@Value("${db.url}")
protected String jdbcUrl;
@Value("${db.username}")
protected String username;
@Value("${db.password}")
protected String password;
protected Properties getJpaProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", MySQL57InnoDBDialect.class.getName());
properties.setProperty("hibernate.hbm2ddl.auto", "none");
return properties;
}
@Bean
@Primary
public DataSource dataSource() {
PoolProperties poolProperties = new PoolProperties();
poolProperties.setDriverClassName(jdbcDriverClassName);
poolProperties.setUrl(jdbcUrl);
poolProperties.setUsername(username);
poolProperties.setPassword(password);
poolProperties.setMaxActive(2);
poolProperties.setInitialSize(1);
poolProperties.setMaxWait(10000);
poolProperties.setMinIdle(1);
// https://stackoverflow.com/questions/23102747
poolProperties.setMaxAge(180000L);
poolProperties.setTestOnBorrow(true);
poolProperties.setTestWhileIdle(true);
poolProperties.setValidationQuery("SELECT 1");
poolProperties.setValidationQueryTimeout(3);
poolProperties.setValidationInterval(0L);
DataSource dataSource = new DataSource();
dataSource.setPoolProperties(poolProperties);
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(dataSource());
emf.setJpaProperties(getJpaProperties());
emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
// Default classpath location for all classes annotated with @Entity
emf.setPackagesToScan("org.example.service.persistence");
return emf;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
}
Use profiles to provide different implementations for "local" development by overwriting the JPA properties: If necessary overwrite the required pooling properties.
Simple persistence unit under META-INF:
@Configuration
@Profile("local")
public class PersistenceConfigurationLocal extends PersistenceConfiguration {
@Override
protected Properties getJpaProperties() {
Properties properties = super.getJpaProperties();
properties.setProperty("hibernate.dialect", H2Dialect.class.getName());
properties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
// Insert data for development
properties.setProperty("hibernate.hbm2ddl.import_files_sql_extractor", "org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor");
properties.setProperty("hibernate.hbm2ddl.import_files", Joiner.on(',').join(getSqlFiles()));
return properties;
}
}
Files to be imported must be prefixed with file:
e.g:
file:./src/test/resources/sql/1.sql
file:./config/sql-dev/2.sql