-
Spring JPA(2) - 엔티티 매핑Spring 2020. 1. 29. 15:47
참고 블로그
https://dotheright.tistory.com/266?category=777106
https://doublesprogramming.tistory.com/260
1. 엔티티 매핑 종류
객체, 테이블 매핑 : @Entity, @Table
필드, 컬럼 매핑 : @Column
기본 키 매핑 : @Id
연관관계 매핑 : @ManyToOne, JoinColumn
※ 객체, 테이블 매핑 주의사항
기본생성자 필수(NoArgs)
final, enum, interface, inner 클래스는 사용 불가능
저장할 필드에 final 사용 불가능
2. 테이블 매핑
@Table 어노테이션은 엔티티와 매핑할 테이블을 지정하고, 생략시 엔티티 이름을 테이블 이름으로 사용한다.
속성으로는 다음과 같다.
name : 매핑할 테이블 이름
catalog : catalog 기능이 있는 데이터베이스에서 catalog를 매핑한다.
schema : schema 기능이 있는 데이터베이스에서 schema를 매핑한다.
uniqueConstraint : DDL 매핑 시에 유니크제약조건을 생성, 스키마 자동생성 기능을 사용하여 DDL을 만들때만 사용한다.
3. DB스키마 자동 생성
application.yml 설정으로 애플리케이션 실행 시점에 테이블을 생성 가능
데이터베이스 방언을 활용하여 데이터베이스에 맞는 적절한 DDL 생성
더보기Spring:
jpa:
hibernate:
ddl-auto:
hibernate.ddl-auto의 속성은 다음과 같다.
create : 기존 테이블 삭제하고 새로 생성, DROP + CREATE
create-drop : 애플리케이션을 종료할 때 생성한 DDL을 제거, DROP + CREATE + DROP
update : DB 테이블과 엔티티 매핑정보를 비교해서 변경사항만 수정
validate : DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션 실행 및 DDL 수정은 않한다.
none : 자동생성 기능을 사용하지않으려면 속성을 제거하거나, 유효하지않은 옵션값을 주면 됨
※ 주의사항
DDL 수정하는 옵션은 절때로 운용서버에서 사용하면 안된다.(create, create-drop, update)
위에서 설명했다 시피 테이블을 DROP을 시키기 때문에 기존 데이터가 없어진다.
개발 초기단계 : create, update
테스트 서버 : update, validate
스테이징, 운용서버 : validate, none
4. 기본키 매핑
기본키 매핑의 경우 직접 할당할 수도 있으며, 데이터베이스가 생성해주는 값을 사용할 수도 있다. 데이터베이스마다 기본키를 생성하는
방식이 다르기에 JPA가 제공하는 데이터베이스 기본키 생성 전략은 다음과 같다.
1. 직접할당 : 기본키를 애플리케이션에서 직접할당
2. 자동생성 : 대리키 사용방식
> @GeneratedValue()
> IDENTITY : 기본키 생성을 데이터베이스에 위임, 데이터베이스에 의존
> SEQUENCE : 데이터베이스 시퀀스를 사용하여 기본키를 할당, 데이터베이스에 의존
> TABLE : 키 생성 테이블을 사용, 데이터베이스에 의존을 하지 않음
> AUTO : 자동으로 기본키 생성
기본키 생성 전략을 사용하기 위해서는 application.yml 설정 추가는 다음과 같다.
더보기Spring
jpa
hibernate:
user-new-id-generator-mappings:
직접할당 같은경우 클래스 필드에 @Id로 매핑을 하고, 엔티티를 저장하기 전에 애플리케이션에서 기본키를 직접 할당해주면 된다.
@NoArgsConstructor @Entity @Table(name = "MEMBER_HEIGHT") public class MemberHeight { @GeneratedValue(strategy=GenerationType.AUTO) // db에 위임 @Id // 기본키 Private Long Id; @Column(name = "PLAYER_NAME") private String name; @Column(name = "HEIGHT") private float height; }
// 기본키 직접 할당 코드 MemberHeight member = new MemberHeight(); member.setId(1L); member.setName("inwoo"); member.setHeight(160); // EntityManager 이용시 entityManager.persist(member); // Repository이용시 memberRepository.save(member);
@Id에 적용가능 자바타입은 다음과 같다.
> 자바 기본형
> 래퍼형
> String
> java.util.Date
> java.sql.Date
> java.math.BigDecimal
> java.math.BigInteger
'Spring' 카테고리의 다른 글
Spring Boot HikariCP (0) 2020.02.04 Spring JPA(4) 연관관계 매핑 (0) 2020.01.30 Spring JPA(3) CRUD 기본 예제 (0) 2020.01.30 Spring JPA(1) ORM, Hibernate(JPA), 영속성 (0) 2020.01.22 Spring Boot DB 오류해결 (0) 2020.01.20