엔티티에 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;
}
상황에 맞게 적절하게 사용하는 것이 중요하다고 생각합니다.
읽어주셔서 감사합니다.
레퍼런스
반응형
최근댓글