목록JPA (52)
BE전문가 프로젝트
Member를 조회할 때 Team도 함께 조회해야 할까? 지연 로딩 LAZYY을 사용해서 프록시 조회 @Entity public class Member extends BaseEntity{ @Id @GeneratedValue private Long id; @Column(name="USERNAME") private String username; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="TEAM_ID") private Team team; @OneToOne @JoinColumn(name="LOCKER_ID") private Locker locker; } FetchType.Lazy를 설정해준다면 해당 엔티티는 Proxy객체를 가져온다. 따라서 memberCla..
프록시 기초 JPA에는 데이터를 가져올 때 em.find() 뿐만 아니라 em.getReference()라는 메소드가 존재한다. - em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 - em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시)엔티티 객체 조회(데이터를 조회시 select 쿼리가 나가지 않음) public class JPAMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx ..
요구사항 상품의 종류는 음반, 도서, 영화가 있고 이후 더 확장될 수 있다. 모든 데이터는 등록일과 수정일이 필수다. 상속관계 만들기 @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn public abstract class Item { @Id @GeneratedValue @Column(name="ITEM_ID") private long id; private String name; private int price; private int stockQuantity; @ManyToMany(mappedBy = "items") private List categories = new ArrayList(); } Item 클래스만 단독..
공통 매핑 정보가 필요할 때 사용(id, name) - 테이블은 따로 사용하고 싶은데 객체 입장에서 따로 공통 정보만 상속 받아서 사용하고 싶을 때 상속관계 매핑X 엔티티X, 테이블과 매핑X 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공 조회, 검색 불가(em.find(BaseEntity) 불가) 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장 @MappedSuperclass public abstract class BaseEntity { private String createdBy; private LocalDateTime createdDate; private String lastModifiedBy; private LocalDateTime lastModifiedDate; } @Entity ..
객체에는 상속 관계가 있지만 관계형 데이터베이스는 상속 관계X 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 음반, 영화, 책의 공통 속성인 이름, 가격을 물품에 분류한다 각각 가지고 있는 특성은 밑에 따로 분류한다. 객체에서는 왼쪽 그림과 같이 명확하게 상속 관계를 가지고 있다 슈퍼타입 서브타입 논리 모델을 실제로 물리 모델로 구현하는 법 각각 테이블로 변환 -> 조인 전략 통합 테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 JPA에서는 위에 3가지방법 모두 지원한다 주요 Annotation @DiscriminatorColumn(name="DTYPE") @Discrim..
@JoinColumn 외래 키를 매핑할 때 사용 속성 설명 기본값 name 매핑할 외래 키 이름 필드명 + _ + 참조하는 테이블의 기본 키 컬럼명 referencedColumnName 외래 키가 참조하는 대상 테이블의 컬럼명 참조하는 테이블의 기본키 컬럼명 foreignKey(DDL) 외래 키 제약조건을 직접 지정할 수 있다. 이 속성은 테이블을 생성할 때만 사용한다. unique nullable insertable updatable columnDefinition table @Column과 속성이 같다 @ManyToOne 다대일 관계 매핑 속성 설명 기본값 optional false로 설정하면 연관된 엔티티가 항상 있어야 한다 Ture fetch 글로벌 페치 전략을 설정한다. @ManyToOne=Fet..
배송, 카테고리 추가 - 엔티티 주문과 배송은 1:1(@OneToMany) 상품과 카테고리는 N:M(@ManyToMany) 배송, 카테고리 추가 - ERD 주문과 배송 1:1관계 Order가 연관관계의 주인인 관계 @Entity @Table(name = "ORDERS") //ORDERS는 ORDER BY라는 명령어가 있기 떄문에 S를 붙여준다 public class Order { @Id @GeneratedValue @Column(name="ORDER_ID") private long id; @ManyToOne @JoinColumn(name="MEMBER_ID") private Member member; @OneToOne @JoinColumn(name = "DELIVERY_ID") private Delive..
일대일 관계 일대일 관계는 그 반대도 일대일 주 테이블이나 대상 테이블 중 외래 키 선택 가능 외래 키에 데이터베이스 유니크(UNI)제약조건 추가 일대일: 주 테이블에 외래 키 양방향 정리 다대일 양방향 매핑 처럼 외래 키가 있는 곳이 연관관계의 주인 반대편은 mappedBy적용 Member와 Locker 중 Member가 연관관계 주인일 때 @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name="USERNAME") private String username; @ManyToOne @JoinColumn(name="TEAM_ID") private Team team; @OneToOne @JoinColumn(name="LO..