문제가 되는 부분은 main Entity인 teacher Entity의 일부를 patch api로 수정하는 과정에서 발생하였습니다. 다른 부분은 모두 수정이 원활하게 이루어 졌는데 teacher과 jpa mapping 된 skillTable이라는 Entity가 teacher Entity를 save를 통해 저장해도 함께 저장이 안되는 상황입니다.
@Entity
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long teacherId;
@Column
private String name;
@Column
private String password;
@Column(nullable = false, unique = true)
private String email;
@Column
private String roles;
@Column
private long reputation;
@Column(columnDefinition = "Text")
private String career;
@Column(columnDefinition = "Text")
private String aboutMe;
@Column
private String nickName;
@OneToMany(mappedBy = "teacher", cascade = {CascadeType.PERSIST,CascadeType.REMOVE})
private List<SkillTable> skillTableList = new ArrayList<>();
@OneToMany(mappedBy = "teacher")
private List<Tutoring> tutoringList = new ArrayList<>();
@OneToMany(mappedBy = "teacher")
private List<Review> reviewList = new ArrayList<>();
/*@JsonManagedReference
@OneToOne(mappedBy = "teacher", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
private Images image;*/
public void addReview(Review review){
this.reviewList.add(review);
if(review.getTeacher() != this){
review.setTeacher(this);
}
}
public void addTutoring(Tutoring tutoring){
this.tutoringList.add(tutoring);
if(tutoring.getTeacher() != this){
tutoring.setTeacher(this);
}
}
public void addSkillTable(SkillTable skillTable){
this.skillTableList.add(skillTable);
if(skillTable.getTeacher() != this){
skillTable.setTeacher(this);
}
}
public List<String> getRoleList() {
if(this.roles.length() > 0) {
return Arrays.asList(this.roles.split(","));
}
return new ArrayList<>();
}
}
위 Entity의 skillTableList가 SkillTable Entity를 저장하는 공간입니다. Teacher Controller에서 수정에 필요한 Dto Entity를 가져오고 해당 부분을 service 로직을 통해 Teacher DB에 저장 및 SkillTableList 또한 DB에 저장하려고 했지만
다음 사진과 같이 분명 필드 값들을 넣어 줬는데 teacer Entity만 save하면 내용들이 모두 사라지고 null값이 되는 것을 확인할 수 있었습니다.
해결방법은 다음과 같습니다.
CascadeType.Persist 부분을 Merge로 바꿔주었습니다. Entity를 수정하는 repository save는 CascadeType.Merge가 필요한 것 같습니다.
더불어 patch api를 여러번 클릭하면 DB에 똑같은 SkillTable이 여러개 저장되는 오류도 있었는데, Persist 부분을 제거하는 것으로 해결할 수 있었습니다.
'spring boot main 프로젝트 해결' 카테고리의 다른 글
[JPA ERROR] Entity 필드에 예약어 사용 에러(Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000d\000a) (0) | 2022.09.16 |
---|