백엔드

[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와의 관계가 끊겼을 시 고아가된 자식 카테고리를 삭제.
반응형