-
[tibero, oracle] org.hibernate.HibernateException:java 2021. 4. 10. 11:14
org.hibernate.HibernateException identifier of an instance of HibernatedObject altered from A to B
- 원인 1. hibernate에 연결된 객체를 기존에 store되었는데 pk를 변경해서 한번 더 저장했을 경우 발생합니다.
이러한 이유로 에러가 났다면, tibero 문제라기 보다는 hibernate를 잘못 쓴 문제라고 보는게 맞습니다. procedure를 호출해서 처리를 하던지, flush와 initial을 적절하게 사용해서 해결하는 것이 좋습니다.
- 원인 2. (tibero, oracle연동시) 원인 2. hibernate 객체 내에서 동일한 hibernate객체를 생성할 경우 발생합니다.
@JsonIgnore public HibernatedObject clone(){ HibernatedObject cloned = new HibernatedObject(); cloned.setId(this.getId()); cloned.setData(this.getData()); cloned.setKey(this.getKey()); cloned.setValue(this.getValue()); return cloned; } ... HibernatedObject newObject = oldObject.clone(); newObject.setId(newObjectSettingId); ObjectDAO.store(newObject); ObjectDAO.flush(); // 에러발생
해결책으로는 빈 껍데기의 생성된 객체를 받아서 데이터만 넣어줍니다.
@JsonIgnore public void clone(HibernatedObject cloned){ cloned.setData(this.getData()); cloned.setKey(this.getKey()); cloned.setValue(this.getValue()); } ... HibernatedObject newObject = new HibernatedObject(); oldObject.clone(newObject); newObject.setId(newObjectSettingId); ObjectDAO.store(newObject); ObjectDAO.flush(); // 정상
postgreSQL에서는 해당 원인과 같은 오류가 나지 않습니다.
기본적으로 pSQL은 동시성을 보장합니다. 때문에 저러한 방식으로 clone을 생성했다 한들 기존에 동작하던 트랜잭션에 영향을 주지 않습니다.
아래 글을 참고해주세요.
PostgreSQL manages concurrency through Multi-Version Concurrency Control (MVCC), which gives each transaction a " database snapshot", allowing changes to be made without affecting other transactions. This eliminates the need for read locks, while ensuring the database maintains ACID principles.
www3.dbmaestro.com/blog/postgresql-vs-oracle-the-battle-of-the-titans
'java' 카테고리의 다른 글
[FILE] 파일 분할 읽기 (0) 2021.04.21 [Aws SDK] CreateMultipartUploadRequest (0) 2021.04.13 디자인패턴 Delegate pattern 예제 (0) 2021.04.04 org.hibernate.exception.ConstraintViolationException (0) 2021.04.01 org.hibernate.LazyInitializationException (0) 2021.03.28