본문 바로가기

Spring & Java

PersistentObjectException: detached entity passed to persist

반응형


아래 에러는 JPA 사용시 Entity 들간 매핑시 Cascadetype  으로 인하여 발생한 에러이다.


PersistentObjectException: detached entity passed to persist

해당 엔티티 관계는 아래와 같다 (에러발생 엔티티들의 관계 )

@Entity
@Table(name="parent")
class Parent{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}

@Entity
@Table(name="child")
class Parent{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Parent parent;
}



CascadeType의 종류에는 다음과 같은 것들이 있다.

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


해결 방법:

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)private Parent parent;


참고




반응형