728x90
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: challenge.server.habit.entity.Habit.user in challenge.server.user.entity.User.habits
도메인 별 Entity를 구현한 후 첫 실행에서 만난 에러. 원인도 단순하고 해결법도 단순하다.
에러 내용을 해석해보자면 user에서 habit으로 mappedBy reference한 대상이 무엇인지 알 수 없다는 의미이다.
내 코드에서 어떤 내용이 문제였는지 알아보자
원인
package challenge.server.user.entity;
import challenge.server.audit.BaseTimeEntity;
import challenge.server.bookmark.entity.Bookmark;
import challenge.server.challenge.entity.Challenge;
import challenge.server.habit.entity.Habit;
import challenge.server.report.entity.Report;
import lombok.*;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "USERS")
@Entity
public class User extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
private String email;
private String password;
private String username;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USERS_STATUS_ID")
private UserStatus userStatus;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Bookmark> bookmarks = new ArrayList<>();
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Report> reports = new ArrayList<>();
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL) // 문제의 mappedBy name
private List<Habit> habits = new ArrayList<>();
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Challenge> challenges = new ArrayList<>();
}
우선 에러가 발생한 User Entity를 확인해보자. habits Entity를 List로 가지고 있고 mappedBy = "user"라고 작성되어있다.
package challenge.server.habit.entity;
import challenge.server.audit.BaseTimeEntity;
import challenge.server.bookmark.entity.Bookmark;
import challenge.server.challenge.entity.Challenge;
import challenge.server.report.entity.Report;
import challenge.server.user.entity.User;
import lombok.*;
import javax.persistence.*;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Habit extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long habitId;
private String title;
private String subTitle;
private String body;
private LocalDateTime authStartTime;
private LocalDateTime authEndTime;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CATEGORY_ID")
private Category category;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private User host; // 문제의 필드명
@OneToMany(mappedBy = "habit", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Bookmark> bookmarks = new ArrayList<>();
@OneToMany(mappedBy = "habit", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Challenge> challenges = new ArrayList<>();
@OneToMany(mappedBy = "habit", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Report> reports = new ArrayList<>();
}
그렇다면 이번에는 Habit Entity를 확인해보자. 그렇다. 진행중인 프로젝트에서의 Habit Entity의 User는 Habit을 운영하는 Host를 말한다. 해당 필드의 역할을 직과적으로 보이기 위해서 user가 아닌 host로 이름지었던 것이다.
해결
해결 방법은 단순하다. 이제 mapped reference와 Habit의 User 필드명이 일치하도록 수정해주자
package challenge.server.user.entity;
import challenge.server.audit.BaseTimeEntity;
import challenge.server.bookmark.entity.Bookmark;
import challenge.server.challenge.entity.Challenge;
import challenge.server.habit.entity.Habit;
import challenge.server.report.entity.Report;
import lombok.*;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "USERS")
@Entity
public class User extends BaseTimeEntity {
...
@OneToMany(mappedBy = "host", cascade = CascadeType.ALL)
private List<Habit> habits = new ArrayList<>();
...
}
728x90