JPA 영속성 컨텍스트의 특징

  • SpringBoot를 하면서 JPA의 개념적으로 모르고 사용했었기에 정리

영속성 컨텍스트와 식별자 값

  • 영속성 컨텍스트는 엔티티를 식별자 값(@Id로 테이블의 기본 키와 매핑한 값)으로 구분한다.
  • 영속 상태는 식별자 값이 반드시 있어야 한다.
  • 식별자 값이 없으면 예외가 발생한다.

영속성 컨텍스트와 데이터베이스 저장

  • 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영(동기화)한다.(플러시: Flush)

영속성 컨텍스트가 엔티티를 관리할 때 장점

  • 1차 캐시
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연
  • 변경 감지(Dirty Checking)
  • 지연 로딩(Lazy Loading)

엔티티 조회

엔티티 등록

엔티티 수정

엔티티 삭제

'Basic > JPA' 카테고리의 다른 글

[Annotation] @MappedSuperclass  (0) 2020.06.22
[JPA] JPA 연관  (0) 2020.06.16
[JPA] 살펴보기  (0) 2020.06.16

어노테이션 설명

  • 매핑 정보가 상속되는 엔티티에 적용되는 클래스를 지정
  • 매핑된 상위클래스는 별도의 테이블이 없다.
  • @MappedSuperclass가 지정된 클래스는 Entity와 동일한 방법으로 매핑될 수 있다.
  • 매핑은 테이블이 없으므로 하위 클래스에만 적용된다.
  • 슈퍼클래스에 적용되었을 떄, 상속받은 클래스에 상위클래스 테이블의 context를 적용할 수 있다.
  • AttributeOverrideAssociationOverride 어노테이션 또는 해당 XML elements를 사용하여 이러한 하위 클래스에 하여 재정의 할 수 있다.

어노테이션 용도

  • Entity별 공통 요소를 상속 필요성
  • @MappedSuperclass를 이용하여 공통요소를 Super Class에 정의
  • 간소화된 Entity
  • 공통 컬럼명을 override가 필요한 경우 @AttributeOverride로 재정의

예시 코드

@MappedSuperclass
public class Employee {
    @Id
    protected Integer empId;
    @Version
    protected Integer version;
    @ManyToOne
    @JoinColumn(name = "ADDR")
    protected Address address;

    public Integer getEmpId() { ... }

    public void setEmpId(Integer id) { ... }

    public Address getAddress() { ... }

    public void setAddress(Address addr) { ... }
}

 

// Default table is FTEMPLOYEE table
@Entity
public class FTEmployee extends Employee {

    // Inherited empId field mapped to FTEMPLOYEE.EMPID
    // Inherited version field mapped to FTEMPLOYEE.VERSION
    // Inherited address field mapped to FTEMPLOYEE.ADDR fk

    // Defaults to FTEMPLOYEE.SALARY
    protected Integer salary;

    public FTEmployee() {
    }

    public Integer getSalary() { ... }

    public void setSalary(Integer salary) { ... }
}

- @AssociationOverride 어노테이션을 통해 address 속성을 ADDR_ID를 조인컬럼으로 사용

@Entity
@Table(name = "PT_EMP")
@AssociationOverride(name = "address", joincolumns = @JoinColumn(name = "ADDR_ID"))
public class PartTimeEmployee extends Employee {

    // Inherited empId field mapped to PT_EMP.EMPID
    // Inherited version field mapped to PT_EMP.VERSION
    // address field mapping overridden to PT_EMP.ADDR_ID fk
    @Column(name = "WAGE")
    protected Float hourlyWage;

    public PartTimeEmployee() {
    }

    public Float getHourlyWage() { ... }

    public void setHourlyWage(Float wage) { ... }
}

'Basic > JPA' 카테고리의 다른 글

[JPA] CRUD 전략  (0) 2020.07.14
[JPA] JPA 연관  (0) 2020.06.16
[JPA] 살펴보기  (0) 2020.06.16

1. 엔티티 연관

  • 시스템 개발에서 사용되는 구성요소들은 서로 연관을 가진다.

연관관계 매핑 키워드

  • 방향
    • 단방향, 양방향이 있다.
    • 사원 -> 회사 또는 회사 -> 사원과 같이 한 쪽만 참조하는 것을 단방향 관계라고 한다.
    • 사원 -> 회사, 회사 -> 사원과 같이 서로 참조하는 것을 양방향 관계라고 한다.
    • 방향은 객체 관계에서만 존재하고 테이블 관계는 항상 양방향이다.
  • 다중성(Multiplicity)
    • 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)가 있다.
    • 여러 사원은 하나의 회사에 속하므로 사원과 회사는 다대일 관계이다.
    • 하나의 회사는 여러 사원이 소속될 수 있으므로 회사와 사원은 일대다 관계이다.
    • 하나의 회원은 하나의 회원상세 정보만을 가질 수 있으므로 회원과 회원상세는 일대일 관계이다.
    • 하나의 고객은 여러 상품을 구매할 수 있고, 하나의 상품은 여러 고객에게 판매될 수 있으므로 다대다 관계이다.
  • 연관관계의 주인(Owner)
    • 엔티티를 양방향 연관관계로 설정하면 객체 관계의 참조는 둘인데 테이블 외래 키는 하나이다.
    • 양방향 연관관계를 매핑할 때 두 연관관계 중 하나를 연관관계의 주인으로 정해야 한다.
    • 연관관계의 주인은 외래 키를 관리(등록, 수정, 삭제) 할 수 있고 주인이 아닌 쪽은 읽기만 할 수 있다.
    • 연관관계의 주인을 정할 때 mappedBy 속성을 사용하는데 mappedBy 속성을 사용하지 않은 쪽이 주인이 된다.

연관관계 어노테이션

  • @JoinColumn
    • @JoinColumn은 외래키를 매핑할 때 사용, 생략 가능
속성 기능 기본값
name 매핑할 외래 키 이름을 지정한다. 필드명, 참조하는 테이블의 기본키 컬럼명
referencedColumnName 외래 키가 참조하는 대상 테이블의 컬럼명을 지정한다. 참조하는 테이블의 기본키 컬럼명
  • @ManyToOne
    • @ManyToOne은 다대일 관계에서 사용한다. 다중성을 나타내는 어노테이션은 필수
속성 기능 기본값
fetch 글로벌 Fetch 전략을 설정 N:1, 1:1은 FetchType.EAGER이고 1:N은 FetchType.LAZY로 설정
cascade 영속성 전이 기능을 사용한다.
  • @OneToMany
    • @OneToMany은 일대다 관계에서 사용한다.
속성 기능 기본값
mappedBy 연관관계의 주인을 지정
fetch 글로벌 Fetch 전략을 설정 N:1, 1:1은 FetchType.EAGER이고 1:N은 FetchType.LAZY로 설정
casecade 영속성 전이 기능을 사용
  • @ManyToMany
    • @ManyToMany 다대다 관계에서 사용한다.
속성 기능 기본값
mappedBy 연관관계의 주인을 지정
fetch 글로벌 Fetch 전략을 설정 N:1, 1:1은 FetchType.EAGER이고 1:N은 FetchType.LAZY로 설정
casecade 영속성 전이 기능을 사용
  • @JoinTable
    • @JoinTable은 다대다 관계를 일대다, 다대일 관계로 풀어내기 위해 필요한 연결 테이블을 매핑할 때 사용한다.
속성 기능 기본값
name 연결 테이블을 지정한다.
joinColumns 순 방향 엔티티와 매핑할 조인 컬럼 정보를 지정한다.
inverseJoinColumns 역 방향 엔티티와 매핑할 조인 컬럼 정보를 지정한다.

2. 일대다 단방향

  • @OneToMany 어노테이션을 사용하여 일대다 단방향 연관을 설정할 수 있다.

연관관계

  • 관계 정의

    • 상위 클래스는 여러 하위 클래스를 가질 수 있다.
    • 상위 클래스와 하위 클래스는 일대다 관계이다.
  • 객체 연관관계

    • 상위 객체는 List<하위객체> 컬렉션 필드로 하위객체와 연관관계를 맺는다.
    • 상위 객체와 하위 객체는 단방향 관계이다.
    • 상위 객체는 하위 객체에 접근할 수 있는 필드를 갖고 있지만 반대로 하위객체는 상위 객체에 접근할 수 없다.
  • 테이블 연관관계

    • 하위객체의 테이블은 상위객체에 접근할 수 있는 필드 값으로 상위객체 테이블과 연관관계를 맺는다.
    • 하위객체 테이블에서 상위 객체에 접근할 수 있는 필드 값을 통해 하위 객체와 상위 객체를 조인할 수 있고 반대로 상위 객체와 하위객체를 조인할 수있다.
  • 연관관계 매핑

    • @OneToMany: 상위객체와 하위 객체는 일대다 관계이다.
    • @JoinColumn(name = "외래키"): name 속성에는 매핑할 외래 키 이름을 지정한다.
  • 연관관계 구현

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "상위객체의 pk 필드")
private List<하위객체> 하위객체List;

3. 다대일 단방향

  • @ManyToOne 어노테이션을 사용하여 다대일 단방향 연관을 설정할 수 있다.

연관관계

  • 관계정의

    • 여러 하위객체는 하나의 상위객체에 속할 수 있다.
    • 하위객체와 상위객체는 다대일 관계이다.
  • 객체 연관관계

    • 하위객체는 상위객체에 접근할 수 있는 참조 키 필드로 상위객체와 연관관계를 맺는다.
    • 하위객체와 상위객체는 단방향 관계이다.
    • 하위객체는 참조키 필드를 통해 상위객체를 알 수 있지만 반대로 상위 객체는 하위객체를 알 수 없다.
  • 테이블 연관관계

    • 하위객체 테이블은 외래키로 상위객체 테이블과 연관관계를 맺는다.
    • 하위객체 테이블은 외래키를 통해 상위객체와 하위객체를 조인할 수 있고, 반대로 상위객체와 하위객체를 조인할 수 있다.
  • 연관관계 매핑

    • @ManyToOne: 코드상세와 코드그룹은 다대일 관계이다.
    • @JoinColumn(name = "외래키"): name 속성에는 매핑할 외래 키 이름을 지정한다.
  • 연관관계 구현

    • 하위객체 -> 상위객체 다대일 연관
@ManyToOne
@JoinColumn(name = "외래키")
private 상위객체 상위객체;

4. 다대일 양방향

  • @OneToMany와 @ManyToOne 어노테이션을 사용하여 다대일 양방향 연관을 설정할 수 있다.

연관관계

  • 관계정의

    • 상위객체는 여러 코드 상세를 가질 수 있다.
    • 여러 하위객체는 하나의 상위객체에 속할 수 있다.
    • 상위객체와 하위객체는 일대다 관계이다.
    • 하위객체와 상위객체는 다대일 관계이다.
  • 객체 연관관계

    • 하위객체는 외래키 필드로 상위객체와 연관관계를 맺는다.
    • 상위객체는 List<하위객체> 컬렉션 필드로 상위객체와 연관관계를 맺는다.
    • 하위객체와 상위객체는 양방향 관계이다.
    • 하위객체는 외래키필드를 통해서 상위객체에 접근할 수 있고 반대로 상위객체는 하위객체 필드를 통해서 하위객체에 접근할 수 있다.
  • 테이블 연관관계

    • 하위객체 테이블은 외래키로 상위객체 테이블과 연관관계를 맺는다.
    • 하위객체 테이블은 외래키를 통해서 하위객체와 상위객체를 조인할 수 있고, 반대로 상위객체와 하위객체를 조인할 수 있다.
  • 연관관계 매핑

    • @ManyToOne: 코드상세와 코드그룹은 다대일 관계이다.
    • @OneToMany(mappedBy = "상위객체 PK 필드") 상위객체와 하위객체는 일대다 관계이다.
      • mappedBy 속성은 양방향 매핑일 때 사용하는데 반대쪽 매핑의 필드 이름을 값으로 주면 된다.
      • 하위객체 테이블이 외래 키를 가지고 있으므로 SubClass.SuperClass가 주인이 된다.
      • 주인이 아닌 SuperClass.subClass에는 mappedBy = "superClass" 속성을 사용해서 주인이 아님을 설정한다.
    • @JoinColumn(name = "외래키"): name 속성에는 매핑할 외래 키 이름을 지정한다.
  • 연관관계 구현

  1. 하위객체 -> 상위객체 다대일 연관
@ManyToOne
@JoinColumn(name = "외래키")
private 상위객체 상위객체;
  1. 상위객체 -> 하위객체 일대다 연관
@OneToMany(mappedBy = "상위객체의 PK필드", casecade = CasecadeType.ALL, fetch = FetchType.LAZY)
private List<하위객체> 하위객체List;
  1. 연관관계 편의 메서드
public class SuperClass {
    public void addSubClass(SubClass subClass) {
        subClass.setSuperClass(this);
        this.subClass.add(subClass);
    }
}
  • 주종관계란?

5. 일대일 단방향

  • 하나의 회원은 하나의 회원상세를 갖는다.
  • 회원상세 클래스에서 @OneToOne 어노테이션과 @JoinColumn 어노테이션을 사용하여 일대일 단방향 연관을 설정할 수 있다.

연관관계

  • 관계 정의
    • 하나의 회원상세는 하나의 회원에 속할 수 있다.
    • 회원상세와 회원은 일대일 관계이다.
  • 객체 연관관계
    • 회원상세 객체는 member 필드로 회원 객체와 연관관계를 맺는다.
    • 회원상세 객체와 회원 객체는 단방향 관계이다.
    • 회원상세는 member 필드를 통해서 회원을 알 수 있지만 반대로 회원은 회원상세를 알 수 없다.
  • 테이블 연관관계
    • 회원상세 테이블은 user_no 외래 키로 회원 테이블과 연관관계를 맺는다.
    • 회원상세 테이블의 user_no 외래 키를 통해서 회원상세와 회원을 조인할 수 있고, 반대로 회원과 회원상세를 조인할 수 있다.
  • 연관관계 매핑
    • @OneToOne: 회원상세와 회원은 일대일 관계이다.
    • @JoinColumn(name = "user_no"): name 속성에는 매핑할 외래 키 이름을 지정한다.
  • 연관관계 구현
@OneToOne
@JoinColumn(name = "user_no")
private Member member;

6. 일대일 단방향

  • 하나의 회원은 하나의 회원상세를 갖는다.
  • 회원 클래스에서 @OneToOne 어노테이션과 @JoinColumn 어노테이션을 사용하여 일대일 단방향 연관을 설정할 수 있다.

연관관계

  • 관계 정의
    • 하나의 회원은 하나의 회원상세를 가질 수 있다.
    • 회원과 회원상세는 일대일 관계이다.
  • 객체 연관관계
    • 회원 객체는 memberDetail 필드로 회원상세 객체와 연관관계를 맺는다.
    • 회원 객체와 회원상세 객체는 단방향 관계이다.
    • 회원은 memberDetail 필드를 통해서 회원상세에 접근할 수 있지만 반대로 회원상세는 회원에 접근할수 없다.
  • 테이블 연관관계
    • 회원상세 테이블은 user_no 외래 키로 회원 테이블과 연관관계를 맺는다.
    • 회원상세 테이블의 user_no 외래 키를 통해서 회원상세와 회원을 조인할 수 있고, 반대로 회원과 회원상세를 조인할 수 있다.
  • 연관관계 매핑
    • @OneToOne: 회원관 회원상세는 일대일 관계이다.
    • @JoinColumn(name = "user_no"): name 속성에는 매핑할 외래 키 이름을 지정한다.
  • 연관관계 구현
@OneToOne(casecade = CasecadeType.ALL)
@JoinColumn(name = "user_no")
private MemberDetail memberDetail;

7. 일대일 양방향

  • 하나의 회원은 하나의 회원상세를 갖는다.
  • 회원 클래스와 회원상세 클래스에서 @OneToOne 어노테이션을 사용하여 일대일 양방향 연관을 설정할 수 있다.

연관관계

  • 관계정의
    • 회원은 여러 회원상세를 가질 수 있다.
    • 여러 회원상세는 하나의 회원에 속할 수 있다.
    • 회원과 회원상세는 일대일 관계이다.
    • 회원상세와 회원은 일대일 관계이다.
  • 객체 연관관계
    • 회원상세 객체는 member 필드로 회원 객체와 연관관계를 맺는다.
    • 회원 객체는 memberDetail 필드로 회원상세 객체와 연관관계를 맺는다.
    • 회원상세 객체와 회원 객체는 양방향 관계이다.
    • 회원상세는 member 필드를 통해서 회원에 접근할 수 있고, 반대로 회원은 memberDetail 필드를 통해서 회원상세에 접근할 수 있다.
  • 테이블 연관관계
    • 회원상세 테이블은 user_no 외래 키로 회원 테이블과 연관관계를 맺는다.
    • 회원상세 테이블의 user_no 외래 키를 통해서 회원상세와 회원을 조인할 수 있고, 반대로 회원과 회원상세를 조인할 수 있다.
  • 연관관계 매핑
    • @OneToOne: 회원상세와 회원은 일대일 관계이다.
    • @OneToOne:(mappedBy = "member") 회원과 회원상세는 일대일 관계이다.
      • mappedBy 속성은 양방향 매핑일 때 사용하는 데 반대쪽 매핑의 필드 이름을 값으로 주면된다.
      • 회원상세 테이블이 외래 키를 가지고 있으므로 MemberDetail.member가 주인이 된다.
      • 주인이 아닌 Member.memberDetail에는 meppedBy="member" 속성을 사용해서 주인이 아님을 설정한다.
      • @JoinColumn(name = "user_no"): name 속성에는 매핑할 외래 키 이름을 지정한다.
  • 연관관계 구현
  1. MemberDetail -> Member 일대일 연관
@OneToOne
@JoinColumn(name = "user_no")
private Member member;
  1. Member -> MemberDetail 일대일 연관
@OneToOne(mappedBy = "member", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private MemberDetail memberDetail;

8. 다대다 단방향

  • 한 명의 회원은 여러 상품을 구입할 수 있고 하나의 상품은 여러 명의 회원에 팔릴 수 있다.
  • 회원 클래스에서 @ManyToMany 어노테이션을 사용하여 다대다 단방향 연관을 설정할 수 있다.

연관관계

  • 관계 정의

    • 하나의 회원은 여러 상품을 구매할 수 있다.
    • 하나의 상품은 여러 명의 회원에 팔릴 수 있다.
    • 회원과 상품은 다대다 관계이다.
  • 객체 연관관계

    • 회원 객체는 List itemList 컬렉션 필드로 상품 객체와 연관관계를 맺는다.
      • 회원 객체와 상품 객체는 단방향 관계이다.
    • 회원은 items 필드를 통해서 상품에 접근할 수 있지만 반대로 상품은 회원에 접근할 수 없다.
  • 테이블 연관관계

    • 회원 테이블과 상품 테이블과 외래키로 연관관계를 가지는 회원상품 테이블이 생성된다.
    • 회원 테이블은 user_no 외래 키로 회원상품 테이블과 연관관계를 맺는다.
    • 상품 테이블은 item_no 외래 키로 회원상품 테이블과 연관관계를 맺는다.
      • 회원 테이블은 user_no 외래 키를 통해서 회원과 회원상품을 조인할 수 있다.
    • 상품 테이블은 item_no 외래 키를 통해서 상품과 회원상품을 조인할 수 있다.
  • 연관관계 매핑

    • @ManyToMany: 회원과 상품은 다대다 관계이다.
      • @JoinTable.name: 연결 테이블을 지정
      • @JoinTable.joinColumns: 순 방향 엔티티와 매핑할 조인 컬럼 정보를 지정한다.
    • @JoinTable.inverseJoinColumns: 역 방향 엔티티와 매핑할 조인 컬럼 정보를 지정한다.
  • 연관관계 구현

@ManyToMany
@JoinTable(
    name = "user_item",
    joinColumns = @JoinColumn(name = "user_no"),
    inverseJoinColumns = @JoinColumn(name = "item_no"))
private List<Item> items = new ArrayList<>();

9. 다대다 양방향

  • 한 명의 회원은 여러 개의 상품을 구입할 수 있고, 하나의 상품은 여러 명의 회원에 팔릴 수 있다.
  • 회원 클래스와 상품 클래스에서 @ManyToMany 어노테이션을 사용하여 다대다 양방향 연관을 설정할 수 있다.

연관관계

  • 관계 정의

    • 회원은 여러 상품을 구매할 수 있다.
    • 여러 상품은 하나의 회원에 판매될 수 있다.
    • 회원과 상품은 다대다 관계이다.
  • 객체 연관관계

    • 상품 객체는 List members 필드로 회원 객체와 연관관계를 맺는다.
    • 회원 객체는 List items 필드로 상품 객체와 연관관계를 맺는다.
    • 상품 객체와 회원 객체는 양방향 관계이다.
    • 상품은 members 필드를 통해서 회원에 접근할 수 있고, 반대로 회원은 items 필드를 통해서 상품에 접근할 수 있다.
  • 테이블 연관관계

    • 회원 테이블과 상품 테이블과 외래키로 연관관계를 가지는 회원상품 테이블이 생성된다.
    • 회원 테이블은 user_no 외래 키로 회원상품 테이블과 연관관계를 맺는다.
    • 상품 테이블은 item_no 외래 키로 회원상품 테이블과 연관관계를 맺는다.
    • 회원 테이블은 user_no 외래 키를 통해서 회원과 회원상품을 조인할 수 있다.
    • 상품 테이블의 item_no 외래 키를 통해서 상품과 회원상품을 조인할 수 있다.
  • 연관관계 매핑

    • @ManyToMany: 회원과 상품은 다대다 관계이다.
    • @JoinTable.name: 연결 테이블을 지정한다.
    • @JoinTable.joinColumns: 순 방향 엔티티와 매핑할 조인 컬럼 정보를 지정한다.
    • @JoinTable.inverseJoinColumns: 역 방향 엔티티와 매핑할 조인 컬럼 정보를 지정한다.
    • @ManyToMany(mappedBy = "items"): 주인이 아닌 item.members 에는 mappedBy = "items" 속성을 사용해서 주인이 아님을 설정한다.
  • 연관관계 구현

  1. Member -> Item 다대다 연관
@ManyToMany
@JoinTable(name = "user_item",
    joinColumns = @JoinColumn(name = "user_no"),
    inverseJoinColumns = @JoinColumn(name = "item_no"))
private List<Item> items = new ArrayList<>();
  1. Item -> Member 다대다 연관
@ManyToMany(mappedBy = "items")
private List<Member> members = new ArrayList<>();

10. 다대다 연결 엔티티

  • 한 명의 회원은 여러 개의 상품을 구입할 수 있고, 하나의 상품은 여러 명의 회원에 팔릴 수 있다.
  • 회원 상품 연결 엔티티 클래스를 추가하여 회원 클래스와 상품 클래스의 다대다 연관을 해소할 수 있다.

연관관계

  • 관계 정의

    • 회원은 여러 회원상품을 가질 수 있다.
    • 여러 회원상품은 하나의 회원에 속할 수 있다.
    • 회원과 회원상품은 일대다 관계이다.
    • 회원상품과 회원은 다대일 관계이다.
    • 상품은 여러 회원상품에 포함될 수 있다.
    • 여러 회원상품은 하나의 상품에 속할 수 있다.
    • 상품과 회원상품은 일대다 관계이다.
    • 회원상품과 상품은 다대일 관계이다.
  • 객체 연관관계

    • 회원상품 객체는 member 필드로 회원 객체와 연관관계를 맺는다.
    • 회원 객체는 List userItems 컬렉션 필드로 회원상품 객체와 연관관계를 맺는다.
      • 회원상품 객체와 회원 객체는 양방향 관계이다.
      • 회원상품은 member 필드를 통해서 회원에 접근할 수 있고, 반대로 회원은 userItems 필드를 통해서 회원상품에 접근할 수 있다.
      • 회원상품 객체는 Item 필드로 상품 객체와 연관관계를 맺는다.
      • 회원상품은 item 필드를 통해서 상품에 접근할 수 있고, 반대로 상품은 회원상품에 접근할 수 있다.
  • 테이블 연관관계

    • 회원상품 테이블은 user_no 외래 키로 회원 테이블과 연관관계를 맺는다.
    • 회원상품 테이블은 item_no 외래 키로 상품 테이블과 연관관계를 맺는다.
    • 회원상품 테이블의 user_no 외래 키를 통해서 회원상품과 회원을 조인할 수 있고, 반대로 회원과 회원상품을 조인할 수 있다.
    • 회원상품 테이블의 item_no 외래 키를 통해서 회원상품과 상품을 조인할 수 있고, 반대로 상품과 회원상품을 조인할 수 있다.
  • 연관관계 매핑

- @ManyToOne: 회원상품과 회원은 다대일 관계이다.
- @JoinColumn(name = "user_no"): name 속성에는 매핑할 외래 키를 지정한다.
- @OneToMany(mappedBy = "member"): 회원과 회원상품은 일대다 관계이다.
    - mappedBy 속성은 양방향 매핑일 때 사용하는데 반대쪽 매핑의 필드 이름을 값으로 주면된다.
    - 회원상품 테이블이 외래 키를 가지고 있으므로 UserItem.member가 주인이 된다.
    - 주인이 아닌 Member.userItems에는 mappedBy = "member" 속성을 사용해서 주인이 아님을 설정한다.
-   @ManyToOne: 회원상품과 상품은 다대일 관계이다.
    -   @JoinColumn(name = "item\_no"): name 속성에는 매핑할 외래 키 이름을 지정한다.
  • 연관관계 구현
  1. UserItem -> Member 다대일 연관
@ManyToOne
@JoinColumn(name = "user_no")
private Member member;
  1. Member -> UserItem 다대일 연관
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
private List<UserItem> userItems = new ArrayList<>();
  1. UserItem -> Item 다대일 연관
@ManyToOne
@JoinColumn(name = "item_no")
private Item item;

'Basic > JPA' 카테고리의 다른 글

[JPA] CRUD 전략  (0) 2020.07.14
[Annotation] @MappedSuperclass  (0) 2020.06.22
[JPA] 살펴보기  (0) 2020.06.16

JPA 요소

  • 엔티티(Entity)
    • 데이터베이스에서 지속적으로 저장된 데이터를 자바 객체에 매핑한 것
    • 메모리 상에 자바 객체의 인스턴스 형태로 존재하며 EntityManager에 의해 데이터베이스의 데이터와 동기화된다.
  • 엔티티 매니저(Entity Manager)
    • 필요에 따라 Entity와 데이터베이스의 데이터를 동기화한다.
    • EntityManager에서 제공하는 Entity 조작 API를 이용해 Entity에 대해 CRUD 작업을 할 수 있다.
  • 영속성 컨텍스트(Persistence context)
    • 영속성 영구적으로 저장하는 환경이다.
    • 엔티티를 저장하거나 검색할 때 엔티티 관리자는 영속성 컨텍스트에서 엔티티를 저장하고 관리한다.
    • 영속성 컨텍스트에 접근하거나 관리를 하려면 엔티티 매니저를 통해야 한다.

엔티티 상태

상태 설명
비영속(new/transient) 영속성 컨텍스트와 관련이 없는 상태
영속(managed) 영속성 컨텍스트에 저장된 상태
준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된 상태
삭제(removed) 영속성 컨텍스트에서 삭제된 상태

영속성 전이(persistence cascade)

  • 엔티티의 영속성 상태 변화를 연관된 엔티티에도 함께 적용하는 것
  • 엔티티를 저장할 때 연관된 엔티티도 함께 저장하고 엔티티를 삭제할 때 연관된 엔티티도 함께 삭제하는 것

JPA 메서드

기능 설명 Method
목록조회 findAll()
상세조회 findById()
수정 findById() -> optional.isPresent() -> optional.get() -> repository.save()
삭제 deleteById() or findById() -> delete()
전체삭제 deleteAll()
  • deleteById() vs delete()

JPA Annotation

어노테이션 설명
@Entity JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다.
@Entity가 붙은 클래스는 JPA가 관리하는 것으로 엔티티라 부른다.  
@Table @Table은 엔티티와 매핑할 테이블을 지정한다.
생략하면 매핑할 엔티티 이름을 테이블 이름으로 사용한다.  
name 속성을 이용해서 테이블 이름을 지정할 수 있다.  
@Id @Id는 기본 키(Primary Key)를 매핑한다.
@GeneratedValue DB의 식별 컬럼을 사용해서 식별자를 생성하기 위한 어노테이션
@Column @Column은 객체 필드를 테이블 컬럼에 매핑한다.
@Enumerated 열거 타입에 대한 매핑을 설정할 수 있다.
@Temporal java.util.Date 타입을 매핑하는 경우 사용
@CreationTimeStamp 엔티티 생성 시 시점의 날짜 데이터를 기록
@UpdateTimeStamp 엔티티가 업데이트 되는 시점의 날짜 데이터를 기록

Spring Data JPA

  • CrudRepository 인터페이스
Interface CrudRepository<T,ID> extends Repository<T,ID>
메서드 설명
long count() 사용 가능한 엔티티 수를 반환한다.
void delete(T entity) 주어진 엔티티를 삭제한다.
void deleteAll() 저장소에서 관리하는 모든 엔티티를 삭제한다.
void deleteAll(Iterable<? extends T> entities) 주어진 엔티티를 삭제한다.
void deleteById(ID id) 주어진 ID를 가진 엔티티를 삭제한다.
boolean existsById(ID id) 주어진 ID를 가진 엔티티가 존재하는 지 여부를 반환한다.
Iterable findAll() T 타입의 모든 인스턴스를 반환한다.
Iterable findAllById(Iterable ids) 주어진 ID를 가진 T 타입의 모든 인스턴스를 반환한다.
Optional findById(ID id) ID로 엔티티를 검색한다.
S save(S entity) 주어진 엔티티를 저장한다.
Iterable saveAll(Iterable entities) 주어진 엔티티를 모두 저장한다.

참조 사이트 - docs.spring.io

Query Method

  • Spring Data JPA에서 메서드 형식으로 제공하는 쿼리 호출
  • 쿼리 메서드 지원 키워드(Supported Keywords inside method names)
Keyword sample query
And findByLastnameAndFirstname where lastname = ? and firstname = ?
Or findByLastnameOrFirstname where lastname or firstname = ?
Is, Equals findByFirstname, findByFirstnameIs, findByFirstnameEquals where firstname = ?
Between findByStartDateBetween where startDate between ? and ?
LessThan findByAgeLessThan where age < ?
LessThanEqual findByAgeLessThanEqual where age <= ?
GreaterThan findByAgeGreaterThan where age > ?
GreaterThanEqual findByAgeGreaterThanEaual where age >= ?
After findByStartDateAfter where startDate > ?
Before findByStartDateBefore where startDate < ?
IsNull, Null findByAge(is)Null where age is null
IsNotNull, NotNull findByAge(is)NotNull where age not null
Like findByFirstnameLike where firstname like ?
NotLike findByFirstnameNotLike where firstname not like ?
StartingWith findByFirstnameStartingWith where firstname like ?
(parameter bound with appended %)    
EndingWith findByFirstnameEndingWith where firstname like ?
(parameter bound prepended in %)    
Containing findByFirstnameContaing where firstname like ?
(parameter bound wrapped in %)    
OrderBy findByAgeOrderByLastnameDesc where age = ? order by lastname desc
Not findByLastnameNot where lastname <> ?
In findByAgeIn(Collection ages) where age in ?
NotIn findByAgeNotIn(Collection ages) where age not in ?
True findByActiveTrue() where active = true
False findByActiveFalse() where active = false
IgnoreCase findByFirstnameIgnoreCase where UPPER(firstname) = UPPER(?)

'Basic > JPA' 카테고리의 다른 글

[JPA] CRUD 전략  (0) 2020.07.14
[Annotation] @MappedSuperclass  (0) 2020.06.22
[JPA] JPA 연관  (0) 2020.06.16

+ Recent posts