https://github.com/code-chobo/dev-api 프로젝트를 진행하며 쓰는 회고입니다.
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.MySQL5Dialect
는 MySQLDialect
를 상속받는데, 이 클래스는 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
엔진으로 설정된 것을 볼 수 있다. MyISAM
은 Transaction
을 지원하지 않는다!
참고 : https://gracelove91.tistory.com/102
따라서 Rollback
이 되지 않기 때문에 NonUniqueResultException
같은 에러가 난 것이다.
해결 :
hibernate.dialect.storage_engine
를 설정해준다getDefaultMySQLStorageEngine()
이InnoDB
인dialect
를 쓴다.
나는 2번으로 해결했다.
application-test.yml
spring:
jpa:
open-in-view: false
hibernate:
ddl-auto: create
database-platform: org.hibernate.dialect.MySQL57Dialect
MySQL57Dialect
는MySQL55Dialect
를 상속받는다.
MySQL55Dialect
public class MySQL55Dialect extends MySQL5Dialect {
@Override
protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
return InnoDBStorageEngine.INSTANCE;
}
}
InnoDBStorageEngine
이 기본 디폴트 스토리지 엔진임을 볼 수 있다.
'회고 > 코드초보 플랫폼 독립 프로젝트' 카테고리의 다른 글
[회고] Security가 관련되어 있는 테스트 시 WithSecurityContextFactory 활용. (0) | 2020.08.08 |
---|---|
[회고]@DataJpaTest는 임베디드 디비를 쓴다 (1) | 2020.08.04 |