분류 전체보기 1341

Ch08. 프록시와 연관관계 관리 - 영속성 전이(CASCADE)와 고아 객체

영속성 전이: CASCADE 연관관계, 즉시 로딩, 지연 로딩이랑은 아무런 관련이 없다. 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들도 싶을 때 예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장. Parent Entity @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent",cascade = CascadeType.ALL) //연관관계상관없이 해당 옵션 아래있는애도 다 영속화할꺼야 private List childList = new ArrayList(); public void addChild(Child child)..

Ch08. 프록시와 연관관계 관리 - 즉시 로딩과 지연 로딩

지연 로딩 LAZY을 사용해서 프록시로 조회 TEST team을 실제 사용할 때, 쿼리가 나가는 게 핵심이다. 즉시 로딩 EAGER를 사용해서 함께 조회 프록시와 즉시 로딩 주의 가급적 지연 로딩만 사용(특히 실무에서) 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다. Team team1 = new Team(); team1.setName("teamA"); em.persist(team1); Team team2 = new Team(); team2.setName("teamB"); em.persist(team2); Member member1 = new Member(); member1.setUsername("hello1"); member1.setTeam(team1..

Ch08. 프록시와 연관관계 관리 - 프록시

Member를 조회할 때 Team도 함께 조회해야 할까? 회원과 팀을 함께 출력할 때도 있지만 회원만 출력할 때도 있다 프록시 기초 em.find() vs em.getReference() em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 특징 실제 클래스를 상속받아서 만들어짐 실제 클래스와 겉모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨(이론상) 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메서드 호출 프록시 객체의 초기화 Member member = em.getReference(Membe..

Ch07. 고급 매핑 - 실전 예제(상속관계 매핑)

상품의 종류는 음반, 도서, 영화가 있고 이후 더 확장될 수 있다. 모든 데이터는 등록일과 수정일이 필수다. 도메인 모델 Item Entity(부모) @Inheritance 전략을 SingleTable 전략을 사용한다고 명시한다. SingleTable 전략을 사용하면 @DiscriminatorColumn이 필수이다. 하위 클래스를 구분하는 컬럼을 명을 지정한다 -> default = DTYPE 자식 Entity @DiscriminatorValue 어노테이션을 설정하지 않았으므로 기본적으로 DTYPE에 클래스의 이름이 들어간다. @MappedSuperclass 공통적으로 사용될 속성을 클래스로 만들어 준다.

Ch07. 고급 매핑 - @MappedSuperclass(매핑 정보 상속)

공통 매핑 정보가 필요할 때 사용(id, name) @MappedSuperclass 상속관계 매핑 X Entity X, 테이블과 매핑 X 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공 조회, 검색 불가(em.find(BaseEntity) 불가) 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장 정리 테이블과 관계없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용 참고: @Entity 클래스는 Entity나 @MappedSuperclass로 지 정한 클래스만 상속 가능

Ch07. 고급 매핑 - 상속관계 매핑

관계형 데이터베이스는 상속 관계 X 슈퍼 타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼 타입 서브타입 관계를 매핑 슈퍼 타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 각각 테이블로 변환 -> 조인 전략 두 번의 Insert 하고, 조인의 해서 조회를 한다. 통합 테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 조인 전략 부모 부모 클래스로, @Inheritance로 전략을 적어준다(default = 싱글 테이블 전략) 자식 자식 클래스로, DTYPE에 들어갈 값을 @DiscriminatorValue로 적을 수 있다. Test Insert Query 2번과 조인해서 데이터 가지고 오는것 또..

Ch06. 다양한 연관관계 매핑 - 실전 예제(다양한 연관관계 매핑)

배송, 카테고리 추가 - 엔티티 주문과 배송은 1:1(@OneToOne) 상품과 카테고리는 N:M(@ManyToMany) Delivery Entity @Entity public class Delivery { @Id @GeneratedValue private Long id; private String city; private String street; private String zipcode; private DeliveryStatus status; @OneToOne(mappedBy = "delivery") private Order order; } 일대일 연관관계로 연관관계의 주인이 아닌 Order에 mappedby 옵션을 준다. 일대일 연관관계는 연관관계의 주인이 어디에 있든지 상관없다 Order Enti..

Ch06. 다양한 연관관계 매핑 - 다대다 [N:M]

관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야 함 중간 테이블을 만들어서 풀어주어야 한다. 다대다 매핑 객체는 컬렉션을 사용해서 객체 2개로 다대다 관계 가능 객체는 컬렉션을 사용해서 객체 2개로 다대다 관계 가능 @ManyToMany 사용 @JoinTable로 연결 테이블 지정 다대다 매핑: 단방향, 양방향 가능 JoinTable로 중간 테이블을 지정하면 자동으로 중간 테이블이 생성되고, 중간 테이블을 명도 지정해줄 수 있다. 읽기 전용으로 mappedBy를 해준다. 다대다 매핑의 한계 편리해 보이지만 실무에서 사용 X 연결 테이블이 단순히 연결만 하고 끝나지 않음 주문시간, 수량 같은 데이터가 들어올 수 있음 다대다 ..

Ch06. 다양한 연관관계 매핑 - 일대일 [1:1]

일대일 관계는 그 반대도 일대일 주 테이블이나 대상 테이블 중에 외래 키 선택 가능 주 테이블에 외래 키 대상 테이블에 외래 키 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가 일대일: 주 테이블에 외래 키 단방향 다대일(@ManyToOne) 단방향 매핑과 유사 단방향 조건을 추가한다. 일대일: 주 테이블에 외래 키 양방향 다대일 양방향 매핑처럼 외래 키가 있는 곳이 연관관계의 주인 반대편은 mappedBy 적용 일대일: 대상 테이블에 외래 키 단방향 단방향 관계는 JPA 지원 X 양방향 관계는 지원 일대일: 대상 테이블에 외래 키 양방향 사실 일대일 주 테이블에 외래 키 양방향과 매핑 방법은 같음 정리 주 테이블에 외래 키 주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래 키를 두고 ..