JPA는 매핑관계의 필수 여부에 따라 실제 데이타베이스로 보내는 SQL 구문이 달라진다
선택적 관계
public class Member {
//...
fetch = FetchType.EAGER)
( name = "teamId")
( private Team team;
//...
}
@ManyToOne
의 optional
속성이 true (default) 이거나 @JoinColumn
의 nullable
속성이 true(default) 인 경우에는 Team이 없는 Member도 조회될 것을 보장해야 하기 때문에 Outer Join 을 수행한다.
SELECT *
FROM Member m left outer join Team t
ON m.teamId = t.teamId
필수 관계
public class Member {
//...
fetch = FetchType.EAGER, optional = false)
( name = "teamId")
( private Team team;
/** 또는
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "teamId", nullable = false)
private Team team;
*/
//...
}
@ManyToOne
의 optional
속성 또는 @JoinColumn
의 nullable
속성이 false 인 경우라면, Team이 없는 Member는 없다는 제약조건이 생기므로 Inner Join을 수행할 수 있다. 따라서 Inner Join을 수행한다.
SELECT *
FROM Member m join Team t
ON m.teamId = t.teamId
일반적으로 Outer Join 보다 Inner Join이 성능과 최적화에서 더 유리하기 때문에 관계 설정 시 잘 고려해야한다.
'Development > DB, JPA' 카테고리의 다른 글
Lazy Initialize Exception 방어코드 (0) | 2017.03.27 |
---|---|
스프링 JPA 그리고 LazyInitializeException (0) | 2017.03.23 |
JPA를 이용한 다대일 객체 관계 매핑 (0) | 2017.03.17 |
JPA 기본 키 전략 (0) | 2017.03.12 |
JPA를 이용한 엔티티 CUD(등록,수정,삭제) (0) | 2017.03.12 |