여기 Product와 ProductImage 테이블이 있습니다.
하나의 Product의 여러개의 image가 들어갈 수 있다는 생각에 Product는 1 ProductIamge는 N이라고 N:1의 관계를 연결했습니다.
Product 테이블을 보면 @OneToMany로 product 테이블에 mappedBy되어 있습니다. 외래키를 관리 당하는 쪽입니다.
ProductImage 객체의 product를 뜻합니다.
@ManyToOne으로 양방향 관계에서 외래키를 관리하고 있습니다. 외래키는 product 테이블의 Product_id 입니다.
@OneToMany란?
- N:1 양방향관계에서 1쪽에서 N쪽으로의 방향성 또는 1:N 단반향에서는 컬렉션을 참조하므로 Set, List, Map을 사용할 수 있다.
- 1:N 관계는 잘 사용되지 않으며, 1:N(OneToMany) 단방향 보다는 M:1 양방향 관계를 사용하는 것이 좋다.
- List는 순서가 있고 중복을 허락하는 자료구조 이므로 자료들의 순서를 알 수 있고, 정렬이 가능하다. 자료들의 순서(인덱스)를 알기 위해서는 별도 인덱스 칼럼(@OrderColumn)이 정의되어야 한다.
- Map은 Key, Value 쌍으로 자료를 저장하는데 key설정을 위해 @MapKey를 사용하며, 실제 테이블의 칼럼을 지정할 때는 @MapKeyColumn을 사용한다.
@OneToMany 속성
- targetEntity : 연결을 맺는 상대 엔티티
- cascade : 관계 엔티티의 읽기 전략을 설정.
- mappedBy : 양뱡향 관계에서 주체가 되는 쪽(Many쪽, 외래키가 있는 쪽)을 정의
- orphanRemoval : 연관 관례에 있는 엔티티에서 변경이 일어난 경우 DB 변경을 같이 할지 결정합니다. Cascade는 JPA 레이어의 정의이고 이 속성은 DB레이어 에서 직접 처리한다. 기본은 false
mappedBy
- 테이블은 외래키 하나로 두 테이블의 연관관계를 관리하는데 엔티티를 단방향으로 매핑하면 참조를 하나만 사용하고, 양방향 관계로 설정하면 객체의 참조는 양쪽에서 하나씩 둘인데,
외래 키는 하나이므로 두 엔티티 중 하나(OWNER)를 정해서 테이블의 외래키를 관리해야 하고 MANY쪽이 OWNER 이며 mappedBy는 @OneToMany쪽의 컬렉션 칼럼에 기술하여 OWNER가 아님을 정의한다. - mappdBy는 @OneToOne, @OneToMany, @ManyToMany 어노테이션에서 사용할 수 있으며 mappedBy가 없으면 JAP에서 양뱡향 관계라는 것을 모르고 두 엔티티의 매핑 테이블을 생성한다.
- mappedBy는 OWBER 엔티티의 필드나 속성과 대응된다.
- ManyToOne 양방향 관계에서 Many측에는 mappedBy요소를 사용할 수 없다.(MANY 쪽이 OWNER)
- OneToOne 양방향 관계에서 OWNER는 반대쪽(INVERSE SIDE)에 대한 FK를 가지는 쪽이다.
- ManyToMany 양방향 관계는 양쪽 중 아무나 OWNER가 될 수 있다.
728x90
'JAVA > - Spring' 카테고리의 다른 글
[spring boot] db에 이전에 넣었던 값 다시 넣어보기 (0) | 2022.05.14 |
---|---|
[spring boot] @Transactional이란? (0) | 2022.05.13 |
[spring boot] spring boot로 카테고리 상세화 만들어보기 (0) | 2022.04.26 |
[spring boot] SLF4J: Failed toString() invocation on an object of type 오류해결 (0) | 2022.04.22 |
[spring boot] thyemleaf와 서버간의 object 주고 받기 (0) | 2022.04.21 |