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