[ERROR] JPA TransientPropertyValueException: object references an unsaved transient instance

반응형

1. 문제

JPA를 사용해 객체간 @OneToOne 관계를 설정한뒤 Repository의 save를 호출할때 아래와 같은 에러가 발생할 수 있다.

image.png

2. 원인

이러한 상황은 주로 부모객체에서 자식객체를 한번에 저장하려고할때 발생하는 것으로, 자식 객체가 아직 데이터베이스에 저장되지 않았기 떄문이다.

사용한 클래스는 아래와 같다. Mission가 부모 MissionRule가 자식이다.

@Getter
@NoArgsConstructor
@Entity
public class Mission extends BaseTimeEntity {

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

    @OneToOne
    @JoinColumn(name = "MISSION_RULE_ID")
    private MissionRule missionRule;

    @Builder
    public Mission(MissionRule missionRule){
        this.missionRule = missionRule;
    }
}

3. 해결

부모객체에 선언한 자식객체에 CascadeType.ALL을 선언한다. 이를 통해 영속성 전이가 발생해 부모객체를 저장할때 자식객체도 함께 저장할 수 있다.

@Getter
@NoArgsConstructor
@Entity
public class Mission extends BaseTimeEntity {

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

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "MISSION_RULE_ID")
    private MissionRule missionRule;

    @Builder
    public Mission(MissionRule missionRule){
        this.missionRule = missionRule;
    }
}

추천서적

 

스프링 부트와 AWS로 혼자 구현하는 웹 서비스

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

댓글

Designed by JB FACTORY