일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 참조형 매개변수
- Class Loader
- 네트워크
- 백준 1935
- 팩토리패턴
- www.naver.com치면 발생하는일
- 백준 2164
- 스프링 싱글톤
- k번째큰수
- try-catch
- 팩토리 패턴
- 기본형 매개변수
- removeAll
- 자바의 면접
- @Tranctional
- 스프링 컨테이너
- 빈 타입 조회
- 스프링
- 싱글톤 패턴
- 리버스 프록시
- 전략 패턴
- 포워드 프록시
- 후위표기식
- 쇠막대기
- TCP/IP 4계층
- 옵저버 패턴
- mvvm패턴
- SOLID원칙
- 참조형 반환타입
- 스프링 빈
- Today
- Total
스파이더 웹 개발
엔티티 매핑 본문
객체와 테이블 매핑 : @Entity, @Table(엔티티와 매핑할 테이블 지정)
필드와 컬럼 매핑 : @Column
기본 키 매핑 : @Id
연관관계 매핑 : @ManyToOne, @JoinColumn
@Entity
@Entity 어노테이션이 붙은 클래스는 JPA가 관리, 클래스와 테이블을 매핑
기본 생성자는 필수
엔티티 매핑에대해 자세히 알아보자
예제)
@Entity
public class Member {
@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;
public Member(){
}
}
@Id : 기본키 매핑
@Column : 테이블의 컬럼과 매핑(필드와 이름이 같으면 생략해도 된다. 현재의 경우 이름이 달라 지정)
- nullable = true, false(not null 제약조건이다)
@Enumerated : 자바 enum 타입 매핑
주의사항
@Enumerated 속성의 기본 값은 EnumType.ORDINAL인데 enum의 순서를 데이터베이스의 지정한다
이게 무슨 말이냐면 최초의 enum 타입은 USER, ADMIN 두 개만 관리가 되고있다고 가정하면 DB저장시 USER는 0이 저장되고 ADMIN은 1로 저장된다. 근데 여기서 GUEST 데이터를 enum 타입으로 추가하여 GUEST, USER, ADMIN 으로 enum 타입이 설정되면, DB의 GUEST 저장시 0이 저장이 된다. 그렇기에 이전 저장되었던 USER 0과, GUEST 0이 중복으로 존재되어 혼란을 초래시킨다 그러므로 기본값인 EnumType.ORDINAL 아닌, EnumType.STRING으로 변경한다 해당 속성 값은 enum 이름을 데이터베이스에 저장한다
@Temporal : 날짜 타입을 매핑할 때 사용(속성 값으로는 다음과 같다)
- TIME : 시간
- DATE : 날짜
- TIMESTAMP : 시간 + 날짜
@Transient : 필드와 컬럼이 매핑되지 않음. 데이터베이스에도 저장되지않으며 무관한 필드
기본키 매핑
기본키 설정시 자동생성기능도 있는데, @GeneratedValue 어노테이션을 기본키 설정할 필드에 추가해주면된다
속성 값으로는 아래와 같다
- IDENTITY: 데이터베이스에 위임, MYSQL
- SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE • @SequenceGenerator 필요
- TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용 • @TableGenerator 필요
- AUTO: 방언에 따라 자동 지정, 기본값
기본키 @GeneratedValue의 IDENTITY 속성 사용시 알아둘 점
try {
Member member = new Member();
member.setUsername("A");
em.persist(member);
tx.commit();
}
기존의 경우 해당코드에 commit 시점의 insert 쿼리가 DB에서 실행된다고 알아보았는데, 영속성 컨텍스트의 1차캐시 안에서 관리되려면 기본키의 값을 알아야한다. 그러나 @GeneratedValue의 경우 DB에서 Insert되어야 값을 알 수 있으므로 commit시점의 insert 쿼리가 실행되는것이 아닌 em.persist( )시점의 insert 쿼리가 실행되어 DB의 저장되고 해당 기본키를 영속성 컨텍스트안에 저장된다
try {
Member member = new Member();
member.setUsername("A");
System.out.println("------------");
em.persist(member);
System.out.println("------------");
tx.commit();
}
------------
Hibernate:
/* insert hellojpa.Member
*/ insert
into
Member
(id, name)
values
(default, ?)
------------
콘솔 결과를 보면 commit시점 전의 insert쿼리가 실행되는것을 알 수 있다
'JPA' 카테고리의 다른 글
다양한 연관관계 매핑 (0) | 2022.09.02 |
---|---|
연관관계 매핑 (0) | 2022.08.30 |
JPA 실행 중 발생 한 오류 (0) | 2022.08.26 |
영속성 관리 (0) | 2022.08.26 |
JPA 와 JPA 시작하기 (0) | 2022.08.26 |