1. 객체 테이블 매핑: @Entity, @Table
2. 필드와 컬럼 매핑: @Coumn
3. 기본키 매핑: @Id
4. 연관관계 매핑: @ManyToOne, @JoinColum
@Entity가 붙은 클래스는 JPA가 관리하며 엔티티라고 한다. JPA를 사용해서 테이블과 매핑할 클래스의 경우 필수 어노테이션이다.
public 또는 protected 기본 생성자는 필수로 있어야 한다. final 클래스, interface,enum,inner 클래스를 사용할 수 없으며, 저장할 필드에 final을 사용할 수 없다.
@Entity(name="Member")
database-platform: org.hibernate.dialect.MySQL8Dialect
create
: 애플리케이션을 실행할 때, 기존에 있던 테이블들을 drop하고 새로 생성한다. (drop + create)create-drop
: 애플리케이션 시작할때 테이블 생성, 종료시점에 테이블을 drop → 테스트케이스 실행 시 주로 사용update
: 변경부분만 반영하여 alter문만 실행한다. 이미 생성된 테이블을 지우는 것은 불가능하고 추가한 부분만 반영된다. validate
: 엔티티와 테이블이 매핑이 잘 되었는지 확인하며 매핑 안되어있으면 에러가 발생한다. none
: 자동 생성을 사용하지 않는다. *주의 : 운영장비에는 절대 create,create-drop,update 속성을 사용하지 않는 것이 좋다.
update의 경우 alter문 실행 시 데이터베이스 락이 걸릴 수 있다.
@Column(unique=true, length = 10)
@Column
: 컬럼 매핑@Temporal
: 날짜 타입 매핑, Date또는 LocalDateTime 타입에 주로 사용된다. @Lob
: 문자 타입@Enumerated
: enum 타입 매핑으로 데이터베이스에는 varchar 타입으로 저장된다.@Transient
: 특정 필드를 데이터베이스에 저장하지 않고 메모리에서만 사용하고 싶을 때 사용한다. name
: 필드와 매핑할 테이블의 컬럼 이름을 지정할 수 있으며, 기본값은 객체의 필드 이름이다. insertable
, updatable
: 컬럼의 등록, 변경 가능 여부를 설정할 수 있다. nullable
: null 제약조건을 설정할 수 있으며 false로 설정하면 not null 제약조건이 붙게 된다.unique
: true로 설정 시 이름이 랜덤 문자열로 생성되므로 운영에 사용하기 좋지는 않다. @Table의 uniqueContraints는 한번에 여러개의 컬럼에 유니크 제약조건을 걸 수 있고 unique는 한 컬럼에만 제약조건을 걸고 싶을 때 사용한다. columnDefinition
: 컬럼 정보, 옵션을 직접 줄 수 있으며 기본값도 설정이 가능하다. columnDefinition = "varchar(100) default: 'EMPTY'"
BigDecimal
: 아주 큰 숫자나 소숫점이 필요할 때 사용한다. @Enumerated
1. ORDINAL 사용하지 않는 것이 좋다. 사용 시 enum 순서를 저장할 때 0,1 이런식으로 숫자로 저장하게 되는데, enum에 새로 요소를 추가하면 순서가 바뀌기 때문에 에러가 날 수 있으므로 사용하지 않는 것이 좋다. 2. STRING: enum 이름을 데이터베이스에 저장한다.
@Temporal
@Lob
@Transient
: 매핑하고 싶지 않을 경우 사용한다. @GeneratedValue(strategy= GeneratedType.AUTO)
@SequenceGenerator(name = "member_seq_generator",
sequenceName = "member_seq") // 매핑할 데이터베이스 시퀀스 이름
-Table 전략 : 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략이다. 모든 데이터베이스에 적용 가능하다는 장점이 있지만 최적화가 안되어있어서 성능이 떨어진다.
@TableGenerator(
name = "Member_SEQ_generator",
table = "my_sequences",
pkColumnName = "member_seq",
allocationSize = 1)
em.persist를 실행하는 시점에 쿼리를 날리고, 그러고 나서야 pk값이 생성된다.즉 jpa에서 내부적으로 pk값을 가져오고, 그 시점에 생성된 값을 알 수 있다.이때 select 쿼리 실행 없이, insert문을 실행하는 시점에 바로 pk값을 가져올 수 있다. 즉 pk값을 모아서 가져오는것이 불가능하다는 단점이 존재한다.