JPA - 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



블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,