백엔드
[Spring Boot] 계층 카테고리 Entity
난감
2024. 7. 16. 23:03
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와의 관계가 끊겼을 시 고아가된 자식 카테고리를 삭제.
반응형