1. 에러 메시지
Bytecode enhancement failed because no public, protected or package private default constructor was found for entity.
2. 원인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@Entity
@Getter @Setter
public class Writer extends BaseTimeEntity{
@Id
@GeneratedValue
@Column(name = "writer_id")
private Long id; // id
private String name; // 작가 이름
@OneToMany(mappedBy = "publisher")
private List<Book> books = new ArrayList<>();
public Writer (String name) {
this.name = name;
}
//==연관관계 메서드==//
public void setBook(Book book) {
this.books.add(book);
book.setWriter(this);
}
}
|
FK로 Book에서 writer가 proxy로 접근 권한이 되는데 private이므로 proxy 객체 생성을 하는 로직에서 오류가 발생한 것이다.
3. 해결
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@Entity
@Getter @Setter
@NoArgsConstructor //추가
public class Writer extends BaseTimeEntity{
@Id
@GeneratedValue
@Column(name = "writer_id")
private Long id; // id
private String name; // 작가 이름
@OneToMany(mappedBy = "publisher")
private List<Book> books = new ArrayList<>();
public Writer (String name) {
this.name = name;
}
//==연관관계 메서드==//
public void setBook(Book book) {
this.books.add(book);
book.setWriter(this);
}
}
|
3줄 처럼 추가를 해주면 생성자가 저절로 생성되어 에러를 해결할 수 있다.
혹시 해당 방법이 안된다면 조회하는 Entity와 통해서 접근되어지는 Entity에 `@NoArgsConstructor(access = AccessLevel.PROTECTED)` 어노테이션을 붙여주면 된다.
참고 사이트