Database/JPA
[JPA] 연관 관계
Garonguri
2022. 7. 14. 15:04
728x90
@Entity : 데이터베이스의 테이블과 1:1로 매칭되는 객체 단위
위 annotation이 붙은 class는 JPA가 관리한다.
Entity 객체의 인스턴스 하나가 테이블에서 하나의 레코드 값을 의미한다.
따라서 객체의 인스턴스를 구번하기 위한 유일한 키 값을 가진다.
이는 테이블의 PK와 같은 의미를 하며 @ID annotation을 사용해 표기한다.
주의 사항
* 명시적으로 @Table의 name속성을 이용해 실제 테이블 명칭을 지정하지 않을 시 EntityClass 이름 그대로 CamelCase를 유지한 채 테이블이 생성된다. 따라서 테이블 이름을 명시적으로 작성하는 것이 관례이다.
* 기본 생성자는 필수
*enum, Interface, final/inner 클래스에는 사용할 수 없다.
@Entity
@Table(name = "ORDERS")
public class Order {
@Temporal : 날짜 타입을 매핑할 때 사용. LocalDate, LocalDateTime을 사용할 때는 생략이 가능하다.
private LocalDateTime orderDate;
@Column : 데이터베이스의 테이블에 있는 컬럼과 동일하게 1:1로 매칭된다.
주의 사항
* 별다른 옵션을 설정하지 않은 경우 생략 가능하다.
* Entity와 같이 name속성을 명시하지 않을 경우 Entity에 정의된 컬럼 변수 이름으로 생성된다. 따라서 카멜케이스로 작성된 컬럼 변수가 있다면 UnderScore형식으로 name을 명시적으로 작성해준다.
@Id
@GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
@Id : PK를 지정하는 annotation
테이블의 pk를 의미한다.
Entity class 상에 명시적으로 PK를 표시해주는 역할을 하는 어노테이션이다.
@Id
@GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
@GeneratedValue : AutoIncrement에서 사용
MySQL에서는 숫자형의 PK컬럼 속성을 auto increment로 자동 지정하면 새로운 레코드가 생성될 때마다 자동으로 마지막 pk값에서 +1을 해주는 방식을 의미한다.
이를 위해 @GeneratedValue annotation의 strategy 속성을 GenerationType.IDENTITY로 지정해 auto increment 컬럼인 것을 EntityManager에게 알려준다.
@Id
@GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
@EmbeddedId : 복합 키 정의할 때 사용
복합 키는 두개의 PK, 즉 두 개의 @ID로 구성이 된다. 이를 직접 Entity에 정의하는 것이 아니라 별도로 정의해준다.
순서
1. Value를 생성하고, @Embeddable annotation을 이용해 이 value가 entity에 삽입이 가능하다는 것을 명시한다.
2. Entity에서는 @EmbeddedId annotation을 이용해 이 entity에 해당 Value를 PK로 사용한다고 지정한다.
@Enumerated : Java Enum Type을 매핑할 때 사용한다.
enum 형태로 되어있는 값을 데이터 타입으로 사용하고싶을 때 사용한다.
주의 사항
* EnumType.ORDINAL, EnumType.STRING 두 가지 타입이 있는데, ORDINAL Type을 사용하게 되면 enum type의 순서가 달라질 경우 사이드 이펙트가 발생함로 되도록 사용하지 말아라.
@Enumerated(EnumType.STRING)
private OrderStatus status;
728x90