본문 바로가기
🍃 𝗦𝗽𝗿𝗶𝗻𝗴 𝗕𝗼𝗼𝘁

[Spring Jpa] nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist

by 비타민찌 2022. 9. 6.
728x90

발생 원인

JPA에서 부모 Entity의 @ONETOONE , @MANYTOONE 등 조인 관계 데이터 데이터 저장할 경우 에러 발생.

cascade 옵션을 ALL로 처리 할 경우 부모가 save() 될때 영속성이 detached(분리)되어 persist(지속)되지 않기 때문에 에러가 발생했다.

 

[에러 발생 코드]

    @ManyToOne(cascade = CascadeType.ALL)
    private Board board;

 

 

해결 방법

JOIN 어노테이션에 cascade 옵션 변경.

JPA CASCADE옵션은 영속성 전이를 제공한다. 영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다.

 

 

CascadeType 종류

1. CascadeType.PERSIST
엔티티를 생성하고, 연관 엔티티를 추가하였을 때 persist() 를 수행하면 연관 엔티티도 함께 persist()가 수행된다. 만약 연관 엔티티가 DB에 등록된 키값을 가지고 있다면 detached entity passed to persist Exception이 발생한다.
2. CascadeType.MERGE
트랜잭션이 종료되고 detach 상태에서 연관 엔티티를 추가하거나 변경된 이후에 부모 엔티티가 merge()를 수행하게 되면 변경사항이 적용된다.(연관 엔티티의 추가 및 수정 모두 반영됨)
3. CascadeType.REMOVE
삭제 시 연관된 엔티티도 같이 삭제됨
4. CascadeType.DETACH
부모 엔티티가 detach()를 수행하게 되면, 연관된 엔티티도 detach() 상태가 되어 변경사항이 반영되지 않는다.
5. CascadeType.ALL
모든 Cascade 적용

728x90

댓글