사용자 도구

사이트 도구


springframework:springboot:jpa

Spring Boot And JPA

Open Entity Manager In View / Open Session In View (OSIV) 끄기

  • OSIV는 항상 끄자.
spring.jpa.open-in-view: false
  • spring.jpa.open-in-view=falseJpaProperties 선언을 전혀 다르게 myapp.jpa 로 했더라도, 무조건 spring.jpa.open-in-view로 해야한다.
// SpringBoot 2.1 의 org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.JpaWebConfiguration 참조.
 
@ConditionalOnProperty(prefix = "spring.jpa", name = "open-in-view", havingValue = "true", matchIfMissing = true)
protected static class JpaWebConfiguration {

별도 설정하기

// 최상단에
@EnableConfigurationProperties
@EnableJpaRepositories(basePackageClasses = MyRepository.class,
        entityManagerFactoryRef = "entityManagerFactory",
        transactionManagerRef = "transactionManager")
 
... 
@Bean
@ConfigurationProperties(prefix = "my.datasource")
public DataSource dataSource() {
    return DataSourceBuilder.create()
            .type(org.apache.tomcat.jdbc.pool.DataSource.class) // Tomcat Pool 사용시
            .build();
}
 
@Bean
@ConfigurationProperties(prefix = "my.jpa")
public JpaProperties jpaProperties() {
    return new JpaProperties();
}
 
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    Map<String, String> hibernateProperties = jpaProperties().getHibernateProperties(dataSource());
 
    return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), hibernateProperties, null)
            .dataSource(dataSource)
            .persistenceUnit("mypersistenceunit")
            .packages(EntityClasses.class) // entity class들의 위치
            .build();
}
my:
  jpa:
    database-platform: MYSQL
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL57InnoDBDialect
        default_batch_fetch_size: 16
        id.new_generator_mappings: true
        format_sql: true
        show_sql: false
        use_sql_comments: true
        hbm2ddl.auto: update

Naming Strategy

  • 현재 Spring boot 버전에 @Column(name="")이 안먹는 버그가 존재하는 것으로 보임.
  • 그 외에 버그가 해결된 버전에서도 기본적으로 Spring 자체의 Naming Strategy를 사용하는데 이게 자동으로 이름을 변환해버리다 보니 의도에 맞지 않게 작동할 수 있음. 차라리 Hibernate 기본을 사용하고 항상 Table, Column 이름을 명시해주는게 편하다.
  • 해결책은 naming strategy를 직접 지정해 줄 것
    // Hibernate 4
    spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
    // or
    spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy
    
    // Hibernate 5
    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
springframework/springboot/jpa.txt · 마지막으로 수정됨: 2021/08/04 14:42 저자 kwon37xi