@ManyToOne
, @OneToMany
, @OneToOne
, @ManyToMany
다대다는 실무에서 쓰면안된다. 그 이유는 뒤에서
테이블
외래 키 하나로 양쪽 조인 가능
사실 방향이라는 개념이 없음
객체
참조용 필드가 있는 쪽으로만 참조 가능
한쪽만 참조하면 단방향
양쪽이 서로 참조하면 양방향
객체 양방향 관계는 단방향 2개를 양방향처럼 만든 것이기 때문에
주인을 정해줘야됨.
연관관계 주인 - 외래 키를 관리하는 참조
주인의 반대편 - mappedBy
추천하지 않은 모델이다. 하지만, 이렇게 가능하긴 하다.
@JoinColumn
을 꼭 사용해야 함. 그렇지 않으면, 중간에 테이블을 하나 추가해버림.이렇게 하면 저장할때 아래와 같이 동작하게됨.
멤버 저장 -> 팀 저장 -> 팀 안에 멤버 업데이트
와 같이 쿼리가 더 나간다.
하지만 이러한 성능차이보다 무엇보다 심각한 단점은, 실무에서는 수많은 쿼리들이 나가는 도중에 이러한 업데이트 쿼리가 들어가게 되면 혼란을 야기할 수 있다는 점이 있다.
암튼 꼭 설정해야하는 경우가 아니라면 다(N)를 주인으로 정해라. 차라리 양방향으로 하던지.
@JoinColumn(insertable=false, updatable=false)
를 Team team
위에 넣어야한다.위 @JoinColumn
의 경우 Team
에서 List members
가 주인행세를 하고,
Member
에서 Team team
도 주인행세를 하지만, Team team
은 읽기전용으로 바꾸는 것 뿐이다.
다대일 단방향과 유사한 방법
다대일 양방향 매핑처럼 외래 키가 있는 곳이 연관관계의 주인.
mappedBy 쓰면 됨.
안됨.
Locker
를 연관관계의 주인으로 잡으면 된다.
사실상 의미가 없다. 일대일 양방향을 뒤집은거나 다름없다.
말만 다르게 하는것 뿐
결국 객체의 주인은 본인의 테이블만 매핑할 수 있다.
일대일의 경우 데이터베이스 개발자와 어플리케이션 개발자가 많이 싸운다고 함
보는 관점이 달라서 정확히는 미래를 위한 확장성을 위한 관점이 달라서.
딜레마에 빠진다고도 한다. ㅇㅇ
내가봐도 일대일일때 주인 정하는거 좀 고민되긴 할듯.
관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음.
연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야함
name
: 매핑할 외래 키 이름. 기본값은 필드명 + _ + 참조하는 테이블의 기본 키 컬럼명
referencedColumnName
: 외래 키가 참조하는 대상 테이블의 컬럼명
foreignKey(DDL)
: 외래 키 제약조건을 직접 지정할 수 있다. 이 속성은 테이블을 생성할 때만 사용한다.
unique, nullable, insertable, updatable, columnDefinition, table
: @Column
의 속성과 같다.
optional
- false로 설정하면 연관된 엔티티가 항상 있어야 한다. 기본값 TRUE
fetch
- 글로벌 패치 전략을 설정한다. 기본값 @ManyToOne -> EAGER, @OneToMany -> LAZY
cascade
- 영속성 전이 기능을 사용한다.
targetEntity
: 연관된 엔티티의 타입 정보를 설정한다. 이 기능은 거의 사용하지 않는다. 컬렉션을 사용해도 제네릭으로 타입 정보를 알 수 있다.
mappedBy
: 연관관계의 주인 필드를 선택한다.
fetch
: 글로벌 패치 전략을 설정한다.
cascade
- 영속성 전이 기능을 사용한다.
targetEntity
: 동일스