JPA

sung eon·2023년 2월 14일
0

초록색 - 자바 객체,
빨간색 - 엔티티 객체(테이블객체)
어노테이션 설정 목적- 엔티티 한 행과 객체하고 항상 같은 값을 유지하기 위해서 쓴것.

테이블간의 관계만 연결되어있고
객체와 객체의 관계를 연결해줘야한다.

한테이블에서 다른 테이블을 찾을 수 있도록
게시글 하나를 쓴 고객은 누구다 하고 찾을 수 있도록,
고객 한사람이 쓴 게시글은 어떤것들이다 하고 찾아낼 수 있도록...!
엔티티와 엔티티들과의 관계(테이블과의 관계) - 이미 양방향 처리가 되어있다.

자 이제 엔티티간의 관계는 무조건 양방향이 아니다.
우리가 설정을 해줘야하는데
단방향인지 양방향인지 설정해줘야한다.

게시글 입장에서 쓴 고객이 누구인지 찾게
고객 입장에서 한 고객이 어떤 게시글들을 썼는지 has-a관계로 표시...
한쪽에서만 바라보기 때문에 단방향 연관관계라고 한다.
(한쪽에서 다른 한쪽을 has-a 관계로 갖고 있는 경우)

  • 양방향이 어려워서 단방향을 추천.

양방향 관계
게시글을 쓴 고객이 누구인지 has-a
고객이 쓴 게시글들이 어떤것들이 있는지 has-a 관계로 표시..


단방향

엔티티 객체와 엔티티 객체 사이에 단방향이든, 양방향이든 관계를 표시해줘야한다.
그런데, 누가 누구를 has-a로 갖게 할까?

  • 화면 구성에서 부터 도출이 된다.
    • join 구문을 도출하면서 has-a 관계를 도출해보자.
    • 많이쓰이는 join 구문을 보면 어느쪽에서 has-a를 갖는것이 빈번하게 이루어지는 지 봐야한다.

      예) 게시판 b, 고객 c
      b 클래스가 c 클래스를 has-a 로 가질 때

      으아아악

      에러

      • BeanCreationException: Error creating bean with name
        엔티티 매니저가 hibernate context를 관리해주는데 그걸 만들지 못함!
      • Unable to build Hibernate SessionFactory;
      • Could not determine type for: com.my.entity.C, at table: b_tbl, for columns: [org.hibernate.mapping.Column(bc)]
        @Column 어노테이션을 설정하지 않으면 멤버변수와 같은 이름의 컬럼이 자동 만들어진다.
        오라클에서 C 클라스의 타입을 어떤걸로 매핑해야할 지 모르겠다.

해결 @ManyToOne
b 클래스는 Many, c 클래스는 One의 입장이다.

B 테이블에 컬럼이 하나 만들어져있음

  • BC_C_ID 같은 컬럼명이 아닌 다른 컬럼명을 쓰고싶다면,


Junit 테스트

  • @SpringBootTest 잊지말자!
  • application에서 테이블 create -> update로 바꾼 뒤에 실행
    • select gn insert*3 구문이 잘 실행된 걸 볼 수 있다.
  • B save 테스트

isEmpty() 비었는가 - null인 경우
isPresent() 존재하는가 - null이 아닌경우


에러

find() 할 때 그 즉시 자식 자료를 가지고 오고 싶다면 기본 fetch 값을 eager로 바꿔야한다.

  • select 구문
    • b와 c 테이블 조인해서 가져왔다. 근데 r테이블은 조인이 된걸 볼 수 없다.
      • 왜냐하면 b 테이블이 부모입장에서 r들을 가지고 있기 때문이다
    • b와 c 관계에서 b가 자식으로서 알아서 부모를 찾아간것.
  • @ManyToOne 의 default fatch 값이 eager
    • fatch: 붙이다. 이 엔티티와 연관되어있는 다른 객체를 붙인다 = eager (persistence context)
      • eager는 select 작업시에 필요한 연관된 자료(관계가 있거나 부모테이블)를 그 즉시 붙여온다 라는 뜻.
      • 자동 조인 설정이 된다.
    • 자식은 부모의 정보를 가지고 있어야 한다.
  • @OneTOMany 의 default fatch 값이 lazy
    • 나중에 붙여온다
    • 부모입장에서 모든 자식의 정보를 다 가지고 올 필요는 없기 때문에!
      fetch 값을 eager로 설정!
    • 만약 fetch = FetchType.EAGER를 안쓰고 싶다면, 메서드 위에 @Transactional @Commit을 추가하면 된다
  • iner join
  • left outer join
    • 자식 테이블을 강제 fetch해서 left outer join인지 확인
      • 그래야 글은 있는데 댓글이 없는 경우까지 볼 수 있다.
  • cascade 속성 추가
    • 1차 캐시 안쪽으로 메인 객체가 들어올 때 메인 객체와 has-a 관계로 있는 애들도 같이 1차 캐시로 들어올래, 아니면 안들어오게 할래를 정할 수 있다.
    • 엔티티 객체와 관계를 가지고 있는 멤버변수들을 같이 옮길래? 아니면 별개로 관리할래
      • cascade = CascadeType.PERSIST:
        메인 객체가 1차 캐시로 관리될 때 has-a 관계도 같이 1차 캐시로 관리할거야
      • cascade = CascadeType.REMOVE:
        메인 객체가 remove 상태가 될 때 has-a 관계의 멤버변수도 같이 remove 상태로
      • cascade = CascadeType.ALL:
        메인 객체와 has-a 관계를 가진애들을 모든 상태를 같이 이동할거야
        • 제일 일반적
profile
코베베

0개의 댓글