반응형
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 에러를 뱉기에 사용하고자 하는곳에만 선언을 하여 사용해야한다.
반응형
'IT > Java' 카테고리의 다른 글
[Java] Iterator (62) | 2023.09.21 |
---|---|
@ExceptionHandler 와 @ControllerAdvice 예외 처리하기 (39) | 2023.09.19 |
파일읽기 쓰기 (FileInputStream, FileOutputStream) (37) | 2023.09.16 |
.gz 파일 압축 풀기 (GZIPInputStream, GZIPOutputStream) (51) | 2023.09.15 |
JSch 관련 (java 에서 ftp 사용) (64) | 2023.09.14 |
댓글