ORACLE 엔티티 한 행하고 JVM 객체하고 항상 같은 값을 유지하기 위해서 @Table @Entity 어노테이션 처리를 해준 것
DB테이블간의 관계는 서로 has-a관계를 맺고있다고 할 수있음
-> pk를 이용해서 fk를 찾을수도, fk를 이용해서 pk를 찾을수도 있음
-> 테이블간의 관계는 양방향 관계
객체와 객체간의 관계를 맺어주기 위해서는 따로 처리를 해줘야함
누가 누구를 가질 것인지 고민해봐야 한다.
-> 화면 구성에서부터 도출해야함 -> sql 구문 만들기
-> join 구문에 대한 has-a관계를 설정
-> 어떤 방향에서 join구문을 많이 갖는지를 보고 has-a관계를 설정하는 것이 좋음
-> C_ID와 @ManyToOne
연결을 했더니 b_tbl 테이블에 자동으로 BC_C_ID라는 컬럼이 생겼음.
-> 이런 형식을 원치 않고 b_id 라는 이름으로 변경하고 싶다면 @JoinColumn
으로 설정해주면 된다.
c와의 관계에서 b는 자식역할을 했는데, 이때 사용하는 ManyToOne에서는 default fetch타입이 eager.
SELECT
join으로 여러 테이블을 검사해올 때 그 즉시 연관자료를 붙여서 부모꺼도 같이 가져오도록 설정(eager)lazy : 그 즉시 연관돼있는 다른 자료들을 찾아오지 않고 나중에 붙여옴
onetomany면 부모임.
💡 부모가 자식들의 정보를 바로 찾아올 이유가 없음 그래서 기본설정이
LAZY
💡 자식들은 부모의 자료에 의존하기 때문에 바로 찾아와야 하는것임EAGER
➡︎➡︎ 이를 영속성 전이 라고 한다.
find할때 그 즉시 자식의 자료를 찾아오고 싶다면 OneToMany에 fetch 설정을 해줘야 한다.
↳ fetch설정을 안해주면 lazyException 뜸!!
- fetch를 Lazy로 두고, 테스트 메서드에 @Transactional을 붙여서
autocommit=false
로 둔 후 @Commit annotation을 직접 두고 처리할 수도 있다.!
- 테스트 코드에 넣어주면 되고 Entity는 변화 안줘도 됨
Cascade
- 1차캐시에서 관리되기도하고, 1차캐시에서 나가기도 하는데
이때 1차캐시에서 관리 될 때 has-a관계를 맺고있던 객체들도 같이 나갈래~
아니면 main에만 나가고 나머지 has-a관계를 가지고 있던 애들은 유지할래~
나가있다가 들어올때도 같이 들어올래 아니면 main만 들어올래 등
has-a관계를 맺고있는 멥버변수애들도 별개로 관리할 것인지 같이 관리할것인지를 정하는게 cascade다.- cascade= persist : main객체가 persist상태로 이동(1차캐시로 이동)할때만 has-a관계의 객체들이 따라간다.
- merge, detach 등 있음
- remove : main객체가 remove상태가 될때 has-a관계를 맺는 멤버변수 객체도 remove상태가 되려면 remove로 씀
일반적으로 메인객체와 has-a관계 객체가 같이 이도앟는게 일반적이다.
(cascade=ALL
) 어떤 상태든 같이 이동해~
ManyToOne
➡︎ inner join
/ OneToMany
➡︎ left outer join