목록JPA (9)
경주장
1:N관계를 가진 team, member 엔티티에서 발생할 수 있는 여러 쿼리를 실행해보자 모든 멤버의 이름 String jpql = "select m.username from Member m"; Fetch 옵션을 레이지로 두었기 때문에 SQL에서는 요청하지 않은 Team에대한 쿼리는 전혀 없이 SELECT m.username from Member m 쿼리 한방으로 이름만 잘 긁어 올 수 있었다. 모든 멤버 String jpql = "select m from Member m"; 이때 멤버 인스턴스에는 team이 proxy로 들어가 있으며 proxy의 메소드를 호출하면 그때 jpa는 각 team id의 정보를 얻기위해 쿼리(where in문)를 발생시킨다. 모든 멤버, 조인문 String jpql = "s..
Team의 Member Entity에 영속성 전이 옵션에 PERSIST를 넣으면 팀만 persist해도 member가 모두 persist된다. @Entity public class Team{ ... @OneToMany(mappedBy = "team", cascade = PERSIST) private List members = new ArrayList(); ... } 해당 옵션을 제거하면 Member는 삽입되지 않는다. cascade = PERSIST 옵션이 들어가 있을때에도 Insert 쿼리는 em.flush( )를 호출하는 시점에 발생하기 때문에 팀의 참조를 영속화하는 em.persist(team1), em.persist(team2)의 호출 시점은 team 생성 직후 여도 상관없다. 멤버를 삽입해서 팀..
JPA는 다양한 쿼리 방법을 지원 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 JPQL은 엔티티 객체를 대상으로 쿼리 SQL은 데이터베이스 테이블을 대상으로 쿼리 예시 Member member = new Member(); member.setName("득윤"); em.persist(member); List resultList = em.createQuery( "SELECT m FROM Member m where m.nam..
JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본값 타입 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입(embedded type, 복합 값 타입) 좌표, 주소 컬렉션 값 타입(collection value type) 기본값 타입 생명주기를 엔티티에 의존 (e.g. 회원을 삭제하면 이름, 나이 필..
프록시 Member를 조회할 때 Team도 함께 조회해야 할까? 프록시 기초 em.find() vs em.getReference() em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 특징 실제 클래스를 상속 받아서 만들어짐 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨(이론상) 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 Member member = em.getReference(Member.class, “id1”); member.getName(); 즉시 로딩과..
상속관계 매핑 관계형 데이터베이스는 상속 관계X 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 • 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 각각 테이블로 변환 -> 조인 전략 통합 테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 조인 전략 단일 테이블 전략 구현 클래스마다 테이블 전략 @MappedSuperclass .공통 매핑 정보가 필요할 때 사용 상속관계 매핑과 다르다 엔티티 아니다 테이블 아니다 자식 클래스에 매핑 정보만 줌 추상 클래스 권장
목표 객체와 테이블 연관관계의 차이를 이해 객체의 참조와 테이블의 외래 키를 매핑 용어 방향: 단방향, 양방향 다중성 : 다대일, 일대다, 일대일, 다대다 연관관계의 주인 시나리오 회원,팀 객체를 테이블에 맞추어 모델링(외래 키 식별자를 직접 다룸) @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; @Column(name = "TEAM_ID") private Long teamId; … } @Entity public class Team { @Id @GeneratedValue private Long id; private String name; … } 문제..
객체와 테이블 매핑 : @Entity, @Table import javax.persistence.Entity; import javax.persistence.Table; @Entity @Table public class Member{ ... } @Entity - @Entity가 붙은 클래스는 JPA가 관리함 @Table - @Table은 엔티티와 매핑할 테이블 지정 - @Table(name = "DB저장 이름") 데이터 베이스 스키마 자동 생성 DDL을 애플리케이션 실행 시점에 자동 생성 운영서버 사용 X, 개발 장비에서만 사용 DB 방언 별로 달라짐 DB schema 자동 생성 속성 resources/META-INF/persistence.xml create : 기존 테이블 삭제 후 다시 생성 create..