본문 바로가기
IT/Java

[JPA] @OneToMany , @ManyToOne

by 성준하이 2023. 9. 18.
반응형

JPA 를 사용시 단일 Entity 조회의 경우엔 그냥 사용하면 되지만 다른 테이블과 참조 키가 걸려있거나 Join을 해야하는경우

Entity에서 join하는 특정 테이블을 선언하고 어떤 컬럼과 연관관계인지 명시를 해줘야한다.

 

일단 

Table Name= Grade

순번(pk) 학번 과목 성적
1 111111 수학 A
2 111112 수학 B

Table Name= Student

학번 이름 ...
111111 홍길동  
111112 이순신  
111113 장영실  

 

이렇게 두 테이블이 있다고 가정을 하고 각각 Entity 를 선언해볼것이다.

가독성을 위해 변수명은 한글로 지정할것이다.

 

Grade Table

@Getter
@Setter
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity(name="Grade")
public class Grade {

@Id
private String 순번;

private String 학번;

private String 과목;

private String 성적;

Student Table

@Getter
@Setter
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity(name="Grade")
public class Grade {

@Id
private String 학번;

private String 이름;

 

여기에서 Grade테이블과 Student 테이블의 관계를 봐야한다.

 

학번 컬럼이 조인 키가 될것이고.

Grade가 M 이고 Student 가 1 인 M:1 인 관계가 이루어진다.

 

그러면 Grade Table기준으로는 ManyToOne이 되고

Student Table기준으로는 OneToMany가 된다.

 

그럼 사용법은 아래와 같다.

 

Grade Table 기준으로 Join

@Getter
@Setter
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity(name="Grade")
public class Grade {

@Id
private String 순번;

private String 학번;

@ManyToOne
@JoinColumn(name="학번")
private Student student;


private String 과목;

private String 성적;

 

Student Table 기준으로 Join

@Getter
@Setter
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity(name="Grade")
public class Grade {

@Id
private String 학번;

private String 이름;

@OneToMany
@JoinColumn(name = "학번")
private List<Grade> Grade;

이렇게 하고 각각 출력을 해보면 리스트 안에 리스트가 들어가있는것 처럼 출력이 된다.

 

 

주의점

만약 두 Entity 에 모두 @Data 어노테이션을 달거나 @ToString을 달면 서로 순환 참조를 해서 무한 루프가 돌아서 stackoverflow  에러를 뱉기에 사용하고자 하는곳에만 선언을 하여 사용해야한다.

반응형

댓글