🔄 @Synchronize

정의

@SynchronizeHibernate에서 엔티티 조회 시 동기화 대상 테이블을 지정하는 애너테이션이다. 특히 @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처럼 조회 기반 매핑과 함께 사용할 때 유용하다.
  • 읽기 전용 매핑의 정합성을 높이는 보조 설정으로 이해하면 좋다.

연결문서

댓글남기기