[JPA] Entity mapping

보람·2023년 4월 30일
0

Spring

목록 보기
12/18

🌍 Entity mapping

JPA를 이용해 데이터베이스의 테이블과 상호 작용(데이터 저장, 수정, 조회, 삭제 등) 하기 위해 먼저 해야 하는 작업은 데이터베이스 테이블과 엔티티 클래스 간의 매핑 작업

사용 어노테이션

  • 객체와 테이블 매핑 : @Entity, @Table
  • 필드와 컬럼 매핑 : @Column
  • 기본 키 매핑 : @Id
  • 연관관계 매핑 : @ManyTOne, @JoinColumn

1. 객체와 테이블 매핑 : @Entity, @Table

(1) @Entity

  • @Entity가 붙은 클래스는 JPA 관리 엔티티
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수
  • 주의사항
    • 기본 생성자 필수 (파라미터가 없는 public 또는 protected 생성자)
    • 저장 필드에 final 사용 ❌
    • final 클래스, enum, interface 사용 ❌
    • 즉, 일반 클래스로 만들면 됨
  • 속성
    • name 속성
    	@Entity(name = "Member2")
    • JPA에서 사용할 엔티티 이름을 지정가능
    • 기본값 : 클래스 이름을 그대로
    • 같은 클래스 이름이 없으면 가급적 기본값을 사용할 것

(2) @Table

  • @Table 엔티티와 매핑할 테이블
  • 속성
    • name : 매핑할 테이블 이름 , 엔티티 이름을 사용
    • catalog : 데이터베이스 catalog 매핑
    • schema : 데이터베이스 schema 매핑
    • uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약 조건 생성
    • @Entity
       @Table(name = "MBR")
       public class Member {
           @Id
           private Long memberId;
      }

🙆‍♀️ DDL 명령어

  • DDL 명령어에 대한 자동 생성 여부

    • persistence.xml에서 조정 가능
    • <property name="hibernate.hbm2ddl.auto" value="none" />
    • 속성 : value="속성"
    • CREATE은 실무단계에서 절대 사용하지 않음
  • DDL 생성기능

    • DDL을 자동 생성할 때(value="create")만 사용. JPA의 실행 로직에는 영향 ❌
    • 제약조건 추가
      			// 회원 이름을 필수, 10자 초과X
          @Column(nullable = false, length = 10)
          private String name;
    • 유니크 제약조건 추가
          @Entity
           @Table(name = "MBR",
                    uniqueContraints={
                        @UniqueConstraint(name="NAME_AGE_UNIQUE",
                        columnNames={"NAME","AGE"})})
           public class Member {
               @Id
               private Long memberId;
        }

2. 필드와 컬럼 매핑

  • 필드 차원에서의 매핑 어노테이션
  • 필드 매핑 어노테이션 종류
@Entity
@Getter @Setter
@Table(name = "MBR")
public class Member {

	@Id
	private Long id;
	
	@Column(unique = true, length = 10)
	private String name;
	
	@Column(name = "myage")
	private int age;
	
	// DB에 날짜관련 매핑 시
	@Temporal(TemporalType.TIMESTAMP)
	private Date createdDate;
	
	// 마지막에 갱신된 날짜 매핑
	@Temporal(TemporalType.TIMESTAMP)
	private Date lastModifiedDate;
	
	// DB에 넣지 않는 데이터
	@Transient
	private int temp;
}

(1) @Column

  • 컬럼 속성

(2) @Transient

  • 필드 매핑 ❌
  • 데이터베이스에 저장 ❌, 조회❌
  • 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용

3. 기본 키 매핑 (FK)

직접 할당 or 자동 할당

(1) 직접 할당

  • @Id 사용
  • 엔티티 클래스의 기본키를 지정할 필드에 @Id 어노테이션을 붙이는 것으로 기본키를 직접 할당

(2) 자동 할당

  • @GeneratedValue 사용
  • 기본키 생성 전략
    • IDENTITY
      • 데이터베이스에 위임
      • @GeneratedValue(strategy = GenerationType.SEQUENCE)
    • SEQUENCE
      • 데이터베이스 시퀀스 오브젝트 사용
      • ORACLE, @SequenceGenerator 사용
    • TABLE
      • 키 생성용 테이블 사용, 모든 DB에서 사용 가능
      • @TableGenerator
      • 권장 ❌
    • AUTO
      • DB 방언에 맞는 SQL 자동 지정
      • auto가 기본값 (오라클, h2, MySQL등에 맞게 자동으로 설정해서 사용)

💡 예시

IDENTITY 예시 : 데이터베이스에서 바로 생성

@Entity
@Getter @Setter
public class Member2 {
	
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private Long id;
	
	@Column(name="name", nullable=false)
	private String username;
	
}

@SequenceGenerator 사용 예시

@Entity
@Getter @Setter
@SequenceGenerator(name= "MEMBER2_SEQ_GENERATOR",
					sequenceName = "MEMBER_SEQ",
					initialValue = 1, allocationSize = 1)
public class Member2 {
	
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE,
					generator = "MEMBER2_SEQ_GENERATOR")
	private Long id;
	
	@Column(name="name", nullable=false)
	private String username;
	
}
profile
안녕하세요, 한보람입니다.

0개의 댓글