Take A Sip (2) :: Entity 수정

ggyu_55·2023년 4월 26일
0

take A Sip

목록 보기
3/8

처음 만들었던 Entity는 같은 음료라도 옵션이 다르면 새 엔티티를 통해 새 테이블을 만들어 줘야 했다!!!
이 무슨 쓰레기같은... 음료 종류가 같으면 옵션이 어떻든 같이 관리하도록 해야 한다. 어떻게 해야할까?


음료의 옵션을 별개의 테이블로 분리하고, 음료 테이블의 기본키를 통해 옵션 테이블에 추가한 해당 음료의 옵션을 찾을 수 있도록 관계를 맺어주면 될 듯하다....! 다른 방법이 있을 수 있지만 일단 이게 맞지 않을까?

Bevarage와 Option 테이블간에 OneToMany 관계를 맺어주고 음료의 옵션을 addOption()을 통해 추가할 수 있도록 만들어 주었다.


@ManyToOne(fetch = FetchType.LAZY) :: 엔티티 간의 다대일 관계를 매핑할 수 있다. FetchType.LAZY 옵션은 연관 엔티티가 실제로 필요할 때까지 데이터베이스에서 로딩을 지연시킨다. 반대로, FetchType.EAGER 를 사용하면 즉시 로딩한다.

@JoinColumn(name = "beverage_id") :: 두 엔티티 간의 관계에서 FK를 지정할 때 사용.


Beverage.java

@Entity
@NoArgsConstructor
@Getter
@Table(name = "beverage") // 가장 하위의 아이템(음료) 정보를 담음
public class Beverage {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "beverage_id")
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

    @Column(name = "description", nullable = false)

    private String description;

    @OneToMany(mappedBy = "beverage", cascade = CascadeType.ALL)
    private List<Option> options = new ArrayList<>();

    public void addOption(Option option) {
        options.add(option);
        option.setBeverage(this);
    }

    public void removeOption(Option option) {
        options.remove(option);
        option.setBeverage(null);
    }

}

Option.java

@Entity
@Table(name = "option")
@NoArgsConstructor
public class Option {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Size size;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Temperature temperature;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "beverage_id")
    private Beverage beverage;

    @Builder
    public Option(Size size, Temperature temperature) {
        this.size = size;
        this.temperature = temperature;
    }

    public void setBeverage(Beverage beverage) {
        this.beverage = beverage;
    }

}

0개의 댓글