@Synchronize
🔄 @Synchronize
정의
@Synchronize는 Hibernate에서 엔티티 조회 시 동기화 대상 테이블을 지정하는 애너테이션이다. 특히@Subselect처럼 실제 테이블이 아닌 조회 쿼리로 매핑된 엔티티에서 자주 사용한다.
쿼리 결과가 참조하는 테이블이 변경되었을 때 Hibernate가 언제 플러시하고 어떤 테이블을 기준으로 동기화할지를 명확히 하고 싶을 때 사용한다.
🧩 역할
- 동기화 대상 테이블을 지정한다
- 조회 시점의 데이터 정합성을 높인다
@Subselect같은 읽기 전용 매핑과 함께 사용된다- 영속성 컨텍스트와 DB 상태 차이를 줄이는 데 도움을 준다
🛠 사용법
엔티티에 적용
import org.hibernate.annotations.Synchronize;
import javax.persistence.*;
@Entity
@Synchronize({"user", "orders"})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String status;
}
@Subselect와 함께 사용하는 예시
import org.hibernate.annotations.Immutable;
import org.hibernate.annotations.Subselect;
import org.hibernate.annotations.Synchronize;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@Immutable
@Subselect(
"SELECT e.id AS id, e.name AS name, COUNT(o.id) AS order_count " +
"FROM employee e " +
"LEFT JOIN orders o ON e.id = o.employee_id " +
"GROUP BY e.id, e.name"
)
@Synchronize({"employee", "orders"})
public class EmployeeOrderSummary {
@Id
private Long id;
private String name;
private Long orderCount;
}
⚠️ 주의사항
@Synchronize는 JPA 표준이 아니라 Hibernate 전용 기능이다.- 주로
@Subselect와 함께 사용한다. - 네이티브 쿼리 자체를 대체하는 기능은 아니다.
- 동기화 대상 테이블 이름을 실제 스키마와 맞게 작성해야 한다.
📌 정리
@Synchronize는 Hibernate에서 동기화 대상 테이블을 지정하는 애너테이션이다.@Subselect처럼 조회 기반 매핑과 함께 사용할 때 유용하다.- 읽기 전용 매핑의 정합성을 높이는 보조 설정으로 이해하면 좋다.
댓글남기기