JPA의 연관관계 매핑의 다중성 중에 하나인 One To One Mapping에 관해서 알아보고 예시를 보도록 하자.
언뜻 생각하면 일대일 관계에는 방향성과 관계의 주인이 존재하지 않을 것 같지만,
OneToOne 매핑에서도 방향성과 연관관계의 주인이 존재한다.
예시로 학생과 수업 Entity를 살펴보자.
학생은 한 개의 수업만 수강할 수 있고, 수업은 한 명의 학생만 수강할 수 있다.
이 관계에서 주인을 학생으로 설정해 보자.
( 연관 관계의 주인은 foreign key를 가지고 있다 )
@Getter
@NoArgsConstructor
@Entity
public class Students {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@OneToOne
private Courses course;
@Builder
public Students(String name) {
this.name = name;
}
public void update(String name, Courses course) {
this.name = name;
this.course = course;
}
}
@Getter
@NoArgsConstructor
@Entity
public class Courses {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
}
주인 테이블에 외래키를 가지고 있는 형태
일대일 관계에서 주인을 설정하는 방법으로는 @OneToOne 어노테이션을 붙여주는 것이다. ( Students )
양방향 관계
이 상태에서 양방향으로 방향을 지정하고 싶은 경우에는
양방향에 해당하는 Entity에 똑같이 @OneToOne 어노테이션을 붙이고
mappedBy라는 설정을 추가하면 된다. ( Courses )
@Getter
@NoArgsConstructor
@Entity
public class Courses {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@OneToOne(mappedBy = "course") // 양방향
private Students student;
}
테스트 코드
위의 관계를 확인하는 테스트 코드를 보자.
@Test
public void 코스와학생매핑_oneToone() {
String studentName = "jun";
String courseName = "meth";
Courses course = Courses.builder().name(courseName).build();
Students student = Students.builder().name(studentName).build();
coursesRepository.save(course);
student.update(studentName, course);
studentsRepository.save(student);
Students ss = studentsRepository.findById(student.getId()).get();
assertThat(ss.getCourse().getName().equals(courseName));
}
'Spring JPA' 카테고리의 다른 글
[JPA] SQL View - JPA Entity 매핑 (0) | 2022.01.20 |
---|---|
[JPA] 복합키 (Composite Key) - @IdClass, @EmbeddedId (0) | 2022.01.15 |
[JPA] Fetch Join ( N+1 문제 해결) (0) | 2021.09.01 |
[JPA] 일대다 @OneToMany 연관관계 매핑(1:N) (0) | 2021.08.05 |
[JPA] 연관관계 매핑 관련 용어 정의 (0) | 2021.07.20 |