[Java] spring @Annotation 개념 정리(JPA)

[Java] spring @Annotation 개념 정리(JPA)

안녕하세요. 코딩남 츄앤쥬입니다.

테이블 설계 중에 외래키에 대한 설정이 필요했습니다.

JPA에서는 아래 4가지 언노테이션으로 테이블간의 관계를 맺어 줄 수 있습니다.

각각의 언노테이션의 기능과 예제를 살펴보겠습니다.

# JPA Annotation

명칭 설명 @OneToOne 일대일 [1:1] 부모테이블과 자식테이블의 레코드가 하나씩 연결 이 경우, 테이블이 분리되어야하는지를 고려해봐야한다. ex) Member, Locker @OneToMany, @ManyToOne 일대다 [1:N], 다대일 [N:1] 이둘의 관계는 어느쪽에서 객체를 관리할것인가에 따라 설정 할 수 있다. ex) User, Post @ManyToMany 다대다 [N:N] 실무에서 사용하는걸 권장하지 않는다.

@OneTone

회원은 1개의 락커를 사용할수 있습니다. 이럴경우 1대1 관계의 테이블 관계를 설정 할 수 있지만,

회원 테이블 안에 isUseLocker 라는 컬럼을 추가하여 1개의 테이블로 합치는게 관리하기에 편합니다.

만약 여러개의 락커를 사용한다면 경우가 달라지겠죠?

@Entity @Setter @Getter public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NonNull @Column(name = "password", nullable = false, updatable = true) private String email; @NonNull @Column(name = "password", nullable = false, updatable = true) private String password; @NonNull @Column(name = "name", nullable = true, updatable = true) private String name; }

@Entity @Setter @Getter public class Locker { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NonNull @Column(name = "isUse", nullable = false, updatable = true) private Boolean isUse; }

@OneToMany, @ManyToOne

사용자는 포스팅일 여러개 작성 할 수 있다. 객체를 어디에서 가져오냐에 따라

부모에는 @OneToMany, 자식에는 @ManyToOne을 설정하여 데이터를 가져 올 수 있다.

양쪽에 존재할경우 양방향, 한쪽에만 존재할 경우 단방향이라 한다.

@Entity @Setter @Getter public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NonNull @Column(name = "password", nullable = false, updatable = true) private String email; @NonNull @Column(name = "password", nullable = false, updatable = true) private String password; @NonNull @Column(name = "name", nullable = true, updatable = true) private String name; @Default @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user") private List posts = new ArrayList(); }

@Entity @Setter @Getter public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NonNull @Column(name = "title", nullable = false, updatable = false) private String title; @NonNull @Column(name = "content", nullable = false, updatable = false) private String content; @ManyToOne @JoinColumn(name = "userId") private User user; }

@ManyToMany

실무에서는 정규화된 테이블2개로 다대다 관계를 표현할 수 없다.

개발 할때 연결 테이블에 시간 및 카운트 등을 넣어서 사용 할 수 있지만

그렇게 될 경우, 예상하지 못하는 쿼리들이 발생할 수 있다.

결론적으로 일대다, 다대일 관계로 풀어서 사용 해야한다.

from http://chunjyu.tistory.com/24 by ccl(A) rewrite - 2020-03-11 11:20:29

댓글

이 블로그의 인기 게시물

2020 LCK 롤챔스 Spring 경기 재개 및 일정

데이터 바인딩 추상화 - propertyEditor

Spring Web Form