[jpa]@OneToOne
@OneToOne
Master class는 수정하지 않아야 함 >>> 단방향
public class Detail {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
private Master master;
}
@JoinColumn 선언안하면 중간 테이블 생긴다는데.. 안생기는데?
@OneToOne: 기본 EAGER
@OneToOne(optional = false): 연결된 Master가 무조건 있음
findById() | join |
findByXXX() | Detail만 조회 |
findByXXX().getMaster() | Detail조회 후 Master조회 |
optional = false일때 findById() | (inner) join |
optional = true 또는 생략일때 findById() | left (outer) join |
양방향
양방향을 쓸진 모르겠지만..
Master에도 Detail을 추가하면 양방향(서로 단방향)
DetailRepository.findById()로 조회 했을 시, Detail, left join Master, left join Detail
MasterRepository.findById()로 조회 했을 시, Master, left join Detail, left join Master
DetailRepository.findById() | Detail, left join Master, left join Detail |
MasterRepository.findById() | Master, left join Detail, left join Master |
mappedBy
여기서 Master, Detail 중에 '주인'을 나타내기 위해
Master에 @OneToOne(mappedBy = "상대class의 필드명") 추가
여기서는 @OneToOne(mappedBy = "master")를 추가 하면 됌
mappedBy를 추가하면 log찍었을 때, 양방향으로 계속 참조해서 둘중 한쪽에서 @ToString.Exclude 설정을 해줘야 함.
처음엔 Master 조회 했을 때, Detail을 알아야 하니까 Detail에서 제외 해봤는데,
Master-Detail이 OneToOne이니까 PK가 같을꺼고, 바로 Detail로 조회했을 때 Master가 불러와지는거도 낫배드?
서로 left join 한번만 하게 됌
DetailRepository.findByXXX(xxx) | Detail만 조회 후, Master, left join Detail 조회 함.(왜이럼?) |
DetailRepository.findByXXX(xxx).getMaster() | Detail만 조회 후, Master, left join Detail 조회 함.(왜이럼?) |
근데 Detail @OneToOne에 mappedby 넣으면?
Master에 mappedby | Detail에 mappedby |
Master 테이블에는 Detail에 대한 컬럼이 없음 | Detail 테이블에는 Master에 대한 컬럼이 없음 |
Detail 테이블에 외래키가 생김 | Master 테이블에 외래키가 생김 |
Master-Detail 사이에 중간테이블을 만드는 방법
Master에 @OneToOne과 함께 @JoinTable(name = "테이블명")도 붙이면 됌.
그럼 Master pk, Detail pk 두개 컬럼으로 구성된 테이블이 만들어짐.
Detail에 붙여도, 둘다 붙여도 역할만 바꿔서 똑같은 현상이 일어남.
근데 이렇게 만드는 경우가 있을까? 싶음.