PersistentObjectException
Hibernate에서 발생하는 문제로 detached(준영속성) 상태의 엔티티 객체를 persist() 메서드로 저장하려고 했을 때 발생한다.
쉽게 말해서 이미 로직 상 한 번 DB에 저장된 엔티티(Detached 상태)를 또 다시 저장하려고 했을 때 발생하는 문제이다.
식별자 값(ID)의 존재 유무를 통해 어떤 영속성 엔티티인지 준영속성 엔티티인지 판별한다.
Deatached 상태의 엔티티는 merge()로 저장하거나 변경 감지를 통해야 한다.
변경 감지는 원하는 값만 변경할 수 있음.
Merge는 모든 값이 변경됨.
엔티티의 생명 주기 상태:
- Transient: 엔티티가 영속성 컨텍스트에 저장되지 않은 새로운 상태.
- Persistent: 엔티티가 영속성 컨텍스트에 저장되고 관리되는 상태.
- Detached(준영속성): 엔티티가 영속성 컨텍스트에서 분리된 상태.
- Removed: 엔티티가 영속성 컨텍스트에 있지만 삭제가 예정되어 있는 상태.
영속성 컨텍스트란?
엔티티가 조회되거나 생성될 경우 DB에 바로 쿼리를 보내지 않고 1차적으로 저장되는 캐시이다.
Merge 방식

문제해결
public void save(Item item) {
// if(item.getId() != null) { // 문제의 코드
if(item.getId() == null) { // 올바른 코드
em.persist(item);
} else {
em.merge(item);
}
}
getId()를 체크해서 저장되지 않았을 경우에만 persist를 해야 하는데 바보 같이 반대로 하고 있었다.
'Web Project > Spring Boot' 카테고리의 다른 글
스프링이 어떻게 html에서 name 태그로 값을 받아올 수 있을까? (0) | 2024.04.09 |
---|---|
[김영한 - 스프링 부트] 1. 프로젝트 환경설정 - View 환경설정 (0) | 2024.04.01 |
PersistentObjectException
Hibernate에서 발생하는 문제로 detached(준영속성) 상태의 엔티티 객체를 persist() 메서드로 저장하려고 했을 때 발생한다.
쉽게 말해서 이미 로직 상 한 번 DB에 저장된 엔티티(Detached 상태)를 또 다시 저장하려고 했을 때 발생하는 문제이다.
식별자 값(ID)의 존재 유무를 통해 어떤 영속성 엔티티인지 준영속성 엔티티인지 판별한다.
Deatached 상태의 엔티티는 merge()로 저장하거나 변경 감지를 통해야 한다.
변경 감지는 원하는 값만 변경할 수 있음.
Merge는 모든 값이 변경됨.
엔티티의 생명 주기 상태:
- Transient: 엔티티가 영속성 컨텍스트에 저장되지 않은 새로운 상태.
- Persistent: 엔티티가 영속성 컨텍스트에 저장되고 관리되는 상태.
- Detached(준영속성): 엔티티가 영속성 컨텍스트에서 분리된 상태.
- Removed: 엔티티가 영속성 컨텍스트에 있지만 삭제가 예정되어 있는 상태.
영속성 컨텍스트란?
엔티티가 조회되거나 생성될 경우 DB에 바로 쿼리를 보내지 않고 1차적으로 저장되는 캐시이다.
Merge 방식

문제해결
public void save(Item item) {
// if(item.getId() != null) { // 문제의 코드
if(item.getId() == null) { // 올바른 코드
em.persist(item);
} else {
em.merge(item);
}
}
getId()를 체크해서 저장되지 않았을 경우에만 persist를 해야 하는데 바보 같이 반대로 하고 있었다.
'Web Project > Spring Boot' 카테고리의 다른 글
스프링이 어떻게 html에서 name 태그로 값을 받아올 수 있을까? (0) | 2024.04.09 |
---|---|
[김영한 - 스프링 부트] 1. 프로젝트 환경설정 - View 환경설정 (0) | 2024.04.01 |