JPA/JPA 22

OneToOne Entity

부모 Entity 조회 // OneToOne 관계의 경우 Lazy 로딩이 정상 동작하지 않는 경우가 많다. // lazy 로딩이 정상동작하기 위해선 특정 조건을 충족해야한다. // lazy 로딩 발생 jpaUserRepository.findAll() .stream() .map(user -> // Model 데이터 매핑 User.builder() .userId(user.getId()) .name(user.getName()) .build(); ).forEach(user -> System.out.println(user.toString())); // Lazy 로딩이 발생하지 않는다.(JPQL 사용) em.createQuery( "select new com.test.react.Model.User(u.id, u.n..

JPA/JPA 2020.06.09

변경 감지와 병합(merge)

준영속 엔티티 영속성 컨텍스트가 관리하지 않는 엔티티로 update해도 데이터는 변경되지 않음. 임의로 만들어낸 엔티티 Book book = new Book(); book.setId(form.getId()); book.setName(form.getName()); 준영속 엔티티 수정하는 방법(병합 사용은 추천하지 않음) 변경 감지 기능 사용(Dirty Checking), setter 대신 함수를 이용해서 변경하도록 하라 tem findItem = itemRepository.findOne(itemId); findItem.setPrice(bookParam.getPrice()); findItem.setName(bookParam.getName()); findItem.setStockQuantity(bookParam..

JPA/JPA 2020.06.09

JPA에서 사용하는 다양한 API

JPA에서 사용하는 다양한 API JPQL QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL(객체 지향 SQL) 엔티티 중심으로 개발 검색에도 테이블이 아닌 엔티티 객체를 대상으로 검색 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL 필요 EntityManager.find() 객체 그래프 탐색(a.getB().getC()) ANSI 표준 문법은 모두 지원 동적 쿼리 생성이 매우 어려움 JPQL은 엔티티 객체를 대상으로 쿼리 List resultList = em.createQuery( "select m from Member m where m.username like '%kim%'", // 테이..

JPA/JPA 2020.06.09

JPA 의 데이터 타입 분류

엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 추적 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없으므로 변경시 추적 불가 불변 객체로 만들어야 부작용을 피할수 있다. 값 타입은 공유하면 안됨 기본 타입(primitive type) 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 생명주기를 엔티티에 의존 회원을 삭제하면 이름, 나이 필드도 함께 삭제 회원 이름 변경시 다른 회원의 이름도 함께 변경되면 안됨 기본 타입은 항상 '값'을 복사므로, 공유되지 않음 임베디드 타입(embedded type, 복합 값 타입) 새로운 값 타입을 직접 정의할 수 있음. 주로 기본 값 타입을..

JPA/JPA 2020.06.09

영속성 전이(CASCADE)

영속성 전이(CASCADE) ** 특정 엔티티가 개인 소유일 때 사용 자동 영속 상태 변환을 하려는 엔티티가 다른 연관관계가 있을 경우 사용하면 안된다. 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 변환 ALL, PERSIST 위주로 사용함. @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List childList = new ArrayList(); Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); // em.persi..

JPA/JPA 2020.06.09

즉시 로딩과 지연 로딩

지연 로딩 @ManyToOne(fetch = FetchType.LAZY) 해당 객체는 프록시 객체로 생성되며, get 할때 쿼리를 수행하여 가져옴. @BatchSize(int) 로 쿼리를 하나만 수행하게 할 수 있다. 즉시 로딩 @ManyToOne(fetch = FetchType.EAGER) 연관된 엔티티 객체 조회시 하나의 쿼리로 조회하며, 엔티티 객체가 된다. JPQL에서 (1 + N) 문제를 일으킨다.(호출하지 않은 쿼리도 EAGER 매치가 된 객체 쿼리가 수행됨) 따라서 상상하지 못한 쿼리가 수행됨. *** 실무에서는 지연 로딩을 사용하라 @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> 지연 로딩으로 설정 @OneToMany, @ManyToMany는 기본이 지연 로딩 JPQL fe..

JPA/JPA 2020.06.09

객체와 테이블 연관관계 매핑

객체와 테이블 연관관계 매핑 테이블 지향 모델링인 경우 객체 지향적이지 않음. 객체 연관관계 사용해야함. 단방향 연관관계 @ManyToOne - 1:N 관계 @JoinColumn(name ="") - 양방향 연관관계 - 양쪽에서 참조하도록 작업 ** mappedBy - 객체 연관관계 = 2개(양방향이라 부름) - 회원 -> 팀 - 팀 -> 회원 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야함 테이블 연관관계 = 1개 외래키 하나로 두 테이블의 연관관계 관리 양방향 매핑 규칙 - 객치의 두 관계자중 하나를 연관관계의 주인으로 지정 - 연관관계의 주인만이 외래 키를 관리(등록, 수정) - 주인이 아닌 쪽은 읽기만 가능 - 주인은 mappedBy 속성 사용 X - 주인이 아니면 mappedBy ..

JPA/JPA 2020.06.09

엔티티 매핑

엔티티 매핑 객체 - 테이블 : @Entity, @Table 필드 - 컬럼 : @Column 기본 키 : @Id 연관관계 매핑 : @ManyToOne, @JoinColumn ** JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 기본 생성자 필수 final 클래스, enum, interface, inner 클래스 사용 X 저장할 필드에 final X 기본키 매핑 @Id 직접할당 @GeneratedValue IDENTITY - commit 이전에 키값 확인이 불가능하다. - JPA 에서 persist 하는 순간 INSERT 쿼리를 자동 수행한다. 따라서 persist 이후 해당 객체에 키값을 자동으로 넣어준다. SEQUENCE - persist 하는 순간 select sequenct 쿼리를 수..

JPA/JPA 2020.06.09