자바 ORM 표준 JPA 프로그래밍 - 엔티티매핑

서은경·2022년 5월 2일
0

Java

목록 보기
7/19

객체와 테이블 매핑

@Entity

  1. @Entity 가 붙은 클래스는 JPA가 관리
  2. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수

!!주의!!

  • 기본 생성자 필수 (파라미터가 없는 public 또는 protected)
  • final, enum, interface, inner 클래스는 사용 X
  • 저장할 필드에 final 선언 금지

속성

  • name : JPA에서 사용할 엔티티 이름 지정
@Entity(name = "Member")

@Table

  1. @Table은 엔티티와 매핑할 테이블 지정

속성

  • name : 매핑할 테이블 이름
  • catalog : 데이터베이스 catalog 매핑
  • schema : 데이터베이스 schema 매핑
  • uniqueConstraints : DDL 생성 시에 유니크 제약 조건 생성
@Table(name="MBR", 
uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE",columnNames = {"NAME", "AGE"} )})
public class Member {

데이터베이스 스키마 자동생성

  1. DDL을 애플리케이션 실행 시점에 자동 생성
  2. 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
  3. 테이블중심->객체중심
  4. 이렇게 생성된 DDL은 개발 장비에서만 사용
  5. 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용

속성 (persistence의 hibernate.hbm2ddl.auto 옵션)

  • create : 기존 테이블 삭제 후 다시 생성(DROP+CREATE)
  • create-drop : create와 같으나 종료시점에 테이블 ㅇ꺠ㅖ
  • update : 변경분만 반영(운영 DB에는 사용X)
  • validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
  • none : 사용 X
<property name="hibernate.hbm2ddl.auto" value="create" />

!!주의!!

  • 운영 장비에는 v,n 빼곤 절대 사용 금지
  • 개발 초기 단계는 c,u
  • 테스트 서버는 u, v
  • 스테이징와 운영서버는 v, n

DDL 생성기능

제약조건 추가 : 회원 이름 필수, 10자 초과 X

@Column(nullable = false, length = 10)

유니크 제약조건 추가

@Table(uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE",columnNames = {"NAME", "AGE"} )})
  • DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.

필드와 컬럼 매핑

요구사항
1. 회원은 일반 회원과 관리자로 구분해야 한다
2. 회원가입일과 수정일이 있어야 한다
3. 회원을 설명할 수 있는 필드가 있어야 하고 길이 제한은 없다

 @Entity
 public class Member {
 	@Id
	private Long id;
 	
    @Column(name = "name")
 	private String username;
	
    private Integer age;
 	
    @Enumerated(EnumType.STRING)
    //ORDINAL 타입은 사용하지 않음, 새로 추가되었을 경우 꼬일 수 있기 때문에
 	private RoleType roleType;
 	
    @Temporal(TemporalType.TIMESTAMP)
 	private Date createdDate;
 
 	@Temporal(TemporalType.TIMESTAMP)
 	private Date lastModifiedDate;
 	
    @Lob
 	private String description;
}
//Getter, Setter...

매핑 어노테이션 정리

@Column 속성

  • name: 필드와 매핑할 테이블 컬럼명
  • insertable, updatable: 등록, 변경 가능 여부
  • nullable(DDL): null 값의 허용 여부(false가 not-null)
  • unique(DDL): uniqueConstraints와 같지만 한 컬럼에 사용
  • columnDefinition: 컬럼 정보 직접 부여(varchar(100) default 'EMPTY')
  • length(DDL): 문자 길이 제약 조건, String 타입만
  • precision, scale(DDL): BigDecimal 타입에서 사용, double, float 타입에는 적용되지 않으며 아주 큰 숫자나 정밀한 소수 다룰 때만 사용

@Temporal 속성

  • value - TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑 (2022-05-02)
  • value - TemporalType.TIME:시간, 데이터베이스 time 타입과 매핑 (11:11:11)
  • value - TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (2022-05-02 11:11:11)
  • 근데 요즘 안씀 요런거 있어서
private LocalDate orderDate;
private LocalDateTime orderDate;

@Enumerated 속성

  • ORDINAL 사용 금지!!
  • value - EnumType.ORDINAL: enum순서를 데이터베이스에 저장
  • value - EnumType.STRING: enum이름을 데이터베이스에 저장

@Lob

  • 지정 속성 없음
  • 매핑 필드 타입이 문자면 CLOB, 나머지는 BLOB

@Transient

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

기본키 매핑

기본키 매핑 방법

  1. 직접할당
    • @Id만 사용
	@Id
    private Long id;
  1. 자동생성(@GeneratedValue)
    • IDENTITY: 데이터베이스에 위임
    • SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용
    • TABLE: 키 생성용 테이블 사용
    • AUTO: 방언에 따라 자동 지정, 기본값
2-1. IDENTITY
	- 기본 키 생성을 데이터 베이스에 위임
    - 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용(ex. MySQL의 AUTO_INCREMENT)
    - IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행 하고 DB에서 식별자를 조회
	@Entity
	public class Member {
		@Id
		@GeneratedValue(strategy = GenerationType.IDENTITY)
		private Long id;
2-2. SEQUENCE
	- 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트(예: 오라클 시퀀스)
    - 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용
	@Entity
	@SequenceGenerator(
		name = “MEMBER_SEQ_GENERATOR",
		sequenceName = “MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
		initialValue = 1, allocationSize = 1)
	public class Member {
			@Id
			@GeneratedValue(strategy = GenerationType.SEQUENCE,
			private Long id;
2-3. TABLE
	- 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉 내내는 전략
    - 장점: 모든 데이터베이스에 적용 가능
    - 단점: 성능
	@Entity
	@TableGenerator(
		name = "MEMBER_SEQ_GENERATOR",
		table = "MY_SEQUENCES",
		pkColumnValue = “MEMBER_SEQ", allocationSize = 1)
	public class Member {
		@Id
		@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
		private Long id;

0개의 댓글

관련 채용 정보