반응형
@Query(value = "INSERT INTO board (BOARD_SEQ, TITLE, CONTENT, BOARD_CTGR, BOARD_STATUS, MEMBER_ID)
VALUES ((SELECT max(BOARD_SEQ)+1 FROM board), :title, :content, :boardCtgr, :boardStatus, :memberId)",
nativeQuery = true)
Board insertBoard(Board board);
보통은 save로 사용하지만 Query를 이용해 Insert를 해보고 싶었다.
하지만 Entity에서 요소를 못가져온다.
확인하다보니
1. @Query 내에서 직접 INSERT 문을 실행하는 것은 지원되지 않을 수 있음, 대신 JdbcTemplate 같은 다른 방법을 사용하는 것을 고려해야 할 가능성 존재
2. Board insertBoard(Board board); 메소드 시그니처는 save()와 유사한 작업을 위해 설계되었으며, 이 경우에는 파라미터로 전달된 board 객체에서 값을 추출하여 쿼리의 파라미터로 사용하는 방식으로 작성되어야 함
라고 한다.
복세편살 그냥 save메서드를 사용하자
+ ) save를 사용하는데 기존에 데이터가 있어 auto increase가 되지 않는다면??
primary key 위반으로 인해 에러가 발생한다
Entity에서 @GeneratedValue(strategy = GenerationType.IDENTITY)로 선언되어 있음에도 auto_increase가 적용되지 않는다.
Sol1) 초기 적재하는 .sql파일에 ID값을 지움
Sol 2) 테스트 DB와 앱 DB 맞추기
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
추가
Sol 3) H2 DB에 Compatibility 적용
# application.yaml
spring:
config.activate.on-profile: testdb # 프로파일 이름 등록
datasource:
url: jdbc:h2:mem:board;mode=mysql # 핵심!
driver-class-name: org.h2.Driver
@ActiveProfiles("testdb") # testdb라는 이름을 가진 프로파일을 적용
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@DataJpaTest
class JpaRepositoryTest {
...
}
++ ) 모든 테스트에 "testdb" 프로파일을 적용(yml)
spring:
config.activate.on-profile: testdb
datasource:
url: jdbc:h2:mem:board;mode=mysql
driver-class-name: org.h2.Driver
test.database.replace: none # 추가!!
반응형
'Backend > Spring | SpringBoot' 카테고리의 다른 글
[REST API] @Controller / @RestController (0) | 2024.03.05 |
---|---|
[JPA] insert...ing (0) | 2024.03.04 |
[JPA] JPA, JPQL, NativeQuery 비교 (0) | 2024.02.22 |
[Spring] H2 및 JPA Properties적용 (0) | 2024.02.22 |
[Error Log] PropertyReferenceException, NoSuchBeanDefinitionException, UnsatisfiedDependencyException (0) | 2024.02.21 |