JPA에서 테이블과 객체를 매핑하기 위해 @Entity 어노테이션을 사용해서 객체 <-> 테이블 간의 매핑을 해준다.
하지만 아무 클래스에나 @Entity를 붙인다고 해서 다 동작하는 것은 아니다.
- 기본 생성자 필수
- finalClass 사용 불가
- InnerClass 사용 불가 (static InnerClass는 허용)
- Interface, Enum 사용 불가
- 필드 중복 없이 명확한 primary key (@Id) 선언 필요
JPA는 객체를 생성할 때 리플렉션 + 기본생성자를 사용한다.
또한, 지연로딩(Lazy Loading) 시 프록시 객체를 생성하기 위해 엔티티를 상속받는다.
@Entity는 평범한 클래스여야 하며,
기본생성자 + non-final + 독립적인 클래스로 만들어야 한다.
내부적으로 프록시객체를 쓰거나 리플렉션으로 객체를 생성하기 때문에 위 조건들이 필요하다.
PK를 직접 할당하지 않고, JPA가 할당하도록 할 수 있다.
- AUTO
-> DB 방언에 따라 자동 선택 (보통 SEQUENCE or IDENTITY) 기본값- IDENTITY
-> DB의 auto_increment 컬럼 사용 (MySQL 등) insert 후 PK 값 결정됨- SEQUENCE
-> DB 시퀀스 객체 사용 (Oracle, PostgreSQL 등) 성능 좋음, 미리 값 예약 가능- TABLE
-> 별도 키 생성 테이블에서 PK 관리 유연하지만 성능 느림