@Transactional
@Override
public <S extends T> S save(S entity) {
Assert.notNull(entity, "Entity must not be null.");
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
SimpleJpaRepository의 save 로직입니다.
isNew 상태는 id 값의 식별자값이 존재 하는지 여부에 따라 분류합니다.
JPA는 같은 트랜잭션 내부에서만 동일성을 유지하기 때문에 문제에서 사용하는 repository에서, 메서드 단위마다 트랜잭션이 동작하기 때문에 서로 동작하는 트랜잭션이 상이합니다.
따라서 다른 트랜잭션에서 실행 되었고 find를 진행했을 때, 1차 캐시에서 동일한 객체를 가져오는 것이 아니기 때문에 주소값이 다르게 나옵니다.
1차 캐시에 등록할 때는, 객체가 가지고 있는 주소 그대로 1차 캐시에 등록해 사용합니다.
정리가 잘 된 글이네요. 도움이 됐습니다.