참고) 암묵적 플러시
일대일(1:1) : @OneToOne
회원1 - 프로필1
일대다(1:N) : @OneToMany
Member - BoardData(주인)
-연관관계 주인 설정 - 관계의 주인의 외래키쪽
-mappedBy
-toString()을 구성할 때 getter 메서드를 사용해서 구성하기 때문
BoardData -> toString() -> getMember() -> toString()
-> List<BoardData\> items -> toString() -> getMember() -> toString() 무한반복
*해결 방법
:toString을 멤버 변수를 직접 출력하는 것으로 직접 정의
게시글1 태그1 태그4
게시글2 태그1 태그2
게시글3 태그3 태그4
태그1 - 게시글1, 게시글2
두 테이블 사이에 중간 테이블 생성
각 테이블의 기본키를 가짐.
@JoinColumn : 조인되는 컬럼의 이름을 변경할 때
게시글 - 회원
(BOARD_DATA - MEMBER)
-many쪽에 one을 적음 (외래키 적용됨)
-글로벌 전략으로 지연로딩, 필요할때만 즉시 로딩 전략 사용
Fetch 조인 -> 필요한 엔티티만 즉시 로딩 전략을 사용
1) JPQL 직접 정의 : @Query 애노테이션
2) @EntityGraph애노테이션 : 쿼리 메서드 사용시 정의 가능
3) QueryDsl의 fetchJoin() 메서드 사용
JPAQueryFactory
-생성자 매개변수 EntityManager
JPAQuery
참고)
@BatchSize(size=10)
적용 전
SELECT ... FROM BoardData
SELECT ... FROM Member WHERE seq = 1L
SELECT ... FROM Member WHERE seq = 2L
SELECT ... FROM Member WHERE seq = 3L
SELECT ... FROM Member WHERE seq = 1L
적용 후
SELECT ... FROM BoardData
SELECT ... FROM MEMBER WHERE seq IN (1L, 2L, 3L)
1) PERSIST
2) MERGE
3) REMOVE
4) REFRESH
5) DETACH
6) ALL
remove -> flush 참조 끊겨서 삭제
@Test
void test2() {
Member member = memberRepository.findById(1L).orElse(null);
List<BoardData> items = member.getItems();
items.remove(0);
items.remove(1);
memberRepository.flush();
}
참고)
@Lazy
-> 사용 시점에 객체 생성