반응형 Spring 사전 준비/JPA Hibernate28 [JPA] 복합 값 타입과 불변 객체 1. 복합 값(임베디드) 타입 아래 포스팅의 [3-3)@EmbeddedId 방식]과 사용 방법이 비슷하다. 아래 포스팅에서는 복합 키(@EmbeddedId)를 다룬 것이고, 이번 포스팅에서는 키가 아닌 복합 값(@Embedded)을 다룰 것이다. https://kimcoder.tistory.com/486 [JPA] 고급 매핑 기술 1. 객체의 상속 관계 매핑 - 객체의 상속 구조와 DB의 슈퍼타입-서브타입 관계를 매핑하는 것이다. 1) 조인 전략 (1) 특징 - 엔티티들을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키 kimcoder.tistory.com 임베디드 타입은 엔티티와 달리 식별자라는 개념이 없다.★ 예를 들어, Member 엔티티에 다음과 같은 정보들이 들어있다고 하자. Memb.. 2022. 8. 3. [JPA] CASCADE 기능 JPA에서 엔티티를 저장할 때 모든 연관 엔티티는 영속 상태로 지정되어 있어야 한다. JPA에서는 이런 번거로움을 위해 부모만 영속 상태로 만들면 연관 엔티티까지 한 번에 영속 상태로 만드는 CASCADE 기능을 제공한다. 1. 영속성 전이 1) 영속성 전이란? - 부모의 영속 상태를 연관(자식) 엔티티까지 한 번에 적용하는 기능 2) 설정법 - 다음과 같이 엔티티에서 매핑 어노테이션의 cascade 속성을 이용하면 된다. @OneToMany(..., cascade=CascadeType.PERSIST) // cascade={...}와 같이 중괄호를 활용하여 여러 속성을 같이 사용할 수도 있다. private List children = new ArrayList(); - CASCADE의 종류는 다음과 같다.. 2022. 8. 3. [JPA] 즉시 로딩과 지연 로딩 1. 즉시 로딩 1) 즉시 로딩 기법이란? - JOIN으로 한 번에 연관된 객체까지 미리 조회하는 방법 - @ManyToOne(fetch=FetchType.EAGER) 으로 설정한다. 2) JOIN 방식 - 즉시 로딩에서는 기본적으로 LEFT OUTER JOIN을 이용하여 조인한다. 그 이유는 외래 키가 NULL일 위험성 때문인데, 외래 키가 NULL이면 현재 엔티티도 조회되지 않는다. - 엔티티의 외래 키에 다음과 같이 NOT NULL을 설정하면 JPA는 외부 조인 대신에 내부 조인을 사용한다. @ManyToOne(fetch=FetchType.EAGER) @JoinColumn(... , nullable=false) private Team team; 또는 optional 옵션으로 지정할 수도 있다. @M.. 2022. 8. 1. [JPA] 프록시 객체 1. 프록시 객체란? - 실제 엔티티 객체 대신에 DB 조회를 지연할 수 있는 가짜 객체 - 연관 객체가 실제로 사용될 때만 DB에서 로딩해주는 지연 로딩을 이용할 때 필요하다. - 글로벌 fetch 전략을 FetchType.LAZY로 지정한 필드에 자동으로 적용되며, 프록시 객체를 직접 생성할 수도 있다. 2. 프록시 객체의 동작 1) 프록시 객체의 직접 생성 - EntityManager의 getReference() 메소드를 이용하면 DB 접근을 위임한 프록시 객체를 반환한다. Member member = em.getReference(Member.class, "member1"); - 프록시 클래스는 실제 클래스를 상속 받아서 만들어진다. 이 때 실제 객체에 대한 참조를 보관하며, 프록시 객체의 메소드를.. 2022. 8. 1. [JPA] 고급 매핑 기술 1. 객체의 상속 관계 매핑 - 객체의 상속 구조와 DB의 슈퍼타입-서브타입 관계를 매핑하는 것이다. - 부모 엔티티를 조회하면 그 자식 엔티티도 함께 조회된다. 1) 조인 전략 (1) 특징 - 엔티티들을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 그대로 받아서 기본 키이자 외래 키로 사용하는 전략이다. - @Inheritance의 strategy 속성을 InheritanceType.JOINED로 지정하면 된다. (2) 장점 - 테이블이 정규화된다. - 외래 키 참조 무결성 제약조건을 활용할 수 있다. (3) 단점 - JOIN이 많이 사용되기 때문에 복잡하고 조회 성능이 저하될 수 있다. - 데이터를 등록하는 INSERT문이 2번 실행된다. (4) 예시 - 부모 테이블 ITEM이 자식 .. 2022. 7. 28. [JPA] 일대일 매핑과 다대다 매핑 1. 일대일 매핑 1) 특징 - 둘 중 어느 곳에나 외래 키를 가질 수 있다. - 객체 매핑에 @OneToOne 어노테이션을 사용하고 DB의 외래 키에는 유니크 제약 조건을 건다. - 예시로 직원과 사물함의 관계가 있다. 2) 외래 키 전략 (1) 주 테이블에 외래 키를 두는 방법 - 외래 키를 객체 참조와 비슷하게 사용할 수 있음 (2) 대상 테이블에 외래 키를 두는 방법 - 테이블 관계가 일대일에서 일대다로 변경되어도 테이블의 구조를 유지하기 쉬움 - 단방향으로는 불가능한 전략이기 때문에 양방향으로 서로 참조하고 있어야 한다. 2. 다대다 매핑 1) 특징 - 일반적으로 연결 엔티티를 추가하여 일대다/다대일 관계로 분리한다. - 결론부터 말하자면, [4) 연결 엔티티에 새로운 기본 키를 부여하는 방식].. 2022. 7. 26. [JPA] 단방향 매핑과 양방향 매핑 테이블 환경에서는 JOIN문을 이용하여 두 테이블간의 양방향 매핑이 가능하지만, 객체 환경에서라면 말이 달라진다. 그렇다면 객체에서는 어떻게 단방향/양방향 매핑을 구현할 수 있는지 알아보자. 참고로, JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다는 점에 주의하자. 1. 단방향 매핑 단순히 객체의 멤버로 객체를 지정하면 된다. package com.example.jpastudy.entity; import lombok.Getter; import lombok.Setter; import javax.persistence.*; @Entity @Getter @Setter public class Member { @Id @GeneratedValue private Long id; @Column(n.. 2021. 8. 18. [JPA] EntityManager / persistence.xml 이번 포스팅에서는 실제로 JPA를 이용하여 간단한 트랜잭션 체계를 만들어볼 것이다. 1. EntityManager와 EntityManagerFactory 예제에 들어가기 전에 알아둬야 할 클래스들이다. 1) EntityManager (1) 역할 - Entity의 생명 주기와 트랜잭션 등을 관리하며, 영속성 컨텍스트에 접근하는 객체다. - 가급적 쓰레드 간에 공유해서는 안되고(동시성 문제), 사용하고 나면 바로 버려야 함 - 컨테이너가 관리하는 EntityManager(JavaEE와 서버 필요)와 애플리케이션이 관리하는 EntitiyManager(JavaEE와 JavaSE에서 모두 사용 가능)로 나뉨 (2) 메소드 find(Class entityClass, Object primaryKey) - SELECT.. 2021. 8. 16. [JPA] Entity Annotations ※ JPA 어노테이션들은 javax.persistence 패키지에 있다. 1. @Entity 1) 설명 : DB랑 매핑하는 클래스 2) 속성 - name 속성으로 JPA에서 사용할 엔티티 이름을 지정할 수 있으며, 생략하면 클래스 이름을 사용한다. 다른 패키지에 이름이 같은 엔티티 클래스가 있을 때 충돌을 막기 위해 사용할 수 있다. 3) 주의 사항 - 생성자는 필수로 있어야 한다. 자바에서는 생성자를 따로 직접 만들지 않았다면 기본 생성자를 자동으로 만들어준다. - final, enum, interface, inner 클래스에는 사용할 수 없다. - 필드에 final을 사용할 수 없다. 2. @Table 1) 설명 : 엔티티 클래스에 매핑할 테이블 정보를 설정 2) 속성 (1) name : 매핑할 테이.. 2021. 8. 16. 이전 1 2 3 4 다음