본문 바로가기

JAVA/JPA

JPA 기본

반응형

주의

엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유

엔티티 매니저는 쓰레득간에 공유하면 안된다(사용하고 버려야 한다)

-Spring boot에서는 자동으로 생성해줌

JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

-Spring안에서는 @Transactional 안에서 실행


데이터베이스 스키마 자동생성

hibernate.hdm2ddl.auto


-create : 기존테이블 삭제 후 다시 생성 (DROP + CREATE)

-create-drop : create와 같으나 종료시점에서 테이블 DROP

-update : 변경분만 반영(운영DB에서는 사용하면 안됨)

-validate : 엔티티와 테이블이 정상매핑되었는지만 확인

-none : 사용하지 않음


주의

개발초기단계는 create 또는 update

테스트 서버 update 또는 validate

스테이징과 운영서버는 validate 또는 none


식별자매핑

@Id(직접매핑)

IDENTITY - 데이터베이스에 위임 mysql


SEQUENCE - 데이터베이스 시퀀스 오브젝트 사용 ORACLE

@SequenceGenerator 필요


TABLE - 키 생성용 테이블 사용 모든 DB에서 사용

@TableGenerator필요


AUTO - 방언에 따라 자동지정, 기본값


권장하는 식별자 전략

기본키 제약조건 : null 아님, 유일, 변하면 안된다.

미래까지 이조건을 만족하는 자연키는 찾기 어렵다. 대리키(대체키)를 사용하자


권장: Long + 대체키 + 키 생성전략 사용


대체키 비즈니스랑 전혀관련없는것을 쓰자

Long 타입의 대체키



단방향




양방향




테이블은 연관관계 똑같다



설계


mappedBy = JPA의 멘붕클래스1


mappedBy는 처음에는 이해하기 어렵다.


객체와 테이블간에 연관관계는 맺는 차이를 이해해야 한다.



객체연관관계


회원 -> 팀 연관관계 1개(단방향)

팀 -> 회원 연관관계 1개(단방향)


테이블 연관관계

회원 <-> 팀의 연관관계 1개 (양방향)



객체의 양방향 관계

객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 


2개다.


객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.


예)


A -> B (a.getB())


B -> A (b.getA())


class A {

B b;

}


class B {

B a;

}



테이블의 양방향 연관관계

테이블은 외래키 하나로 두 테이블의 연관관계를 관리

MEMBER.TEAM_ID 외래키 하나로 양방향 연관관계를 가진다.

(양쪽으로 조인가능)


SELECT *

FROM MEMBER M

JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID


SELECT *

FROM TEAM T

JOIN MEMEBER M ON T.TEAM_ID = M.TEAM_ID




둘중 하나로 외래키를 관리해야 한다.


MEMBER 와 TEAM

meber에서 바꾸든 team에서 바꾸든 서로 바뀐다.



연관관계 주인


양방향 매핑 규칙

- 객체의 두 관계중 하나를 연관관계의 주인으로 지정

- 연관관계의 주인만이 외래 키를 관리(등록, 수정)

- 주인이 아닌쪽은 읽기만 가능

- 주인은 mappedBy 속성 사용X

- 주인이 아니면 mappedBy 속성으로 주인 지정



Member가 주인




누구를 주인?


외래키가 있는 곳을 주인으로 정해라

여기에선 Member.team이 연관관계의 주인


진짜 매핑 - 연관관계의 주인(Member.team)

가짜 매핑 - 주인의 반대편(Team.members)


설계할때 순환참조가 안좋다.

따라서 설계할때 단방향으로 끝낸다.

필요할때만 양방향으로 바뀐다.


단방향 매핑으로도 설계가능

양방향은 편하게 조회할려고


양방향 매핑시 가장많이 실수


Team team = new Team();

team.setName("TeamA");

em.persist(team);


Member member = new Member();

member.setName("member1");


//역방향(주인이 아닌 방향)만 연관관계 설정

team.getMembers().add(member);


em.persist(member);



실제 코드짤때는

양쪽다 넣는것을 권장


양방향 매핑의 장점

- 단방향 매핑만으로도 이미 연관관계 매핑은 완료

- 양방향 매핑은 반대방향으로 조회(객체 그래프 탐색) 기능이 추가된것 


-JPQL에서 역방향으로 탐색할일이 많음

- 단방향 매핑을 잘하고 양방향은 필요할때 추가해도됨

(테이블에 영향을 주지 않음)




연관관계 매핑 어노테이션

다대일 @ManyToOne

일대다 @OneToManay

일대일 @OneToOne

다대다 @ManyToMany

(일대다 다대일로 풀음)

@JoinColum

@JoinTable




상속관계 매핑 어노테이션

@Inheritance


@DiscriminatorColumn


@DiscriminatorValue


@MappedSuperclass(매핑 속성만 상속)



복합키 어노테이션

@IdClass


@EmbeddedId


@Embeddable


@MapsId


출처 - 자바 ORM 표준 JPA 프로그래밍 저자- 김영한

출처 - SKplanet Tacademy

반응형

'JAVA > JPA' 카테고리의 다른 글

JPA JPQL  (0) 2019.01.10