랄라

JPA Entity 본문

내일배움캠프/공부정리

JPA Entity

devdaeun 2025. 2. 11. 12:53
@ManyToMany(mappedBy = "userList")
private List<Food> foodList = new ArrayList<>();

JAVA 코드로 데이터베이스 구조를 작성하였으며, 자동으로 데이터베이스를 생성해주는 클래스

ORM(객체-관계 매핑)을 통해서 데이터베이스와 상호작용이 가능하다.

@Entity를 클래스 상단에 작성하여 엔티티클래스를 표시한다.

@Table의(name="테이블이름") 속성을 사용하면 테이블 이름을 사용자가 설정할 수 있다.

 

*application.properties나 application.yml 에 데이터베이스 연결정보를 작성해야 연동완료!


@Id

테이블에서 기본 키(primary key)를 정의.

숫자로 이루어져있으며, 보통 자동증가 속성을 추가하기위해

@GeneratedValue(strategy = GenerationType.IDENTITY)를 같이 작성한다.

 


 

Foreign Key 설정방법

 

외래키의 소유자 쪽에서 @JoinColumn 어노테이션을 작성하여 외래키를 설정.

소유자만이 왜래키를 등록, 수정, 삭제 할 수 있다.

 

*단방향

일방적인 참조의 관계(반대쪽에서는 참조가 불가능).

참조하는 방향에서만 상대방의 정보를 알고있음.

 

*양방향

서로 참조하는관계, 상대방의 정보를 양쪽에서 알고있음.

mappedBy 속성을 사용하여 외래키가 어디에 저장되었는지 확인.

 


@OneToOne(1:1관계)

Entity와 Entity가 1대1관계를 가짐.

보통 외래키는 N 쪽에서[외래키 소유자] 등록하지만 1:1 관계에서는 직접지정이 필요하다.

@OneToOne
@JoinColumn(name="왜래키 컬럼명")
private 상대엔티티클래스 이름; //ex) private User user;

단방향인 경우 참조하는 쪽[소유자]의 엔티티에만 @JoinColumn을 추가로 작성.

 

양방향인경우 외래키 소유자가 아닌 엔티티는 @OneToOne() 내부의 mappedBy 속성을 작성한다.

@OneToOne(mappedBy = "상대컬럼명") //@JoinCoulmn에 작성된 컬럼명
    private 상대엔티티클래스 이름;

 

*mappedBy 옵션 생략할경우 중간테이블이 의도치않게 생성될 수 있음. 주의!


 

@Many To One (N:1 관계)

상단의 어노테이션만 변경된다. 단방향 양방향 작성방법 동일.

@ManyToOne //N인 쪽이 외래키 소유자
@JoinColumn(name = "컬럼명")
private B b;

 

양방향인경우 추가

@OneToMany(mappedBy= "b") //소유자가 아니기때문에 mappedBy 작성 
private List<A> alists = new ArrayList<>();
//작성시 본인to상대 라고 생각하면됨!

 

@One To Many (1:N 관계)

*One 쪽이 외래키를 가지고있는경우

실제 키가 One 에 존재하는경우에도, Many 쪽에서 외래키를 동일하게 관리

@OneToMany
@JoinColumn(name = "컬럼명") 
private List<A> alists = new ArrayList<>(); 
//상대값이 Many이기때문에 값을 여러개의 값을 받기위해 ArrayList로 구현

 


@Many to Many(N:M 관계)

다대다 관계는 중간테이블을 생성하여 사용한다.

*중간테이블이 없을경우 무한 루프 또는 데이터 정합성 문제가발생할 수 있다.

 

외래키 소유자 엔티티인경우

@ManyToMany
@JoinTable(name = "컬럼이름", // 중간 테이블 생성
joinColumns = @JoinColumn(name = "중간테이블 컬럼이름"), // 현재 위치 엔티티 에서 중간 테이블로 조인할 컬럼 설정
inverseJoinColumns = @JoinColumn(name = "반대 테이블 컬럼이름")) // 반대 위치 엔티티 에서 중간 테이블로 조인할 컬럼 설정
private List<B> bList = new ArrayList<>();

 

반대쪽에 존재하는 엔티티의경우

@ManyToMany(mappedBy = "bList")
private List<A> aList = new ArrayList<>();

 

자동적으로 생성하는경우 변경발생시 관리하기가 어려움 => 직접생성하는것이 좋다.

중간테이블을 생성하여 설정하는경우 중간테이블이 외래키 소유자가된다.

*양쪽의 외래키 컬럼정보를 하나의 중간테이블에 작성 / 나머지 엔티티들은 @OneToMany가 된다

@ManyToOne
@JoinColumn(name = "a_id")
private A a;

@ManyToOne
@JoinColumn(name = "b_id")
private B b;

 

'내일배움캠프 > 공부정리' 카테고리의 다른 글

대규모 시스템 중요 개념 정리(1)  (0) 2025.03.10
Docker 란?  (0) 2025.03.04
RestTemplate  (0) 2025.02.11
Spring Cloud  (1) 2025.02.07
MSA와 MA의 정의  (0) 2025.02.07