ORM 12

Mapped Superclass - 매핑 정보 상속 / 상속관계 매핑

BaseEntity 클래스를 만들어보자. 추상클래스로 쓰자. @MappedSuperclass public abstract class BaseEntity { package hellojpa; import javax.persistence.MappedSuperclass; import java.time.LocalDateTime; @MappedSuperclass public class BaseEntity { private String createdBy; private LocalDateTime createdDate; private String lastModifiedBy; private LocalDateTime lastModifiedDate; public String getCreatedBy() { return crea..

Spring/JPA 2022.05.28

실전 예제 3 - 다양한 연관관계 매핑

배송, 카테고리 추가 - 엔티티와 ERD를 보자. Delivery 및 Category Class를 만들어주자. package jpabook.jpashop.domain; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Delivery { @Id @GeneratedValue private Long id; private String city; private String street; private String zipcode; private DeliveryStatus status; } Order와 Delivery의 관계를 1대1로 잡아준다...

Spring/JPA 2022.05.25

일대일 1:1 / 다대다 N:M

일대일 관계 일대일 관계는 반대도 일대일이다. 주 테이블이나 대상 테이블 중에 외래 키 선택 가능 주 테이블에 왜래 키 대상 테이블에 외래 키 외래 키에 DB 유니크(UNI) 제약조건 추가 다대일(@ManyToOne) 단방향 매핑과 유사하다. Locker를 만들어주자. package hellojpa; import javax.persistence.GeneratedValue; import javax.persistence.Id; public class Locker { @Id @GeneratedValue private Long id; private String name; } Member Class에도 설정을 해주고 돌리면 Locker_ID와 Member Class가 생성이 된다. @OneToOne @JoinCo..

Spring/JPA 2022.05.25

다대일 N:1 / 일대다 1:N

연관관계 매핑시 고려사항 3가지 다대일[N:1] 일대다[1:N] 일대일[1:1] 다대다[N:M] 다양한 연관관계 매핑 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A -> B, B->A 처럼 참조가 2군데 객체 양방향 관계는 참조가 2군데 있음. 둘중 테이블의 외래 키를 관리할 곳을 지정해야 함 연관관계의 주인: 외래 키를 관리하는 참조 주인의 반대편: 외래 키에 영향을 주지 않음, 단순 조회만 가능 다대일(N:1)부터 보자. 외래키가 있는 곳에 참조를 걸고 매핑을 하면되는 그림이다. 다대일 단방향 관계는 아래..

Spring/JPA 2022.05.25

예제 - 연관관계 매핑 시작

연관관계 매핑의 객체 구조는 이렇다. MEMBER와 ORDER와의 관계에서는 MEMBER_ID만(FK) 잘 매핑해주면 된다. 연관관계 매핑을 해주자. @Entity @Table(name = "ORDERS") public class Order { @Id @GeneratedValue @Column(name = "ORDER_ID") private Long id; // @Column(name = "MEMBER_ID") // private Long memberId; @ManyToOne @JoinColumn(name = "MEMBER_ID") private Member member; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private Orde..

Spring/JPA 2022.05.25

양방향 연관관계와 연관관계의 주인

아래 코드를 보게 되면 member에서 Team으로는 갈 수 있다. 반대로 team에서 getMember()는 안된다. 일단 왔다갔다 참조는 할 수 있다. => 양방향 연관관계 // ex1-hello-jpa / hellojpa / JpaMain // 저장 Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setUsername("member1"); // 이렇게 해주면 JPA가 알아서 PK값을 team에서 꺼내서 FK값에 insert해준다. member.setTeam(team); em.persist(member); em.flush(); em.clear(); Member find..

Spring/JPA 2022.05.08

ORM & 영속성 컨텍스트 & OOP 관점 모델링 & HTTP

ㅇORM Object Relational Mapping : 오브젝트를 데이터베이스에 연결하는 방법론 자바에서 클래스를 만들어서 실행을 하면 데이터베이스에 자동으로 생성되게 하는 기법이 ORM이다. ORM 데이터를 자바 오브젝트로 바꾸고 연결된 세션을 끊고 연결된 커넥션을 끊고하는 모든 일련의 과정을 함수 하나로 제공해준다. CRUD로 기본적으로 반복되는 작업들을 단순하게 도와준다. 영속성 컨텍스트 영속성: 데이터 -> 영구적으로 저장! DB -> MySQL로 컨텍스트: context 자바가 처리하는 모든 메타데이터 정보를 영속성 컨텍스트가 들고있다.결론은 자바와 DB 둘다 영속성 컨텍스트를 통해서 데이터가 서로에게 전달이 된다. 영속성 컨텍스트에 있는 일들은 모두 자동으로 처리가 된다. JPA는 DB와..

Spring/SpringBoot 2022.05.06

네이티브 쿼리

JPA가 SQL query를 그대로 사용하는 네이티브 쿼리를 지원한다. 하지만 가급적 네이티브 쿼리는 사용하지 않는게 좋다. 최근에 나온 final 방법 => 스프링 데이터 Projections 활용 스프링 데이터 JPA 기반 네이티브 쿼리 페이징 지원 반환 타입 Object[] Tuple DTO(스프링 데이터 인터페이스 Projections 지원) 제약이 있는데 Sort 파라미터를 통한 정렬이 정상 동작하지 않을 수 있고 JPQL처럼 Application loading 시점에 문법 확인이 불가하고 동적 쿼리가 불가능하다. // MemberRepository Interface @Query(value = "select * from member where username = ?", nativeQuery = ..

Projections

DB에서 엔티티를 조회하고 싶을 때도 있지만 회원의 이름만 조회하고 싶을때가 있다. JPA를 통해서 조회를 하게되면 엔티티를 통채로 조회하게 되면 쿼리의 데이터가 엄청 커지게 된다. 이름만 조회를 하고 싶을때 편하게 하는 방법을 Projections라고 한다. 쿼리에 SELECT절에 들어갈 데이터라고 보면 된다. UsernameOnly Interface를 만들고 package study.datajpa.repository; public interface UsernameOnly { String getUsername(); } MemberRepository Interface에 아래구문을 추가해준다. // 엔티티가 아니라 인터페이스 UsernameOnly에 구현체 프록시 객체가 담겨서 간다. List findPr..