๋ฒํฌ ์ฐ์ฐ
ํ๋์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์์ ํ๊ฑฐ๋ ์ญ์ ํ๋ ์ฐ์ฐ์ ์๋ฏธํฉ๋๋ค.
์์ JPA๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ executeUpdate()๋ฅผ ํตํด ๋ฒํฌ ์ฐ์ฐ์ ์ํํ ์ ์์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ชจ๋ ํ์์ ๋์ด๋ฅผ 1์ฉ ์ฆ๊ฐ์ํค๋ ์ฟผ๋ฆฌ๋ฅผ ์์ JPA๋ก ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
int resultCount =
em.createQuery("update Member m set m.age = m.age").executeUpdate()
Spring Data JPA์์์ ๋ฒํฌ ์ฐ์ฐ
@Modifying์ ์ฌ์ฉํฉ๋๋ค.
public interface MemberRepository extends JpaRepository<Member, Long> {
@Modifying
@Query("update Member m set m.age = m.age + 1")
int bulkAgePlus();
}
@Modifying์ด ์๋ค๋ฉด ์๋ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
- org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations
์ฃผ์ ์ฌํญ
๋ฒํฌ ์ฐ์ฐ์์๋ ์์์ฑ ์ปจํ ์คํธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง์ถฐ์ฃผ๊ธฐ ์ํด์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ด๊ธฐํ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
int resultCount = memberRepository.bulkAgePlus();
em.flush();
em.clear();
๋ฒํฌ ์ฐ์ฐ์ ๊ฒฐ๊ตญ์ JPQL์ ์ฌ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, bulkAgePlus๋ฅผ ์คํ์ํค๋ ์๊ฐ ์ฐ์ ์ง๊ธ๊น์ง ์์์ฑ ์ปจํ ์คํธ์ ๋ด๊ธด ๋ณ๊ฒฝ์ฌํญ๋ค์ DB์ flush ํ ํ ์ํํฉ๋๋ค. (FlushModeType์ด Auto์ธ ๊ฒฝ์ฐ)
๋ฐ๋ผ์ ์ฌ์ค ์ ์์ em.flush๋ ์์ด๋ ๋ฌด๊ดํฉ๋๋ค.
int resultCount = memberRepository.bulkAgePlus(20);
em.clear();
Modifying์ ์ต์ - clearAutomatically
๋ฐ๋ก ์์์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ด๊ธฐํ ํด์ฃผ๊ธฐ ์ํด clear()๋ฅผ ํด์ฃผ์๋๋ฐ, ์ด๋ @Modifying์ ์ต์ ์ ๋ฐ๊พธ๋ ๊ฒ๋ง์ผ๋ก๋ ํด๊ฒฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
@Modifying(clearAutomatically = true)
์ฐธ๊ณ - flushAutomatically ์ต์ ์ ๋ํด
Reference
'๐๏ธ Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Data JPA] ์ฝ๊ธฐ ์ ์ฉ ์ฟผ๋ฆฌ ๋ง๋ค๊ธฐ (JPA Hint) (0) | 2022.07.28 |
---|---|
[Spring Data JPA] @EntityGraph (0) | 2022.07.28 |
[JPA] ํ์ด์ง ์ ๋ฆฌ (JPA, Data JPA, QueryDSL) (1) | 2022.07.28 |
[Spring Data JPA] - ๋ฐํ ํ์ ์ ์ข ๋ฅ (0) | 2022.07.28 |
[Spring Data JPA] - ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ (0) | 2022.07.28 |