Home JPA를 위한 어노테이션 정리
Post
Cancel

JPA를 위한 어노테이션 정리

1
2
3
4
5
6
7
8
9
10
11
@Entity
@Table(name = "Members")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "member_name") //컬럼명이 다를경우 @Column을 사용
    private String name;

    private String password; //같을 경우 생략가능
}

@Entity

  • 이 클래스를 테이블과 매핑한다고 JPA에게 알리는 어노테이션

@Table

  • 엔티티 클래스에 매핑할 테이블 정보를 알려주는 어노테이션
    • usage : name = “테이블명”

@Id

  • 엔티티 클랫의 필드를 테이블의 기본 키에 매핑하는 어노테이션

@Column

  • 필드를 컬럼에 매핍하는 어노테이션
    • usage : name = “컬럼 명”
  • 만약 필드명과 컬럼명이 일치하면 명시적으로 생략해도 된다.

@GeneratedValue(starategy = GenerationType.*)

  • IDENTITY 기본키 생성을 데이터베이스에 위임한다. 즉 @Id값을 null로 하면 DB에서 AUTO_INCREMENT를 해서 자동으로 id값을 넣어주게된다. ex) MySQL
    • AUTO_INCREMENT는 INSERT 쿼리 실행이후 id값을 설정하기 때문에 영속성 컨텍스트의 1차에서 관리불가하다. 그렇기 때문에 IDENTITY의 경우 EntityManager.persist() 를 하는 시점에서 INSERT SQL을 실행하기 때문에 식별자를 조회하여 영속성 컨텍스트의 1차 캐시에 값을 넣는다.
  • AUTO 기본 설정 값으로 각 데이터베이스에 맞게 자동으로 기본키를 생성해준다.
  • SEQUENCE 데이터 베이스 Sequence Object를 사용하여 데이터베이스가 자동으로 기본키를 설정하는데 @SequenceGenerator 어노테이션을 필수로 넣어야한다. ex)Oracle
  • TABLE 키 생성 전용 테이블을 하나 만들어 사용하는 방식으로 @TableGenerator 를 필요로 하고 Sequence 와 유사하다.

자세한 내용은 추후 다루도록 하겠다.

@IdClass

Pk값을 여러개 가지고 있을경우 사용하는 어노테이션으로 각각 @Id 어노테이션을 주는 방식도 있지만 오류가 발생할수 있기때문에 @IdClass를 쓰는 것을 권장한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Entity
@Getter
@Setter
@IdClass(Class.Pk.class)
public class Class {
    @Id
    @Column(name = "student_id")
    private Integer studentId;
    @Id
    @Column(name = "subject_code")
    private String subjectCode;
    private String comment;
    public static class Pk{
        @Column(name = "student_id")
        private Integer studentId;
        @Column(name = "subject_code")
        private String subjectCode;
    }
}

위의 코드와 같이 @Id 어노테이션을 붙여 평소와 똑같이 만들고 추가적으로 Pk 클래스를 만들어 @IdClass 어노테이션에 Pk 정보가 들어있는 클래스를 넣어주면 된다.

@EmbeddedId / @Embeddable

@IdClass와 같이 복합 Pk를 처리하는 방식으로 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Entity
@Getter
@Setter
public class Class {
    @EmbeddedId
    private Pk pk;
    private String comment;
    @Embeddable
    public static class Pk{
        @Column(name = "student_id")
        private Integer studentId;
        @Column(name = "subject_code")
        private String subjectCode;
    }
}

Pk 정보가 들어있는 클래스에 @Embeddable을 붙이고 클래스안에 @EmbeddedId Pk 정보가 들어있는 클래스를 선언해주면 된다.

This post is licensed under CC BY 4.0 by the author.