AnalysisResult(이하 result)에서 @CreationTimestamp로 createdAt을 저장한다.
save()로 저장된 result에는 createdAt이 null로 담겨있는 문제가 발생.
@Transactional
public AppraisalResponse appraise(final long memberId, final AppraisalRequest request) {
// AI 서버에 요청
AppraisalAIResponse appraisalResponse = response.getBody();
AnalysisResult savedResult = saveAppraisal(memberId, appraisalResponse);
return AppraisalResponse.from(savedResult);
}
private AnalysisResult saveAppraisal(final long memberId, final AppraisalAIResponse response) {
// TODO 커스텀 예외 처리
Member member = memberRepository.findById(memberId).orElseThrow(() -> BaseException.from(MEMBER_NOT_FOUND));
AnalysisResult result = response.toEntity();
result.update(member);
return resultRepository.save(result);
}
from()의 savedResult의 createdAt이 null로 표기된다.
Hibernate의 @CreationTimestamp는 insert 시점에 DB에 처리되고, flush 이전에는 엔티티 필드에 반영되지 않는다.
다시 조회하는 대신 직접 flush를 수행하자.
Hibernate에선 save 후에 flush 할 수 있는 메서드를 제공한다.
saveAndFlush()를 통해 해결했다.