Java Persistence API
Java 어플리케이션에서 관계형 데이터 베이스를 사용하는 방식을 정의한
인터페이스의 모음입니다.
이 JPA 인터페이스를 구현한 대표적인 오픈소스로 Hibernate가 있습니다.
Object-Relational Mapping
객체와 관계형 데이터베이스를 중간에서 매핑해주는 기술입니다.
정의한 클래스가 JPA에 의해 관리될 엔티티임을 의미합니다.
해당 컬럼의 세부 속성을 정의합니다.
name : 컬럼명
length : 문자열인 경우 길이
nullable : null 허용 여부
unique : 유니크 키인지 여부
해당 필드를 프라이머리 키로 매핑합니다.
프라이머리 키를 직접 할당하지 않고 자동으로 생성하게 합니다.
값을 생성하는 방식 : Identity, Sequence, Table, Custom
mysql을 사용하는 경우 GenerationType.IDENTITY 전략을 사용합니다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
엔티티 이름과 테이블 이름이 다를 경우 이름을 지정하여 엔티티와 매핑되는 테이블을 지정합니다.
@OrderBy("age asc")
해당되는 필드명을 오름차순/내림차순으로 정렬합니다.
테이블의 컬럼으로 매핑되지는 않지만, 로직 상 선언해야 하는 변수가 있는 경우 사용합니다.
일대다 관계의 '일'에 해당하는 엔티티 안에 '다'에 해당하는 엔티티의 리스트를 생성하고 그 위에 붙여줍니다.
@Entity
public class Parent {
...
@OneToMany(mappedBy="parent")
private List<Child> children = new ArrayList<Child>();
...
}
이 때 '다' 쪽이 데이터가 너무 많으면 연관관계 매핑을 지양하는 것이 좋다고 합니다.
다대일 관계의 '다'에 해당하는 엔티티 안에 '일'에 해당하는 엔티티 객체를 생성하고 그 위에 붙여줍니다.
@Entity
public class Child {
...
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="parent_id") // child 테이블은 parent 테이블의 parent_id로 연결되어있음을 의미(포린키)
private Parent parent;
...
}
특정 엔티티를 조회할 때 연관된 엔티티를 가져오지 않음을 뜻합니다.
특정 엔티티를 조회할 때 따로 명시하지 않아도 연관된 엔티티까지 조회합니다.
Eager를 사용할 경우 JPQL을 사용할 때 N+1 문제가 발생합니다.
N+1 문제는 쿼리 1개를 날리면서 추가적으로 N개의 쿼리가 나가는 것을 말합니다.
application.properties나 application.yaml에 쓸 수 있는 데이터베이스 초기화 전략 설정 옵션입니다.
데이터베이스 구조를 바꾸지 않습니다.
주어진 엔티티 구조로 데이터베이스가 업데이트됩니다.
스키마가 바뀌면 어플리케이션을 종료시킵니다.
Drop table if exists [테이블 이름]
위 코드가 실행되어 기존 데이터가 삭제되고 새로운 커밋이 진행됩니다.
테이블을 생성하고, SessionFactory가 끝나면 테이블을 드롭합니다.
제이피에이 재미잇네요 호호 ^^