엔티티에 1:1 연관관계 매핑을 추가한 후 아래와 같이 오류가 발생하였습니다.

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing :

 

1. 오류원인

@OneToOne과 @OneToMany 연관관계 Mapping이 적용된 엔티티 구조에서 Parent 엔티티를 저장하지 않고

Child 엔티티를 저장하는 경우 오류가 발생합니다.

 

예시는 다음과 같습니다.

// 도서관 신규사용자 등록 및 JAVA 책 대여 CASE
Book book = new Book("java programming");
User user = new User("Kim");
user.setBook(book)

// 에러 발생 :: bookId 값이 존재하지 않음
userRepository.save(user);

2. 해결책

 

2-1. Parent 엔티티 저장 후 연관관계 편의 메서드 호출

// 책정보 저장 후 bookId 값 인식
Book book = bookRepository.save(new Book("java programming"));

User user = new User("Kim");
user.setBook(book)
userRepository.save(user);

 

2-2. 연관관계 cascade 옵션 활성화.

cascade 옵션은 "영속성 전이" 속성을 활성화 하며,  특정 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화합니다.

아래와 같이 설정하면 User 데이터를 저장하기 전에 Book 값부터 저장합니다.

public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;

    @OneToOne(mappedBy = "user", fetch = LAZY, cascade = CascadeType.ALL)    
    private User user;
}

public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)    
    private Long id;
    
    private String userName;

    @OneToOne(fetch = LAZY)
    @JoinColumn(name = "bookId")
    private Book book;
}

 

상황에 맞게 적절하게 사용하는 것이 중요하다고 생각합니다.

읽어주셔서 감사합니다.

 

레퍼런스
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기