커리큘럼(12-30/변경)
01. Java
02. git
03. Database
04. Jsp [Server]
05. HTML,CSS
07. JS
06. 미니프로젝트-2W
08. SpringFramework , SrpingBoot (v)
09. React JS [Front-end]
10. 중간프로젝트 (1M)
11. Linux 명령어
12. AWS 클라우드
13. DevOps - Docker
14. App - Android
15. 최종프로젝트 (1M)
스프링 부트
JPA(Java Persistence API)
JPQL
JPQL 특징
- JPQL 조인 시, 연관 필드를 사용하여 조인
- JPQL구문에서 테이블 위치에 적는 값을
Entity명
- JPQL :
INNER JOIN m.member x
- SQL :
INNER JOIN MEMBER X
@Override
public List<Object[]> mtoJoin2(long mno) {
TypedQuery<Object[]> result = entityManager.createQuery(
"SELECT m, x FROM Memo m JOIN m.member x where m.mno >= :mno"
, Object[].class );
result.setParameter("mno", mno);
List<Object[]> list = result.getResultList();
return list;
}
- 비식별관계
- 두 컬럼을 조인하려면 ON절을 사용
@Override
public List<Object[]> mtoJoin3(String name) {
TypedQuery<Object[]> result = entityManager.createQuery(
"SELECT m, x FROM Memo m JOIN Member x ON m.writer = x.name "
+ "where x.name = :name"
, Object[].class);
result.setParameter("name", name);
return result.getResultList();
}
- 즉시로딩 타입 (Eager)
- 조인을 걸고 데이터 조회시 연관된 데이터까지 한번에 불러오게 됨
@ManyToOne(fetch = FetchType.EAGER) //ManyToOne의 기본값 입니다
@JoinColumn(name = "member_id")
private Member member;
- 지연로딩 타입(Lazy)
- 조인을 걸고 데이터 조회시 필요한 시점에 연관된 데이터를 불러옴
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
could-not-initialize-proxy-no-Session에러
- JPA에서 Session은 영속성 컨텍스트 의미
- 지연로딩에서 첫번째 SQL이후 추가적인 SELECT을 실행할 때 영속성 컨텍스트가 없기 떄문에 발생하는 오류
- 해결방법
-
@Transactional
어노테이션으로 함수를 묶음
-
- Fetch Join을 활용
JPQL 조인
@OneToMany
- 일대다 단방향
- 연관관계의 주인 - FK를 관리하는 주체 Entity
- OneToMany는
1이 연관관계의 주인
@JoinColumn
을 사용해서 FK연결을 작성해야 맵핑테이블의 생성을 피할 수 있음
- OneToMany
@JoinColumn
은 N테이블의 member_id를 FK로 조인을 의미
- 원투매니 조인 전략은 default FetchType.Lazy
# Entity 테이블
@OneToMany(fetch = FetchType.EAGER) //원투매니 기본조인방식 - Lazy
@JoinColumn(name = "member_id") //원투매니 조인컬럼 - N테이블의 member_id를 FK로 조인하겠다.
private List<Memo> list = new ArrayList<>();
# JPQL
public Member otmJoin1(String id) {
TypedQuery<Member> result = entityManager.createQuery(
"SELECT m FROM Member m JOIN m.list x WHERE m.id = :id"
, Member.class);
result.setParameter("id", id);
Member m = result.getSingleResult(); //1행을 얻음
return m;
}
- 다대일 양방향 맵핑
- 가장 이상적인 방법은 양방향 맵핑을 하는 방법
mapperd by
속성
사용과 규칙
mappedBy
는 양방향 관계에서 주인이 아닌 엔터티( 1 )에서 사용
mappedBy
를 사용하는 측에서는 관계의 세부 사항(매핑 정보)을 정의하지 않음
- 매핑은 관계의 주인(owning side)에서 정의해야 함
- 양방향 참조가 들어가므로 toString은 반드시 한쪽에만 정의
# (N)
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
# (1) toString메서드는 한쪽에서 삭제제
@OneToMany(mappedBy = "member", fetch = FetchType.LAZY)
private List<Memo> list = new ArrayList<>();