분류 전체보기 126

[JAVA] 즉시로딩과 지연로딩

지연로딩 Member만 조회하고 싶은데 굳이 Team까지 가져와야하나?? 지연로딩 사용! 지연로딩 : Member만 조회해옴! LAZY를 사용해서 프록시로 조회 /* Member.java */ @ManyToOne(fetch = FetchType.LAZY) // Member 클래스만 DB에서 조회한다. @JoinColumn private Team team; /* Main.java */ Team team = new Team(); team.setName("teamA"); em.persist(team); Member member1 = new Member(); member1.setUsername("member1"); member1.setTeam(team); em.persist(member1); em.flush()..

JAVA 2022.01.05

[JAVA] 프록시

em.find() VS em.getReference() em.find() : DB를 통해서 실제 엔티티 객체 조회 (DB에 쿼리 나감) em.getReference() : DB 조회를 미루는 가짜(프록시) 엔티티 객체 조회(DB에 쿼리가 안나가는데 객체가 조회됨) Member member = new Member(); member.setUsername("hello"); em.persist(member); em.flush(); em.clear(); // 영속성 컨텍스트 초기화 Member findMember = em.getReference(Member.class, member.getId()); System.out.println("findMember = " + findMember.getClass()); // ..

JAVA 2022.01.04

[JAVA] @MappedSuperclass

공통 매핑 정보가 필요할 때 사용한다.( id, name 과 같은 ) : DB 에서는 다른 컬럼이지만 객체에서 반복적으로 사용될때 ( 귀찮음을 줄이기 위한 것 ) 상속관계 매핑 불가. 엔티티, 테이블과 매핑이 불가하다 부모클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다. 조회, 검색이 불가(em.find(BaseEntity) X) 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장 예시 ) 만약 Member와 Team 테이블에 생성한 사람, 생성날짜, 수정한 사람 , 수정 날짜 를 공통적으로 사용하고 싶다면? 1. BaseEntity 생성 package hellojpa; import javax.persistence.MappedSuperclass; import java.time.LocalDateT..

JAVA 2022.01.04

[JAVA] JPA 고급 매핑 (상속 관계 매핑)

상속관계 매핑 관계형 데이터 베이스는 상속 관계를 구현 할 수 없다는 단점을 가지고 있다. 그나마 슈퍼타입, 서브타입 관계가 객체 상속과 유사하다. 슈퍼타입, 서브타입 논리모델을 실제 물리 모델로 구현하는 방법 각각 테이블로 변환 : 조인 전략(Joined) 통합 테이블로 변환 : 단일 테이블 전략 서브타입 테이블로 변환 : 구현 클래스마다 테이블 전략 매핑 시 주로 사용하는 어노테이션 1. @Inheritance(strategy=InheritanceType.XXXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테이블 전략 TABLE_PER_CLASS : 구현 클래스마다 테이블 전략 2. @DiscriminatorColumn(name="DTYPE") → default가 DTYPE 3. @..

JAVA 2021.12.16

[JAVA] JPA 다양한 연관관계 매핑

연관관계 매핑 시 고려사항 3가지 다중성 : 일대일, 일대다, 다대일, 다대다 단방향, 양방향 연관관계 주인 다중성 ※ 보통 일대다, 다대일 이런 경우 맨 앞에 있는 애가 연관관계 주인이다. 1. 다대일 외래키는 항상 다대일 중 '다' 쪽에 존재한다. 따라서 객체 양방향 관계에서 연관관계의 주인은 항상 '다' 쪽이다. 양방향에서 '다' 쪽인 Member테이블이 Team 에 관한 외래키를 가지고 있으므로 연관관계의 주인이다. 2. 일대다 다대일 관계의 반대방향이다. 일대다에서는 엔티티를 하나 이상 참조 가능하므로 Collection, List, Map 중 하나 사용해야 한다. (실무에서 잘 사용하지 않는다.) '일' 이 연관관계의 주인이다. 2-1. 단방향 하나의 팀은 여러 회원을 참조 할 수 있다. (팀..

JAVA 2021.12.09

[JAVA] JPA 연관관계 매핑( 양방향 )

양방향 연관관계 @OneToMany, @ManyToOne 을 예로 들 수 있다. 객체에는 양방향이 없다. ( 단방향 두개를 잘 묶어서 양방향인 것 처럼 보이게 할 뿐! ) 그럼 객체의 경우 단방향 두개 중 외래 키 관리를 누가 해야할까?? → 연관관계의 주인(Owner) 가 외래키를 관리! 양방향 연관관계 매핑의 규칙 객체의 두 관계 중 하나를 연관 관계의 주인으로 지정( 외래키 소유주를 주인으로 하는 걸 권장 ) 일대 다 기준에서 보통 '다' 쪽이 연관관계의 주인이다. 연관관계 주인만이 외래 키를 관리(등록, 수정) 한다. ( 주인이 아닌 쪽은 읽기만 가능 ) 주인은 mappedBy 사용 불가 mappedBy 속성으로는 주인의 이름을 지정해준다. Member.java /* 연관관계 주인 */ packa..

JAVA 2021.11.17

[JAVA] JPA 연관관계 매핑( 단방향 )

핵심 : 객체지향스럽게 매핑하는 방법 예제 시나리오 - 회원과 팀이 있다. - 회원은 하나의 팀에만 소속될 수 있다. - 회원(N)과 팀(1)은 다대일 관계이다. 1. 객체를 테이블에 맞추어 모델링( 참조 대신 외래키를 그대로 가져와 사용한다. ) Member.java ( teamId 주목 ) @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @Column(name = "TEAM_ID") private Long teamId; } JpaMain.java package hellojpa; import..

JAVA 2021.11.16

[JAVA] JPA 기본키 매핑

직접 할당 : @Id 자동생성 : @GeneratedValue @GeneratedValue 의 종류 1. IDENTITY 기본 키 생성은 데이터 베이스에 위임해줌 Mysql 의 auto_increment와 기능이 같다. 주로 Mysql , postgreSQL, sql server, DB2에서 사용 identity는 null이 DB에 날라오면 그때 ID 값을 생성하여 DB에 삽입해준다. 제약이 생김 : DB에 넣을때 까지 키 값을 모르기 때문에 1차 캐시에 넣어줄 수가 없다. 따라서 identity만 예외적으로 commit 하기 전 persist 에서 DB에 쿼리를 날려준다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ..

JAVA 2021.11.11

[JAVA] JPA 필드와 컬럼 매핑

요구사항 회원은 일반회원과 관리자로 구분해야 한다. 회원 가입일과 수정일이 있어야 한다. 회원을 설명할 수 있는 필드가 있어야 한다. 이때 필드의 길이는 제한이 없다. 매핑 어노테이션 정리 1. @Column - name : 필드와 매핑할 테이블의 컬럼 이름 ( default = 객체의 필드 이름 ) - insertable, updatable : 등록, 변경 가능 여부 ( default = true ) // 수정 불가능 하게 하고 싶을 때 @Column(name = "name", updatable = false) private String username; - nullable(DDL) : null 값의 허용 여부 , false 시 not null 제약조건 붙음 - unique(DDL) : @Table 의..

JAVA 2021.11.10

[JAVA] JPA 엔티티 매핑 + DB 스키마 자동생성

@Entity @Entity가 붙은 클래스는 JPA가 관리한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 가 필수이다. ※ 주의사항 1. 기본 생성자가 필수이다. (파라미터가 없는 public 또는 protected 생성자) 2. final 클래스, enum, interface, inner 클래스 사용하지 않는다. 3. 저장할 필드에도 final을 사용하지 않는다. package hellojpa; import javax.persistence.Entity; import javax.persistence.Id; // Entity 이름은 기본으로 클래스 명으로 들어감 바꾸려면 -> Entity(name='test') // @Table(name = "MBR") 으로 테이블명을 바꿀수 있음 @Ent..

JAVA 2021.11.10