728x90
4.엔티티 매핑
- 목차
- 1.객체와 테이블 매핑
- 2.데이터베이스 스키마 자동생성
- 3.필드와 컬럼 매핑
- 4.기본키 매핑
1.객체와 테이블 매핑
- 객체와 테이블 매핑 : @Entity , @Table
- 필드와 컬럼 매핑 : @Column
@ 기본키 매핑 : @Id
@ 연관관계 매핑 : @ManyToOne ,@JoinColumn
@Entity
- JPA 가 관리하는 엔티티
- 기본생성자는 필수 (public , protected)
- final 클래스 , enum,interface,inner 클래스 사용 x
- 저장할 필드에 final 사용 x
2.데이터베이스 스키마 자동생성
- DDL 을 애플리케이션 실행시점에 자동 생성
- 테이블 - > 객체 중심
- 데이터 베이스 방언에따라 적절한 DDL 을 생성
- 운영서버에서는 생성된 DDL 을 쓰지 않는다
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
- h2 데이터베이스 SQL 문 나간다
<property name="hibernate.hbm2ddl.auto" value="create" />
- 자동으로 기존 테이블 삭제후 생성
- Update : 변경 쪽만 바꾸어준다
- validate : 엔티티와 테이블이 정상 매핑되는지 확인
- 운영장비 -> 절대로 create , create-drop , update 사용하면 안된다
정리
- 개발초기 : create , update
- 테스트 서버 : validate
- 스테이징 ,운영서버 : validate , none
3.필드와 컬럼 매핑
GMember
@Entity
public class GMember {
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
//Getter, Setter…
}
- @Column(name = "name") : DB name 으로 들어간다
- @Enumerated(EnumType.STRING) : enum 타입을 쓸때 쓴다
- @Temporal(TemporalType.TIMESTAMP) : date , time , timestamp 가 있다
- date : 날짜
- time : 시간
- timestamp : 날짜,시간
- @Lob : 큰데이터를 쓸때 사용
@Column
- name : 필드와 매핑할 테이블의 컬럼이름
- insertable,updatable : 등록,변경 기능여부
- nullable : null 값의 허용여부를 설정
- unique : 유니크 제약조건을 걸때 쓴다 (잘안쓴다 , 쿼리나가는 문이 운영에 반영하기 어렵다)
- @Table(uniqueConstrains) 를 주로 선호한다
- length : 문자 길이 제약조건 (String 타입만)
@Enumerated
- STRING : enum 타입을 매핑할때는 무조건 쓰기
- ORDINAL : 중간에 enum 값을 넣을수 없다
@Temporal
- LocalDate , LocalDateTime 이 자바8 부터 등장해서 생략 가능하다
- LocalDate : 년 , 월
- LocalDateTime : 년 , 월 , 일 , 시간
@Lob
- 지정할수 있는 속성이 없다
- 문자 : CLOB
- 나머지 : BLOB
4.기본키 매핑
- 직접할당 : @Id
- 자동생성 : @GeneratedValue
- 자동할당
- IDENTITY : 데이터베이스에 위임
- SEQUENCE : 데이터베이스 시퀸스 오브젝트 사용 (@SequenceGenerator)
- TABLE : 키 생성용 테이블 사용 (@TableGenerator)
- AUTO : 방언에따라 지정
IDENTITY
@Entity
public class IMember {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
- 기본키 생성을 DB 에 위임
- MySQL 경우 AUTO_INCREMENT
- h2 데이터베이스 경우
IDENTITY 주의
- IDENTITY 는 id 값을 넣지않고 DB 에 Insert 한다
- DB 에서 값이 날아오면 영속성 컨텍스트에 값을 셋팅한다
- id 값을 DB 에 들어가야 알수 있다..?
- 영속성 컨텍스트는 pk 값이 무조건 있어야 한다
- IDENTITY 는 em.persist 할때 DB 에 Insert 문이 나간다
System.out.println("================");
IMember iMember = new IMember();
em.persist(iMember);
System.out.println("================");
- 모아서 Insert 문 못쓰는게 단점
SEQUENCE
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class TMember {
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
@Column(name = "name")
private String username;
public TMember(){
}
}
- sequenceName : 매핑할 시퀸스 이름
- initialValue = 1 : 1부터 1씩증가
- allocationSize = 1 : 한번에 50개씩 가져옴
- generator : 기본키에 매핑할 시퀸스 이름을 적용
- 위에는 하이버 네이스가 기본으로 제공해주는 시퀸스
- MEMBER_SEQ 생성된것을 볼수있다
SEQUENCE 특징
- MEMBER_SEQ 는 트랜잭션 커밋하기 전에 DB 에서 가져온다
- 가져온 MEMBER_SEQ 을 PK 넣는다
System.out.println("================");
SMember sMember = new SMember();
em.persist(sMember);
System.out.println("================");
- 트랜잭션 커밋하기전에 MEMBER_SEQ 를 call 하는것을 볼수 있다
- SEQUENCE 는 모아서 Insert 할수 있다
- allocationSize = 1 을 이용해서 성능을 최적화 한다
TABLE 전략
- 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀸스를 흉내내는 전략
- 장점 : 모든데이터베이스 적용
- 단점 : 성능..
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
public class TMember {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
- @TableGenerator : 테이블전략
- pkColumnValue : 기본키명
- MY_SEQUENCES 테이블이 새로 생성되었다
- 운영에서는 쓰기 어려운편
권장하는 식별자 전략
- 기본키는 null 이 되면 안된다 , 유일 , 불변
- ex) 주민등록번호는 기본키로 적절하지 않다 (대리키 , 대체키)
- Long 형 + 대체키 + 키 생성전략 사용하기
참고
728x90
'Back-End > Spring Data' 카테고리의 다른 글
3.영속성관리 - 내부동작방식 (0) | 2021.01.05 |
---|---|
2.JPA 시작하기 (0) | 2021.01.04 |
1.JPA 소개 (0) | 2021.01.04 |
9.웹 계층 개발 2(주문) (0) | 2021.01.01 |
8.변경감지 와 병합 (0) | 2021.01.01 |