개발일지

JPA Relation 속성 본문

JPA

JPA Relation 속성

devbh 2020. 1. 9. 11:18
  • CascadeType

    • PERSIST

      • 지정한 Entity에 영속성을 부여한다.

      • 엔티티 A, B가 있다. A 엔티티에 B 엔티티의 관계를 설정(OneToOne, OneToMany 등)한다. cascade = CascadeType.PERSIST의 속성을 부여하면 A 엔티티에 B 엔티티를 등록하면 자동으로 B 엔티티를 등록한다. 따로 B 엔티티를 등록할 필요가 없다.

      • // 1. 속성 부여 전
        A a = new A();
        a.setB(bRepository.save(new B())); // B를 따로 등록한 후에 A에 등록한다.
        aRepository.save(a);
        
        // 2. 속성 부여 후
        A a = new A();
        a.setB(new B()); // new B로 바로 등록하면 자동으로 B가 등록된다.
        aRepository.save(a);
        
    • MERGE

      • 지정한 Entity에 상태를 병합시킨다.

      • List<A> result = aRepository.findAll();
        
        A a = result.get(3);
        a.getB().setData("new Data"); // MERGE를 하면 관계되어 있는 B엔티티에 값이 들어간다. MERGE를 하지 않을 경우 값이 들어가지 않는다.
        
        aRepository.save(a);
        aRepository.findAll().forEach(System.out::println);
    • REMOVE

      • 지정한 Entity도 값이 삭제된다.

      • aRepository.delete(a);
        aRepository.findAll().forEach(System.out::println);
        bRepository.findAll().forEach(System.out::println);
        
        // 1. REMOVE 지정 전
        // A만 삭제된다.
        // 2. REMOVE 지정 후
        // A, B 가 같이 삭제된다.
  • FetchType

    • default값은 EAGER 이다.
    • fetch = FetchType.EAGER
      • 한방 쿼리로 select한다.
      • left outer join 으로 select 한다.
    • fetch = FetchType.LAZY
      • 지정한 관계의 값이 호출될 때 select한다.
      • 불필요한 쿼리 호출을 줄이는 데 도움이 된다.
  • optional

    • default값은 true 이다.
    • false일때 지정한 값은 항상 필요한 값이다.
    • 값이 없다면 에러가 발생한다.
    • inner join 으로 실행된다.
  • orphanRemoval

    • orphanRemoval = true속성을 추가한다.

    • a.setB(null);
      aRepository.save(a);
      aRepository.findAll().forEach(System.out::println);
      bRepository.findAll().forEach(System.out::println);
      
      // 1. 설정 전
      // A에서만 B값만 null이 되고 B의 값은 삭제되지 않는다.
      // 2. 설정 후
      // A에서 B값이 null이 되고 B의 값도 삭제된다.

'JPA' 카테고리의 다른 글

JPA  (0) 2019.12.30
Comments