JPA
DDL 자동 생성 및 엔티티 매핑
유휴
2022. 11. 27. 20:45
강의참고 - 자바 ORM 표준 JPA 프로그래밍 - 기본편
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
데이터베이스 스키마 자동생성
- 데이터베이스에 맞는 DDL을 엔티티 매핑에 따라 애플리케이션 실행시점에 자동생성한다.
- persistance.xml 에 hibernate.hbm2ddl.auto 설정 추가
* create : 기존 테이블 삭제 후 다시 생성
* create-drop : 테이블 생성 후 종료시점에 drop
* update : 추가되는 사항에 대한 변경분만 반영
* validate : 엔티티와 테이블이 정상매핑 되었는지 확인
* none : 사용하지 않음
@ Column (DDL 생성시에 제약조건을 지정 가능하다.) * unique = true : unique 제약조건을 설정한다. constraint name 임의생성하므로 => @Table의 uniqueConstraint를 사용 * nullable = false : notnull 제약조건 추가 * length = 10 : 문자길이 제약조건 * columnDefinition : 데이터베이스 컬럼 정보를 직접 적용 ex) varchar(100) default 'Empty' * percision, scale // BigDecimal, 정밀 소수점 매핑 |
엔티티 매핑
1. 객체와 Table 간의 매핑
2. 필드와 Column 매핑
3. 기본키 매핑
4. 연관관계 매핑
1. 객체와 Table 간의 매핑
@Entity (기본생성자 필수[public, protected], final 키워드 사용 X) - name : JPA에서 사용할 엔티티명 지정 (기본값 : 클래스의 이름을 그대로 사용) @Table - name : 매핑할 테이블 지정 (기본값 : 엔티티의 이름을 그대로 사용) - catalog : 데이터베이스 catelog 매핑 - schema : 데이터베이스 schema 매핑 - uniqueConstraints : DDL 생성 시 유니크 제약 조건 추가 |
2.필드와 Column 매핑
@Id // 기본키 매핑 @GeneratedValue // 기본키 자동 생성 private Long id; @Column(name="name", insertable=true, updatable=true) // 필드username과 컬럼name을 매핑 private String username; private Integer age; // db에도 number타입으로 저장됨 @Enumerated(EnumType.String) // (STRING, ORDINAL) 두가지 타입으로 구분하며, 각각 값, 순서 저장 private RoleType roleType; // db에는 enumType이 없으므로, 어노테이션에서 지정한 타입적용 @Lob // Clob, Blob 매핑시에 사용 private String description; @Transient // 특정 필드를 컬럼과 매핑하지 않을 때 사용하는 어노테이션 private int temp; // java8부터 LocalDate, LocalDateTime 으로 구분하여 사용안함 @Temporal(TemporalType.TIMESTAMP) // (TIMESTAMP, DATE, TIME) 세가지 타입으로 구분 private Date createdDate |
3.기본키 매핑
@Id // 기본키 매핑 @GeneratedValue // 기본키 자동 생성 private Long id; |
1. 직접할당 하는경우 @Id만 사용 2. 자동으로 생성하는경우 @GeneratedValue 같이사용하며 3가지 strategy사용 - GengerationType.IDENTITY : 데이터베이스에 위임(autoIncrement) * 테이블에 데이터가 들어가야 pk를 알 수 있으므로 persist시에 insert쿼리 flush - GengerationType.SEQUENCE : 데이터베이스 시퀀스사용 * persist시에 nextVal을 시퀀스에서 읽어와서, commit시에 insert * 기본값으로 hibernate의 기본 시퀀스를 사용하거나 Entity 클래스에 @SequneceGenerator선언 또는 @GeneratedValue의 속성에 generator = name 선언하여 직접 지정 할 수 있다. - GengerationType.TABLE : 키 생성 전용 테이블을 생성 * 모든 데이터베이스에 적용 가능하는 장점이 있으나, 성능 저하 * Entity 클래스에 @TableGenerator 선언 혹은 @GeneratedValue의 속성에 generator = name 선언하여 테이블 지정 3. @GenratedValue를 sequence혹은 table 지정 시 사용방법 - @SequneceGenerator(name, sequenceName, initialValue, allocationSize, catalog, schema) - @TableGenerator(name, table, pkColumnValue, allocationSize, catalog, schema) - name : 엔티티 필드 @GenratedValue 의 generator 속성에 정의해줄 식별자명 - sequneceName / table : 데이터베이스에 등록되어있는 시퀀스명, (테이블 전략의 경우 테이블명) - initialValue / pkColumnValue : 시퀀스 DDL 생성시 동작하는 어노테이션, 처음 시작하는 수를 지정 - allocationSize : 시퀀스 nextVal 시에 증가시켜줄 값 최적화용도로 지정한 사이즈만큼의 시퀀스를 한번에 가져옴 - catalog, schema : 데이터베이스의 catalog, schema의 이름 |
4.연관관계 매핑
- @ManyToOne
- @OneToMany
- @OneToOne
- @JoinColumn