728x90
⭐벌크 연산
- UPDATE, DELETE를 실행할 때, 쿼리 한 번으로 여러 테이블 로우를 변경하는 것
- 하이버네이트에서 INSERT를 지원함.
100명의 Member의 나이를 일괄적으로 변경한다고 해보자.
두 가지 방법으로 엔티티의 속성을 변경할 수 있다.
1. (벌크 연산X) - JPA 변경 감지 기능으로 엔티티 속성 변경
String jpql = "SELECT m FROM Member m";
List<Member> members = em.createQuery(jpql, Member.class).getResultList();
// 2. 엔티티 속성 변경
for (Member member : members) {
member.setAge(20);
}
이 경우, 멤버가 100명이면 100번의 UPDATE 쿼리가 실행된다.
비효율적이다.
2. JPQL 벌크 연산을 통한 일괄 업데이트
String updateJpql = "UPDATE Member m SET m.age = 20";
int updatedCount = em.createQuery(updateJpql).executeUpdate();
*exeuteUpdate()를 사용한다.
- 이 경우, 멤버가 100명이어도 한 번의 UPDATE 쿼리로 모든 멤버의 나이를 업데이트 할 수 있다.
3. 주의할 점
벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리를 날린다.
예를 들면, 영속성 컨텍스트에는 값이 '0'인데 DB에는 값이 '20'일 수 있다.
영속성 컨텍스트와 데이터베이스 간의 일관성을 유지하도록 주의해야한다.
일관성을 관리하는 두 가지 방법이 있다.
1) 영속성 컨텍스트에 엔티티를 올리기 전에 벌크 연산을 먼저 수행한다.
// 트랜잭션 시작
em.getTransaction().begin();
// 1. JPQL을 사용하여 한 번의 쿼리로 일괄 업데이트
String updateJpql = "UPDATE Member m SET m.age = 20 WHERE m.age < 20";
int updatedCount = em.createQuery(updateJpql).executeUpdate();
System.out.println("Updated " + updatedCount + " members.");
// 2. 엔티티를 영속성 컨텍스트에 올리기
Member newMember = new Member();
newMember.setName("John Doe");
newMember.setAge(25);
em.persist(newMember);
// 3. 트랜잭션 커밋
em.getTransaction().commit();
2) 벌크 연산 후 영속성 컨텍스트를 초기화하고 엔티티를 다시 불러온다.
// 트랜잭션 시작
em.getTransaction().begin();
// 1. JPQL을 사용하여 한 번의 쿼리로 일괄 업데이트
String updateJpql = "UPDATE Member m SET m.age = 20 WHERE m.age < 20";
int updatedCount = em.createQuery(updateJpql).executeUpdate();
System.out.println("Updated " + updatedCount + " members.");
// 2. 영속성 컨텍스트 초기화
em.clear();
// 3. 데이터베이스에서 엔티티를 다시 불러오기
Member member = em.find(Member.class, 1L); // 예를 들어 ID가 1인 멤버를 다시 불러옴
System.out.println("Member age: " + member.getAge());
// 트랜잭션 커밋
em.getTransaction().commit();
![](https://t1.daumcdn.net/keditor/emoticon/niniz/large/001.gif)
자바 ORM 표준 JPA 프로그래밍 - 기본편 완강!
728x90
'인프런 김영한 강의 정리 > 자바 ORM 표준 JPA 프로그래밍 기본편' 카테고리의 다른 글
JPA 기본 | JPQL 중급 문법(2) - 페치 조인(fetch) (0) | 2024.07.19 |
---|---|
JPA 기본 | JPQL 중급 문법(1) - 경로 표현식 (0) | 2024.07.18 |
JPA 기본 | JPQL 문법(6) - 기본 함수 (0) | 2024.07.17 |
JPA 기본 | JPQL 문법(5) - 조건식 (0) | 2024.07.17 |
JPA 기본 | JPQL 문법(4) - ENUM 타입,상속관계 엔티티 표현 (0) | 2024.07.17 |