save the transient instance before flushing

2024. 11. 20. 04:43·Spring/JPA
728x90
반응형
SMALL

트랜잭션 문제중 맞닥뜨렸던 내용을 다시 찾아보지 않기 위해 기록한다...

아래는 내가 겪은 예외내용이다. TransientPropertyValueException 예외에 대한 내용이며 영속성 컨텍스트에 퐇마되지 않은 상태의 데이터를 사용하려 하니 발생하는 문제였다.

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.mentit.mento.global.authToken.entity.SocialAccessToken.user -> com.mentit.mento.domain.users.domain.entity.UsersEntity

저장이 되지 않은(transient) 엔티티를 참조하려할 때 발생하는 문제

1. Hiberante의 엔티티 관리

Hibernate는 엔티티의 상태를 관리하며, 엔티티가 Transient상태인지, Persistent상태인지, Detached상태인지 확인 합니다.

Transient 상태의 엔티티는 아직 영속성 컨텍스트에 포함되지 않았고, DB에 저장이 되지 않은 상태

Persistent 상태의 엔티티는 영속성 컨텍스트에 포함되어 있으며, 데이터베이스에 저장된 상태를 반영한 상태

 

2. 문제 상황의 코드

Users객체를 userRepository에 저장한 후 이를 기반으로 UserEntity.from 을 사용하여 UserEntity로 객체를 변경한 후 생성하려 했다.

문제는 savedUser가 Hibernate의 영속성 컨텍스트에 완전히 반영되기 전에 SocialAccessToken이 생성 및 저장되면서 해당 예외가 발생한것

 

3. 에러에 대한 본질

Hibernate는 데이터 무결성을 보장하기 위해, SocialAccessToken.user가 데이터베이스에 저장된 상태인지 확인한다.

하지만 UserEntity.from으로 생성된 객체는 아직 데이터베이스에 저장되지 않은 Transient상태로 간주되기 때문에 예외를 발생시킨다.

Users users = mappedUser;
userRepository.save(users);
socialAccessTokenRepository.save(SocialAccessToken.of(socialAccessToken, UsersEntity.from(mappedUser)));
isNewUser.set(true);

 return users;

 

 

수정 후 코드

mappedUser 변수를 재사용하였고, 저장된 mappedUser를 사용하여 도메인에서 엔티티로 변환하였다.

그 이후 사용하니 영속성관리 내에서 이루어져 잘 해결이 되었다.

                    mappedUser = userRepository.save(mappedUser);
                    UsersEntity savedEntity = UsersEntity.from(mappedUser);

                    socialAccessTokenRepository.save(SocialAccessToken.of(socialAccessToken, savedEntity));
                    isNewUser.set(true);

                    return mappedUser;
728x90
반응형
SMALL

'Spring > JPA' 카테고리의 다른 글

[JPA] Soft Delete 개발 방법(Hard Delete과의 차이)  (0) 2025.02.17
[개념 정리]Spring Boot에서 JPA의 Soft Delete와 Cascade 연관관계  (1) 2024.12.09
@Where Deprecated되고 새로 쓰이는 @SQLRestriction  (1) 2024.11.20
JPA - DB 연결 예외 : 'url' attribute is not specified and no embedded datasource could be configured.  (1) 2024.06.14
JPA - 지연로딩과 즉시로딩  (1) 2023.12.10
'Spring/JPA' 카테고리의 다른 글
  • [JPA] Soft Delete 개발 방법(Hard Delete과의 차이)
  • [개념 정리]Spring Boot에서 JPA의 Soft Delete와 Cascade 연관관계
  • @Where Deprecated되고 새로 쓰이는 @SQLRestriction
  • JPA - DB 연결 예외 : 'url' attribute is not specified and no embedded datasource could be configured.
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
    250x250
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (325)
      • 면접 준비 (22)
        • OS (6)
        • Spring Security (0)
        • Java (3)
        • DB (11)
        • Network (3)
      • ElasticSearch (2)
      • Kafka (4)
      • Spring (22)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (2)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      redis 채팅
      리눅스
      자바기초
      jsp request
      리눅스마스터2급정리
      springsecurity
      JS
      리눅스마스터2급
      자바 알고리즘
      자바스크립트
      HTML
      자바 면접
      spring redis
      jsp기초
      JavaScript
      Spring Data Redis
      Springframework
      스프링프레임워크
      JSP
      자바 면접질문
      Spring
      백준
      redis
      레디스
      CSS
      Til
      자바 반복문
      java
      자바
      프로그래머스
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    save the transient instance before flushing
    상단으로

    티스토리툴바