Skip to content

Instantly share code, notes, and snippets.

@gclaussn
Last active September 7, 2018 12:36
Show Gist options
  • Save gclaussn/05f76bd11e5e126bb65510103c5c2984 to your computer and use it in GitHub Desktop.
Save gclaussn/05f76bd11e5e126bb65510103c5c2984 to your computer and use it in GitHub Desktop.
Spring - Data JPA Persistence

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment