직접 id 값을 지정해서 도메인 객체를 생성하고 DB에 저장하려고 할 때
org.springframework.dao.IncorrectUpdateSemanticsDataAccessException: Failed to update entity 라는 에러 메시지가 난다.
검색을 해보니 insert를 수행하지 않고, update를 수행하는데 DB에는 update하려는 id값이 없어서 이런 에러를 발생시킨다고 한다.
해결 방법 여러개 중 도메인 클래스가 Persistable인터페이스를 implements하는 방법을 선택했다.
그리고 isNew()라는 메소드를 오버라이드 한다.
엔티티가 Persistable의 구현체라면 Spring Data JDBC가 insert 또는 update 쿼리 중에서 선택하는데 이때 isNew라는 메서드를 호출한다. isNew의 리턴값이 true이면 insert를 수행하고, false면 update 쿼리를 수행한다. 그리고 스키마에서 auto_increment는 빼줘야한다.
참고 자료: https://skyblue300a.tistory.com/9
문제점 발생
"games": [
{
"id": 1,
"homeTeamId": 1,
"awayTeamId": 2,
"new": true
},
{
"id": 2,
"homeTeamId": 3,
"awayTeamId": 4,
"new": true
},
...
isNew라는 필드와 메서드를 추가하니 "new"라는 속성이 추가되었다.
isNew 필드와 isNew 메서드에 @JsonIgnore 어노테이션을 다니 사라졌다.
Record에서 average는 유도될 수 있다. 상태로 관리할 필요 없다.
→ average 필드를 갖고 있을 필요 없이, getAverage 메소드만을 갖고, 메소드 내부에서 바로 계산해서 반환하기
public double getAverage() {
return (double) atBat / hit;
}
스트림 더 잘 사용해보기
private List<RecordDTO> getRecordDTOList(Team team) {
return team.getMembers().stream()
.filter(Member::hasRecord)
.map(member -> {
Record record = member.getRecord();
return RecordDTO.toRecordDTO(member, record);
})
.collect(Collectors.toList());
}