주의
엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
엔티티 매니저는 쓰레득간에 공유하면 안된다(사용하고 버려야 한다)
-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