JPA 영속성 컨텍스트

Leo·2023년 8월 6일
0

문제

  1. JPA는 동일성을 보장해주는데 findMember를 진행하면 주소값이 왜 달라질까?
  2. member1을 save할 때는 주소값이 달라지지 않을까?

이해

@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 값의 식별자값이 존재 하는지 여부에 따라 분류합니다.

  1. JPA는 같은 트랜잭션 내부에서만 동일성을 유지하기 때문에 문제에서 사용하는 repository에서, 메서드 단위마다 트랜잭션이 동작하기 때문에 서로 동작하는 트랜잭션이 상이합니다.
    따라서 다른 트랜잭션에서 실행 되었고 find를 진행했을 때, 1차 캐시에서 동일한 객체를 가져오는 것이 아니기 때문에 주소값이 다르게 나옵니다.

  2. 1차 캐시에 등록할 때는, 객체가 가지고 있는 주소 그대로 1차 캐시에 등록해 사용합니다.

1개의 댓글

comment-user-thumbnail
2023년 8월 6일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기