JPA에서는 @Entity, @Table, @Id, @GeneratedValue, @Column, @Temporal, @Transient 등의 어노테이션을 사용하여 테이블을 매핑한다.
@Entity: 객체를 테이블과 매핑할 때 사용. 이 어노테이션을 사용한 클래스는 JPA가 관리하는 것으로, '엔티티'라고 부른다.
@Table: 엔티티가 매핑될 테이블 정보를 명시한다. 테이블의 이름은 SQL에서 사용되며, @Entity의 이름이 기본값으로 설정된다.
@Id: 엔티티의 주키를 맵핑할 때 사용한다. 모든 엔티티는 주키를 가져야한다.
@GeneratedValue: 주키의 생성 방법을 명시한다. 주키 생성 전략과 생성기를 설정할 수 있다.
@Column: 필드를 컬럼과 매핑할 때 사용한다. unique, nullable, length 등의 속성을 설정할 수 있다.
@Temporal: 날짜 타입을 매핑할 때 사용한다. JPA 2.1까지는 Date와 Calendar만 지원한다.
@Transient: 이 어노테이션이 붙은 필드는 매핑을 무시한다. 따라서 DB에 저장하지 않는다.
아래는 이를 사용한 예시 코드이다.
@Entity(name = "parent")
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany
@JoinTable(
name = "parent_child",
joinColumns = @JoinColumn(name = "parent_id"),
inverseJoinColumns = @JoinColumn(name = "child_id")
)
private List<Child> childList;
}
JPA에서는 @Column, @Enumerated, @Embeddable, @Embedded, @AttributeOverrides, @AttributeOverride 등의 어노테이션을 사용하여 필드 타입을 매핑한다.
@Column: 필드를 컬럼과 매핑할 때 사용한다. String, Date, Boolean 등의 타입들에 공통으로 사이즈를 제한하는 용도로 쓰인다.
@Enumerated: Enum 타입을 매핑할 때 사용한다. 실무에서는 @Enumerated(EnumType.STRING)으로 사용하는 것을 권장한다.
@Embeddable과 @Embedded: 임베디드 타입을 만들고 사용할 때 사용한다. 임베디드 타입은 여러 엔티티에서 공통으로 사용하는 복합적인 값 타입을 재사용할 수 있게 해준다.
@AttributeOverrides와 @AttributeOverride: 임베디드 타입에 정의한 매핑정보를 재정의할 때 사용한다.
아래는 이를 사용한 예시 코드이다.
@Entity
public class Account {
@Id @GeneratedValue
private Long id;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "street", column = @Column(name = "home_street"))
})
private Address address;
}
@Embeddable
public class Address {
private String street;
private String city;
private String state;
private String zipCode;
}