[JPA] xxx.Hobbies is not mapped as an embeddable 오류 발생 원인 및 해결 방법
JPA - Hibernate 2019. 3. 12. 10:23JPA - Hibernate
xxx.Hobbies is not mapped as an embeddable 오류 발생 원인 및 해결 방법
보통 주소나 취미 등 의미는 비슷하나 여러개의 컬럼으로 나누어서 사용하는 경우에는 하나의 엔티티에 모든 필드를 설정하기 보다는 하나의 Embeded Value로 만들어 관리합니다.
예를 들어 사용자를 관리하는 user 테이블이 있고 사용자의 취미를 세개까지 입력할 수 있도록 설계하였다고 할 때 테이블은 다음와 같은 모습일 것입니다.
그런 경우 작성된 엔티티는 다음과 같을것입니다.
@Entity
@Table(name = "user")
public class User {
@Id
private String email;
private String name;
private String hobby1;
private String hobby2;
private String hobby3;
} |
cs |
그러나 더욱 깔끔한 코드나 유지보수 측면에서의 좋은 코드를 작성하기 위해서는 취미만을 하나로 묶은 Value 오브젝트로 따로 떼어내서 사용할 것입니다.
Hobbies 라는 클래스로 취미와 관련된 필드만 모아두고 엔티티에서 필드로 내장할 수 있다는것을 설정하기 위해 @Embeddable 어노테이션을 걸어둡니다.
@Embeddable
public class Hobbies {
private String hobby1;
private String hobby2;
private String hobby3;
} |
cs |
기존의 User 엔티티는 Hobbies를 멤버변수로 설정해 두고 @Embedded라는 어노테이션을 걸어두어 참조하는 엔티티가 아닌 엔티티에 내장된 하나의 값이라는것을 설정해둡니다.
@Entity
@Table(name = "user")
public class User {
@Id
private String email;
@Basic
private String name;
@Embedded
Hobbies hobbies;
} |
cs |
오류 원인과 해결 방법
그런데 이대로만 설정해두면 xxx.Hobbies is not mapped as an embeddable 라는 식의 오류가 이클립스상에서 보여지는것을 볼 수 있습니다. 해결방법은 간단한데, @Embeddable 클래스 또한 persistence-unit의 관리 대상 클래스로 등록해두면 됩니다.
persistence.xml의 일부입니다. User 뿐만아니라 Hobbies 클래스 또한 설정으로 등록해둔것을 볼 수 있습니다. 이렇게하면 오류가 나타나지 않게 됩니다.
<persistence-unit name="jpatest" transaction-type="RESOURCE_LOCAL">
<class>jpatest.domain.model.User</class>
<class>jpatest.common.model.Hobbies</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes> |
cs |
'JPA - Hibernate' 카테고리의 다른 글
[JPA] 식별자 할당 SEQUENCE(시퀀스) 사용 전략 (2) | 2018.07.28 |
---|---|
[JPA - Hibernate] Dialect(방언)이란? 하이버네이트 Dialect 종류 (0) | 2018.07.22 |
[JPA] 엔티티 식별자 DB에서 할당받기. @GeneratedValue와 GenerationType.IDENTITY 전략. (0) | 2018.07.21 |
[JPA] 엔티티 식별자 직접 할당하여 저장하기 (0) | 2018.07.20 |
[JPA] @Id 애노테이션 필드 또는 메서드에 적용시 동작 차이점 (4) | 2018.07.05 |