[JPA] 영속성 컨텍스트가 다를때의 비교

@Test
    void transactionalEntityEqualsTest() {
        Member member = new Member("테스트", null);
        memberService.join(member);
        
        Member findMember = memberService.findMember(member.getId());
        
        System.out.println("findMember = " + findMember);
        System.out.println("findMember == member = " + (findMember == member));
        System.out.println("findMember.equals(member) = " + findMember.equals(member));
    }
@Service
@RequiredArgsConstructor
@Transactional
public class MemberServiceImpl implements MemberService {
    
    private final MemberRepository memberRepository;
    
    @Override
    @Transactional
    public void join(Member member) {
        memberRepository.save(member);
    }
    
    @Override
    @Transactional
    public Member findMember(Long id) {
        return memberRepository.findById(id)
                               .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 회원입니다."));
    }
}
findMember = Member(id=3, name=테스트)
findMember == member = false
findMember.equals(member) = false
  • 엔티티 비교의 결과
    1. 동일성의 비교
      1. 실패한다.
      1. 엔티티가 다른 영속성 컨텍스트에서 관리된다.
    1. 동등성의 비교
      1. Member 엔티티에 별도 EqualsAndHashCode 가 정의되어있다면 성공할 수도 있고 아닐 수도 잇음
      1. 이는 비지니스상의 니즈에 따라 달라진다
    1. DB 동등성
      1. @Id 가 동일하다면 동등

왠만하면 엔티티간의 비교는 비즈니스 니즈에 따라 별도 equals and hashcode 로 비교할 것.

  • DI 나 CI 값이 좋을 것 같다.


Uploaded by N2T