JPA | cascade

DoItDev·2021년 5월 30일
0
post-thumbnail

🔥 에러의 발생 ...

테스트 코드를 만들다가 발생을 하였다.
product 엔티티에 product type 엔티티를 저장하려고한다.

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing 
스크린샷 2021-05-27 오후 9 44 34

Error 원인

product 엔티티
@Entity
@NoArgsConstructor
@Table(name = "PRODUCT")
public class Product extends DomainEntity {

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

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

    @Column(name = "PRICE", nullable = false)
    private BigDecimal price;

    @Column(name = "IMG")
    private String img;

    @ManyToOne
    private ProductType productType;

    @Builder
    public Product(String type, String name, BigDecimal price, String img, ProductType productType) {
        this.type = type;
        this.name = name;
        this.price = price;
        this.img = img;
        this.productType = productType;
    }

}

해결

엔티티에 cascade 추가 하여서 해결 하였다.

 @ManyToOne(cascade = CascadeType.ALL)
    private ProductType productType;

⭐️ 그래서 cascade 가 뭐지?

casecade (영속성 정의) 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶다면 casecade를 사용하면된다.

엔티티 관계는 종종 다른 엔티티 (예 : Person-Address 관계)의 존재에 의존합니다. Person이 없으면 Address 엔터티는 그 자체의 의미가 없습니다. Person 엔터티를 삭제하면 Address 엔터티도 삭제되어야합니다.

🥸 casecade 종류

스크린샷 2021-05-30 오후 8 25 25
  • CasecadeType.ALL

    모든 CasecadeType 적용

  • CasecadeType.PERSIST

    엔티티가 임시 인스턴스를 만든다면, 관계가 메핑된 하위 엔티티도 지속적인 작업을 전파를 한다. 자식 엔티리를 저장을 하면 부모 엔티티 또한 저장이된다.

  • CasecadeType.MERGE

    엔티티의 상태를 병합 할때, 관계가 메핑된 엔티티도 병합

  • CasecadeType.REMOVE

    엔티티를 상태할 때, 관계가 메핑된 엔티티도 삭제

  • CasecadeType.REFRESH

    부모엔티티를 새로고침 할때, 메핑된 엔티티도 새로고침이 된다.

  • CasecadeType.DETACH

    부모 엔티티가 준영속성(detach) 상태가 되면, 메핑이된 엔티티도 준영속성(detch) 상태가 되여 변경사항이 반영되지 않는다.

About

참조

profile
Back-End Engineer

0개의 댓글