본문 바로가기

jpa16

[JPA] JPQL(Java Persistence Query Language) 문법(2) 1. JPQL 페이징 JPQL을 이용해서 페이징 API 예시를 살펴보겠습니다. List result = em.createQuery("select m from Member m order by m.age desc", Member.class) .setFirstResult(0).setMaxResults(10).getResultList(); order by까지 해야 제대로 페이징되는지 확인 가능합니다. 시작을 1로 주면 offset limit으로 쿼리가 나갑니다. 2. 조인 내부 조인: SELECT m FROM Member m [INNER] JOIN m.team t 외부 조인: SELECT m FROM Member m LEFT [OUTER] JOIN m.team t 세타 조인: select count(m) fro.. 2020. 4. 30.
[JPA] 값 타입 컬렉션 1. 값 타입 컬렉션 이전 포스팅에서 설명한 값 타입을 컬렉션으로 사용하는 방법에 대해서 알아보겠습니다. 값 타입을 하나 이상 저장할 때 사용 @ElementCollection, @CollectionTable 사용 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다. 컬렉션을 저장하기 위한 별도의 테이블이 필요 Member가 favoriteFoods와 addressHistory라는 값 타입 컬렉션을 가지고 있을 때 RDB에서는 favoriteFoods, addressHistory라는 별도의 테이블로 빼서 관리를 합니다. 값 타입을 묶어서 하나의 PK를 만들어냅니다. 여기에 식별자 ID같은 개념을 넣어서 걔를 PK로 쓰게되면, 얘는 값타입이 아니라 ENTITY가 됩니다. 값타입은 값들만 저장하고 PK로 .. 2020. 4. 26.
[JPA] 값타입과 불변 객체 1. 값 타입 공유 참조와 불변객체 값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념입니다. 따라서 값 타입은 단순하고 안전하게 다룰 수 있어합니다. 개발할 때는 값을 복사하는 것에 대해서 신경을 잘 쓰지 않습니다. 왜냐하면 자바세상에서 단순하고 안전하게 설계가 되있기 때문입니다. 임베디드 타입과 같은 값 타입은 여러 엔티티에서 공유할 수 있습니다. 하지만 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험합니다. 사이드 이펙트가 발생합니다. 회원1과 회원2과 같은 주소를 바라보고 있을 때 city값을 NewCity로 바꾸어 버리면 둘다 바뀝니다. 이런 버그는 정말 찾기 힘듭니다. Address address = new Address("city', "street", "10000").. 2020. 4. 26.
[JPA] 임베디드 타입(복합 값 타입) 1. 임베디드 타입 새로운 값 타입을 직접 정의할 수 있음 JPA는 임베디드 타입(embedded type)이라 함 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함 int, String과 같은 값 타입 예를들어서 회원 엔티티는 이름과 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 갖는다고 하겠습니다. 여기서 임베디드 타입을 사용한다면 주소와 관련된 속성들을 임베디드 타입에 모아줄 수 있습니다. 이렇게 한다면 활용성이 높아지겠죠. 임베디드 타입을 이용해서 회사에서 일한 기간을 나타내는 Period와 Address 임베디드 타입을 만들면 다음과 같습니다. 2. 임베디드 타입 사용법 @Embeddable: 값 타입을 정의하는 곳에 표시 @Embedded: 값 타입을 사용하.. 2020. 4. 26.
[JPA] 고아객체 1. 고아객체 고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티 를 자동으로 삭제 orphanRemoval = true Parent parent1 = em.find(Parent.class,id); parent1.getChildren().remove(0); //자식 엔티티를 컬렉션에서 제거 DELETE FROM CHILD WHERE ID=? 고아가 되면 자동으로 삭제됩니다. 즉, 연관관계가 끊어지면 delete 쿼리가 나갑니다. parent에서 child를 관리할 때 remove후 flush가 될때 delete 쿼리가 나갑니다. 이처럼 잘못사용하면 위험합니다. 특정 엔티티가 개인 소유할 때 사용합니다. 또한 아래코드에서 parent를 지우면 자식들이 모두 delete 됩니다. CascadeTyp.. 2020. 4. 22.
[JPA] 영속성전이(CASCADE)와 고아 객체 1. 영속성전이(CASCADE) 특정 엔티티를 속 상태로 만들 때 연관된 엔티티도 함께 속 상태로 만들도 싶을 때 예시: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장. 영속성 전이는 즉시로딩, 지연로딩, 연관관계 세팅과 전혀 관계가 없습니다. 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용합니다. Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(parent); em.persist(child1); em.persist(child2); persist를.. 2020. 4. 22.