공부기록

MySQL5Dialect와 MySQL 스토리지 엔진 본문

JPA

MySQL5Dialect와 MySQL 스토리지 엔진

gracelove91 2020. 8. 4. 05:41
반응형

org.hibernate.dialect.MySQL5Dialect

application-test.yml

spring:
  jpa:
    open-in-view: false
    hibernate:
      ddl-auto: create
    database-platform: org.hibernate.dialect.MySQL5Dialect

상황 :

지금까지 작성한 테스트를 모두 한 번에 실행할 때
Caused by: javax.persistence.NonUniqueResultException: query did not return a unique result: 2
같은 에러가 뜬다.

문제점 :

테스트 클래스 위에 @Transactinal 을 붙여서 테스트가 끝난 뒤 Rollback되기를 기대했지만 되지 않아서 NonUniqueResultException 같은 에러가 났다. 확인해보니 org.hibernate.dialect.MySQL5DialectMySQLDialect 를 상속받는데, 이 클래스는 hibernate.dialect.storage_engine 환경 설정이 null 이라면 getDefaultMySQLStorageEngine()으로 MySQLStorageEngine 필드에 값을 넣어준다. MySQL5Dialect 은 다음과 같다.

MySQL5Dialect.java

...
/**
     * Constructs a MySQLDialect
     */
    public MySQLDialect() {
        super();

        String storageEngine = Environment.getProperties().getProperty( Environment.STORAGE_ENGINE );
        if ( storageEngine == null ) {
            this.storageEngine = getDefaultMySQLStorageEngine();
        }
...

protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
        return MyISAMStorageEngine.INSTANCE;
    }

MyISAMStorageEngine 을 쓴다!!!!!!!!!

Table 들이 MyISAM엔진으로 설정된 것을 볼 수 있다. MyISAMTransaction을 지원하지 않는다!
참고 : https://gracelove91.tistory.com/102

따라서 Rollback이 되지 않기 때문에 NonUniqueResultException 같은 에러가 난 것이다.

해결 :

  1. hibernate.dialect.storage_engine 를 설정해준다
  2. getDefaultMySQLStorageEngine()InnoDBdialect를 쓴다.

나는 2번으로 해결했다.

application-test.yml

spring:
  jpa:
    open-in-view: false
    hibernate:
      ddl-auto: create
    database-platform: org.hibernate.dialect.MySQL57Dialect
  • MySQL57DialectMySQL55Dialect 를 상속받는다.

MySQL55Dialect

public class MySQL55Dialect extends MySQL5Dialect {

    @Override
    protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
        return InnoDBStorageEngine.INSTANCE;
    }
}
  • InnoDBStorageEngine 이 기본 디폴트 스토리지 엔진임을 볼 수 있다.
반응형

'JPA' 카테고리의 다른 글

[JPA]open-session-in-view 를 알아보자  (1) 2020.07.01
@EntityGraph  (0) 2020.02.11
순수 JPA레포지토리의 페이징과 스프링 데이터 JPA레포지토리의 페이징.  (0) 2020.02.10
연관관계의 주인  (0) 2020.01.27
준영속 상태  (0) 2020.01.16