JpaMetamodelEntityInformation

JpaMetamodelEntityInformation은 JPA Metamodel을 사용해서 Entity 정보를 추출하는 기본 구현체입니다.

JPA Metamodel이란?

JPA가 Entity 클래스를 분석해서 만들어놓은 메타데이터 모델입니다.

@Entity
public class Member {
    @Id
    private Long id;

    @Version
    private Long version;

    private String name;
}

이 Entity를 JPA가 분석하면:

이런 정보들을 Metamodel로 보관합니다.

JpaMetamodelEntityInformation의 역할

Metamodel에서 정보를 꺼내와서 EntityInformation 인터페이스를 구현합니다.

public class JpaMetamodelEntityInformation<T, ID>
        extends AbstractEntityInformation<T, ID>
        implements JpaEntityInformation<T, ID> {

    private final IdMetadata<T> idMetadata;           // @Id 정보
    private final Optional<SingularAttribute<? super T, ?>> versionAttribute;  // @Version 정보

    @Override
    public boolean isNew(T entity) {
        // 1) @Version 필드가 없거나 primitive면 → 부모 클래스(ID 기반)로 위임
        if (versionAttribute.isEmpty()
              || versionAttribute.map(Attribute::getJavaType)
                                 .map(Class::isPrimitive).orElse(false)) {
            return super.isNew(entity);
        }

        // 2) @Version 필드가 Wrapper 타입이면 → null 여부로 판단
        BeanWrapper wrapper = new DirectFieldAccessFallbackBeanWrapper(entity);
        return versionAttribute
                .map(it -> wrapper.getPropertyValue(it.getName()) == null)
                .orElse(true);
    }

    @Override
    public ID getId(T entity) {
        // Metamodel에서 @Id 필드 정보를 가져와서 값 추출
        // ...
    }
}

동작 흐름

Entity 클래스 로딩
       ↓
JPA Metamodel 생성 (Entity 분석)
       ↓
JpaMetamodelEntityInformation 생성 (Metamodel 활용)
       ↓
SimpleJpaRepository에서 사용

요약

항목설명
역할JPA Metamodel 기반으로 Entity 정보 제공
사용 시점Entity가 Persistable을 구현하지 않은 경우 (기본)
isNew() 판단@Version → @Id 순서로 확인
정보 출처JPA Metamodel (런타임에 Entity 분석 결과)

즉, JPA가 Entity를 분석한 결과(Metamodel)를 활용해서 Spring Data JPA가 필요한 정보를 제공하는 클래스입니다.

CSLOG에서 보기