@OneToMany
Team(1) : Member(N)
으로 예시를 들어보자.@OneToMany
로 연관관계 단방향 매핑을 해보자!@Entity
@NoArgsConstructor
public class Tean {
@Id @GenratedValue
@Column(name ="team_id")
private Long id;
...
@OneToMany
@JoinColumn(name = "team_id")
private List<Memeber> members = new ArrayList<>();
...
}
@JoinColumn
을 반드시 사용해야 한다.@JoinClumn
의 name속성값은 나의 PK 컬럼명을 입력한다.@JoinClumn
을 안쓰면 중간테이블이 생겨버린다!Member member = new Member();
member.setName("hazard");
entityManager.persist(member); // 영속상태 및 Insert 쿼리 날림
Team team = new Team();
team.setName("chelsea");
team.getMembers().add(member); // ✅
entityManager.persist(team); // 영속상태 및 Insert 쿼리 날림
Member
Insert 쿼리문 실행Team
Insert 쿼리문 실행Member
Update 쿼리문 실행 ✅현재는 쿼리가 적어서 상관없지만, 테이블관계가 복잡해지고 쿼리가 복잡해질 경우에
나는 Team을 건드렸는데, Member 업데이트문을 보게 된다.
코드를 이해하고 디버깅하는데 많은 비용이 소요되게 된다.
따라서 다대일 단방향 관계를 갖고 있다가, 필요시에 양방향관계를 설정하는 방법을 추천한다.
@OneToOne
파일과 썸네일의 관계를 1:1로 가정해보겠다.
public class File {
@Id
@Column(name ="file_id")
private Long id;
@OneToOne
@JoinColumn(name ="thumb_id")
private Thumbnail thumbnail;
...
}
public class Thumbail {
@Id
@Column(name ="thumb_id")
private Long id;
...
}
public class File {
@Id
@Column(name ="file_id")
private Long id;
@OneToOne
@JoinColumn(name ="thumb_id") // 외래키 컬럼명 지정
private Thumbnail thumbnail;
...
}
public class Thumbail {
@Id
@Column(name ="thumb_id")
private Long id;
@OneToOne(mappedBy ="thumbnail") // 읽기 전용
private File file;
...
}
@OneToMany
단방향처럼 한다는 말인데, 불가능함!null
이 들어가게 됨@OneToMany
)로 변경 시에 편리함💡
@OneToOne
양방향 연관관계에서 외래키(FK)가 주인이 아닌 엔티티에 있을 경우, 지연 로딩으로 설정해도 즉시 로딩이 된다.
public class File {
@Id
@Column(name ="file_id")
private Long id;
@OneToOne(fetch = FetchType.LAZY) // ✅ 지연로딩 설정
@JoinColumn(name ="thumb_id") // 외래키 컬럼명 지정
private Thumbnail thumbnail;
...
}
public class Thumbail {
@Id
@Column(name ="thumb_id")
private Long id;
@OneToOne(mappedBy ="thumbnail") // 외래키 컬럼명 지정
private File file;
...
}
File 객체
안에 있는 Thumbnail 객체
를 프록시 객체로 JPA가 설정한다.Thumbnail 테이블(대상)
에 있으므로,File 테이블(주인)
을 조회해도 반드시 Thumbnail 테이블
조회를 해야되므로 즉시로딩된다.@ManyToMany
직접적으로는 잘 안쓰고 다른 방법으로 대체하는게 좋다고 한다.
연결테이블을 추가하여 다대일 관계로 풀어내는게 좋다.
항상 느끼는건데 글 내용도 좋지만 짤이 완벽한 것 같습니다