728x90
CategoryEntity
@Getter
@Setter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Category {
@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String type;
@ManyToOne (fetch = FetchType.LAZY)
@JoinColumn(name="ledgerId")
private Ledger ledger;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parentCategoryId")
private Category parent;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Category> child = new ArrayList<>();
@Builder
public Category(String name, String type, Ledger ledger, Category parent) {
this.name = name;
this.type = type;
this.ledger = ledger;
this.parent = parent;
}
}
parent는 부모 카테고리, child는 자식 카테고리(하위 카테고리의 목록)를 나타낸다.
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Category> child = new ArrayList<>();
- OneToMany : 여러 카테고리가 하나의 parent를 가진다.
- OneToMany, ManyToOne 등은 해당 속성에 대해 왼쪽을 기준으로 해석하면 된다.
- ex) OneToMany - parent : 여러 카테고리(해당 테이블)가 하나의 parent(현재 속성)을 가진다.
- ex) ManyToOne - child : 하나의 카테고리(해당 테이블)이 여러개의 child를 가질 수 있다.
- mappedBy = "parent" : parent 객체는 Category 테이블(child)을 관리할 수 없다. Category 객체(child)만이 권한을 받고, 주인이 아닌 쪽(parent)는 읽기만 가능하다.
- mappedBy는 양방향 매핑시 사용. 두 객체 중 하나의 객체만 테이블을 관리할 수 있도록 한다. mappedBy가 정의되지 않은 객체가 주인(owner)이 된다.
- OneToMany 여러 카테고리가 하나의 parent를 가질 수 있다. 속성은 왼쪽을 기준으로 한다.
- casecade = CascadeType.ALL : parent가 삭제되면 자식 카테고리가 전체 다 삭제됨.
- orphanRemoval = true : parent와의 관계가 끊겼을 시 고아가된 자식 카테고리를 삭제.
반응형
'백엔드' 카테고리의 다른 글
[IntelliJ/GitHub] 인텔리제이 깃허브 연동하는 방법, 인텔리제이 코드 깃허브에 올리기 (0) | 2024.08.28 |
---|---|
[공유 가계부/Spring] 카테고리 상세 조회 시 id 값 프론트에게 전달 (0) | 2024.08.26 |
[IntelliJ] git 프로젝트 가져오기 (0) | 2024.07.16 |
[AWS] 1년 무료 프리티어 계정에 요금 청구됨 (0) | 2024.06.03 |
[DB 설계] PK에 더 적합한 자료형은 varchar? bigint? (0) | 2024.05.30 |