@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
- 엔티티 비교의 결과
- 동일성의 비교
- 실패한다.
- 엔티티가 다른 영속성 컨텍스트에서 관리된다.
- 동등성의 비교
- Member 엔티티에 별도 EqualsAndHashCode 가 정의되어있다면 성공할 수도 있고 아닐 수도 잇음
- 이는 비지니스상의 니즈에 따라 달라진다
- DB 동등성
@Id
가 동일하다면 동등
- 동일성의 비교
왠만하면 엔티티간의 비교는 비즈니스 니즈에 따라 별도 equals and hashcode 로 비교할 것.
- DI 나 CI 값이 좋을 것 같다.
Uploaded by N2T
'자바 > JPA' 카테고리의 다른 글
[JPA] 영속성 컨텍스트가 같을 때의 엔티티의 비 (0) | 2023.11.19 |
---|---|
[JPA 갑자기 궁금증 해결] DataJpa 에서 save 내부 동작 방식 (0) | 2023.11.19 |
[JPA] 프록시의 동등성 비교법 (0) | 2023.11.19 |
[JPA] 그 유명한 N+1 문제 (0) | 2023.11.19 |
[Jpa] @Convertor 사용 (0) | 2023.11.19 |