테스트 코드를 만들다가 발생을 하였다.
product 엔티티에 product type 엔티티를 저장하려고한다.
org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing
@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;
casecade (영속성 정의) 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶다면 casecade를 사용하면된다.
엔티티 관계는 종종 다른 엔티티 (예 : Person-Address 관계)의 존재에 의존합니다. Person이 없으면 Address 엔터티는 그 자체의 의미가 없습니다. Person 엔터티를 삭제하면 Address 엔터티도 삭제되어야합니다.
모든 CasecadeType 적용
엔티티가 임시 인스턴스를 만든다면, 관계가 메핑된 하위 엔티티도 지속적인 작업을 전파를 한다. 자식 엔티리를 저장을 하면 부모 엔티티 또한 저장이된다.
엔티티의 상태를 병합 할때, 관계가 메핑된 엔티티도 병합
엔티티를 상태할 때, 관계가 메핑된 엔티티도 삭제
부모엔티티를 새로고침 할때, 메핑된 엔티티도 새로고침이 된다.
부모 엔티티가 준영속성(detach) 상태가 되면, 메핑이된 엔티티도 준영속성(detch) 상태가 되여 변경사항이 반영되지 않는다.