[Dining-together] JPA entity 연관관계 (일대일, 다대일, 다대다)

Jifrozen·2021년 6월 17일
0

Dining-together

목록 보기
10/25
post-thumbnail

JPA 연관관계

1. 다중성

JPA 에서는 다중성을 위한 어노테이션을 제공한다.
DB와 매핑하기 위해 존재하기 때문에 데이터베이스 관점에서의 다중성을 기준으로 고민해야한다.
1) 다대일 - @ManyToOne
2) 일대다 - @OneToMany
3) 일대일 - @OneToOne
4) 다대다 - @ManyToMany
위 어노테이션이 고민된다면 대칭성을 생각해보자.
팀 - 멤버 / 멤버 - 팀 둘의 입장 모두 고려하면 쉬워진다.

2. 단방향, 양방향

두개의 방향 개념을 알기 위해서 객체 연관 관계와 테이블 연관 관계를 구분해서 생각할 필요가 있다.
객체 연관 관계의 경우에는 방향이 존재하고 테이블 연관 관계의 경우 방향이 존재하지 않는다.

단방향

단방향 매핑만으로도 이미 연관관계 매핑은 끝이다.
하지만 양쪽에서 서로를 참조하여 불러오고 싶다면 양방향을 사용하면 된다.

양방향

양방향의 경우에는 둘 중 하나로 외래키를 관리해야한다. 이 외래키를 관리하는 entity 가 두 관계의 주인이다.
양방향 매핑의 경우에는 두 쪽 다 값을 넣어줘야한다.

연관관계의 주인

테이블의 경우는 위래키 하나로 두 테이블의 연관관계를 맺는다.
객체의 양방향 관계는 A -> B B -> A처럼 참조가 2군데에서 일어난다. 그렇기 때문에 객체에서 둘중 테이블의 외래키를 관리하는 곳을 정해야한다.
연관관계의 주인은 외래키를 관리하는 참조이다.

@ManyToOne 다대일

DB 설계에서 일대다 경우에는 다 쪽에 외래키가 있어야한다. 객체의 경우 다대일 관계에서 다에서 일로 단방향 참조를 하고 싶을때 테이블에 외래키 있는 쪽인 다객체에서 일객체로 연관관계 매핑을 하면 된다.
Auctioneer(경매 참여한 업체) - Auction(경매)여러 업체가 하나의 경매에 참여 할 수 있으므로 다대일 관계이다.
양쪽에서 참조할 수 잇도록 양방향으로 매핑한다.

단방향 매핑을 할 경우 아래 코드로 fk 만 명시해주면 된다.
Auctioneer.java

	@ManyToOne
	@JoinColumn(name = "auctionId")
	private Auction auction;

양방향 매핑의 경우 밑 코드를 추가한다.
어디에 매핑 됐는지에 관한 정보 (mappedBy="team")을 꼭 넣어줘야한다.
Auction.java

	@OneToMany(mappedBy = "auction")
	private List<Auctioneer> auctioneers = new ArrayList<>();

프로젝트 진해하면서 생긴 문제점

Auction과 Auctioneer을 불러오면 재귀적으로 각자를 계속 불러오는 문제점

->
@ManyToOne
@JoinColumn(name = "auctionId")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Auction auction;

josn 파일에 안쓰이게 설정한다.

@ManyToMany 다대다

관계형 데이터 베이스의 경우에는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. 그렇기 때문에 조인테이블을 추가해 일대다, 다대일 관계로 풀어내야한다.

Auction - AuctionStoreType - StoreType
옵션에 원하는 업체의 유형을 여러개 선택할 수 있다.
옵션의 입장에서도 여러 업체에 들어갈수 있기 때문에 다대다 관계이다.
그렇기 때문에 AuctionStoreType(조인테이블)을 추가했다.


Auction.java


	@ApiModelProperty(notes = "선호 메뉴")
	@OneToMany(mappedBy = "auction")
	private List<AuctionStoreType> auctionStoreTypes = new ArrayList<>();

AuctionStoreType.java


	@ManyToOne
	@JoinColumn(name = "auctionId")
	private Auction auction;

	@ManyToOne
	@JoinColumn(name = "storetypeId")
	private StoreType storeType;

StoreType.java

	@OneToMany(mappedBy = "storeType")
	private List<AuctionStoreType> auctions = new ArrayList<>();

참고
https://ict-nroo.tistory.com/127?category=826875
https://ict-nroo.tistory.com/121
https://ict-nroo.tistory.com/122

0개의 댓글