jscherman
jscherman

Reputation: 6189

how can i load jpa properties to datasource in Spring?

I am using Spring boot Data JPA and right now, i have this:

@Configuration
@PropertySource("classpath:persistence.properties")
@EnableTransactionManagement
public class PersistenceConfiguration {

    @Autowired
    private Environment env;

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
        LocalContainerEntityManagerFactoryBean entityManager = new LocalContainerEntityManagerFactoryBean();
        entityManager.setDataSource(this.dataSource());
        entityManager.setPackagesToScan(new String[] {"com.example.movies.domain"});
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        entityManager.setJpaVendorAdapter(vendorAdapter);
        entityManager.setJpaProperties(this.properties());
        return entityManager;
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    private Properties properties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.ddl-auto", this.env.getProperty("spring.jpa.hibernate.ddl-auto"));
        properties.setProperty("hibernate.dialect", this.env.getProperty("spring.jpa.hibernate.dialect"));
        properties.setProperty("hibernate.show_sql", this.env.getProperty("spring.jpa.show-sql"));
        return properties;

    }

}

And my persistence.properties

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/sarasa_db
spring.datasource.username=root
spring.datasource.password=myPassword

spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql=false

What i would to know is if there exists any way to load these JpaProperties automatically. I want that spring build it because right now, if i add new jpa property in persistence.properties, then it wouldn't be noticed that change until i put that property in Properties object. So, do you know if is that possible? Regards!

Upvotes: 10

Views: 24041

Answers (1)

K. Siva Prasad Reddy
K. Siva Prasad Reddy

Reputation: 12405

As M. Denium suggested you don't have to configure all these beans by yourself, SpringBoot will do that for you if you configure properties in application.properties.

And if you want to have separate datasource/jpa properties for testing then use environment profiles. You can create application-dev.properties, application-uat.properties, application-prod.properties to configure respective environment settings and activate the desired profile.

Take a look at the SpringBoot supported properties list at http://docs.spring.io/spring-boot/docs/1.2.3.RELEASE/reference/htmlsingle/#common-application-properties

You can configure JPA properties as follows:

JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration)

spring.jpa.properties.*= # properties to set on the JPA connection
spring.jpa.open-in-view=true
spring.jpa.show-sql=true
spring.jpa.database-platform=
spring.jpa.database=
spring.jpa.generate-ddl=false # ignored by Hibernate, might be useful for other vendors
spring.jpa.hibernate.naming-strategy= # naming classname
spring.jpa.hibernate.ddl-auto= # defaults to create-drop for embedded dbs
spring.data.jpa.repositories.enabled=true # if spring data repository support is enabled

If you follow this naming convention you don't have to configure beans yourself.

Upvotes: 7

Related Questions