SMALL

 

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));
    	
    }
LIST

+ Recent posts