Written by
최태열
on
on
JPA4
Relationship
JPA Foreign Key
@OneToOne
예를 들어, 한 반에 선생님은 한 명만 있고 선생님 한 명은 한 반만 맡을 수 있다. 이것이 일대일 관계이다.
주로 이런 관계에서는 반에는 선생님이 반드시 존재하고 선생님은 반드시 반을 맡아야 하지 않는 것을 고려하여 반에 FK를 부여한다.
public class Class{
@Id
private String className;
@OneToOne
@JoinColumn(name="teacher_name")
private Teacher teacherName;
}
여기까지 할 경우 class가 teacher의 PK인 teacherName을 FK로 설정하는 단방향 관계가 된다.
pulic class Teacher{
@Id
private String Name;
@OneToOne(mappedBy = "teacherName")
private Class className;
}
이렇게 까지 할 경우 Teacher가 Class를 Class가 Teacher를 서로 가져오는 양방향 OneToOne 관계가 된다.
Teacher t1 = Teacher.builder().name("채성아").build();
Class c1 = Class.builder().className("떡잎반").teacherName(t1).build();
em.persist(c1);
em.persist(t1);
maapedBy가 있는 teacher를 먼저 선언해주고 이를 FK로 사용하는 class를 선언한다. teacher table에는 classname은 없지만 t1.getclassName 으로 떡잎반을 가져올 수 잇다.
@OneToMany
예를 들어, 동아리에는 학생이 여러 명 존재한다. 반대로 학생은 동아리를 하나만 들을 수 있다. 이런 경우를 일대다 관계라고 한다.
주로 학생이 동아리를 가입하지 않을 수 있다는 것을 고려하여 Club에 FK를 부여한다.
public class Club{
@Id
private String name;
@OneToMany
@JoinColumn(name="student_name")
private list<Student> students;
}
하지만 이 경우에는 Student_name column이 유동적이라는 것 때문에 관계형 데이터 모델링에서는 사용되지 않는다.
@ManyToOne
OneToMany에서 외래키를 Club이 아닌 Student에 부여하는 경우이다. 이럴 경우 column의 값이 유동적이지 않기 때문에 이 방법을 많이 사용한다.
public class Student{
@Id
private String name;
@ManyToOne
@JoinColumn(name="club_name")
private Club club;
}
Student가 Club을 FK로 가져오는 형태이다.
pulic class Club{
@Id
private String name;
@OneToMany(mappedBy = "club")
private list<Student> students;
}
Table상에는 존재하지 않지만 club에 속하는 students를 객체 안에 저장한다.
Club c1 = Club.builder().name("볼링부").students(new ArrayList<Student>()).build();
Student s1 = Student.builder().name("신짱구").club(c1).build();
Student s2 = Student.builder().name("이훈이").club(c1).build();
em.persist(c1);
em.persist(s1);
em.persist(s2);
Discussion and feedback