밤과라임
3k
2019-08-14 13:24:35
6
201

jpa hibernate.ddl-auto create옵션 적용 질문입니다.


데이터가 들어있는 기존 테이블을 저장된 csv파일을 불러와 새로 갱신하고자 하는데

드랍하고 새로 인서트하는게 빠를 것 같아

  옵션을 create  로 하였습니다.

그런데 이렇게 하면 drop 후 create한다는 설명과는 다르게

테이블은 삭제가 되어있지 않고

인서트가 되었어도

Hibernate: select 컬럼 from table where id = ?

와 같이 검색을 하고있습니다.

없는데이터만 새로 인서트 하는 것 같아 

create 옵션 적용이 잘 안되고 있는 것 같은데

jpa 사용시 기존 테이블 드랍하고 새로 생성하여 데이터를 넣으려면

어떻게 하면 될까요?



application.yaml 사용중이고 다음과 같이 설정했습니다.

jpa:
hibernate:
ddl-auto: create
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
generate-ddl: true
show-sql: true
database: mysql
open-in-view: false

0
0
  • 답변 6

  • &
    117
    2019-08-14 13:38:05
    0
  • 밤과라임
    3k
    2019-08-14 15:13:48 작성 2019-08-14 15:21:41 수정됨

    @&

    기존 1000개가 들어있는 테이블을 설정한 엔티티가 있는 

    프로젝트를 실행시켜

    데이터 5개를 넣었다면

    기존 테이블이 드랍되고 새로 추가된거라면 5개가 남아있어야 하는데

    1000개 유지되고 있습니다.

    기존 데이터와 같은 값 5개를 저장하는 메소드를 호출하면

    아이디를 체크하여 있는것은 넘어가고

    없는것은 인서트 되더군요.

    또한 문제는 다른컬럼 값들이 변경되어도 아이디가 일치하면 업데이트가 이뤄집니다.


    0
  • &
    117
    2019-08-14 17:57:51

    저 옵션으로 application 을 시작하면 drop / create 쿼리가 실행될텐데요...

    혹시 application 시작하면서 찍히는 query log 를 보셨나요?

    0
  • 밤과라임
    3k
    2019-08-14 18:14:52

    @&

    네 없는 테이블 생성때보니

    157 org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect

    -Hibernate: create table

    는 뜨는걸로보아

    EntityManagerFactory 쪽이 의심스럽긴 합니다.

    db 동시접속을 위해

    아래와 같은 형식 config를 두개 생성했습니다.

    여기에 잘못된게 있을까요??

    import com.zaxxer.hikari.HikariDataSource;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    import org.springframework.orm.jpa.JpaTransactionManager;
    import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;

    import javax.persistence.EntityManagerFactory;
    import javax.sql.DataSource;

    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
    basePackages = "com.example.persistence",
    entityManagerFactoryRef = "devEntityManagerFactory",
    transactionManagerRef = "devTransactionManager"
    )
    public class DevConfig {

    @Primary
    @Bean(name = "devDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.hikari.dev-api")
    public DataSource devDataSource() {
    return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Primary
    @Bean(name = "devEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean devEntityManagerFactory(
    EntityManagerFactoryBuilder builder, @Qualifier("devDataSource") DataSource dataSource) {
    return builder
    .dataSource(dataSource)
    .packages("com.example.domain.entity")
    .persistenceUnit("dev-api")
    .build();
    }

    @Primary
    @Bean(name = "devTransactionManager")
    public PlatformTransactionManager devTransactionManager(
    @Qualifier("devEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
    return new JpaTransactionManager (entityManagerFactory);
    }
    }
    0
  • &
    117
    2019-08-19 09:36:49
    0
  • 밤과라임
    3k
    2019-08-19 10:57:57

    @&

    답변감사합니다. 저런 방법도 있군요.

    저는 검색을 더 하다가

    아래와 같이 hbm2ddl 설정하여 해결하였습니다.


    jpa:
    properties:
    hibernate:
    dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    hbm2ddl:
    auto: create
    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.