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