728x90
안녕하세요 세기무민입니다.
오랜만에 오류 해결 포스팅으로 찾아왔습니다.
오류 현상
Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Composite id class must implement Serializable: ~~~
- 위의 오류가 발생하는 원인은 기본키를 복수로 지정했을 때 직렬화를 해야한다는 의미입니다.
- 보통 키를 복수로 지정할 경우 복합키를 사용하게 되는데 복합키의 경우도 직렬화가 필요하다.
- JPA는 엔티티를 영속성 컨텍스트와 2차 캐시에 저장하여 관리하는데 복합키를 전송하거나 저장하려면 직렬화가 필요
- 분산 처리 시스템(클러스터링 환경)에서 활용이 가능한데, 복합키에 대해 직렬화하지 않는다면 데이터 전송 과정에서 문제가 발생할 수 있음
- 또한 JPA 스팩에 따라 복합키에 사용되는 @IdClass, @EmbeddedId 객체는 직렬화가 필요하며, 직렬화 안될 경우 " java.io.NotSerializableException" Exception을 발생 시킬 수 있음
오류 원인
@Entity
@Table(name = "collect_master")
public class CollectMaster {
@Id
private int collectSeq;
private String collectValue;
private String collectYn;
@Id
private String collectUniquKey;
private LocalDateTime regDt;
private LocalDateTime updDt;
}
- 내가 선언했던 Entity Class의 경우 기본키를 복수로 지정했으나 앞서 말한 내용과 같이 복합키임에도 직렬화를 안해서 오류가 발생했다.
- 이에 따라 복합키를 구성하여 처리하였다.
해결
1) 복합키 Class
@Data
public class CollectMasterId implements Serializable {
private int collectSeq;
private String collectUniquKey;
}
2) Entity
@Entity
@Table(name = "collect_master")
@IdClass(CollectMasterId.class)
public class CollectMaster {
@Id
private int collectSeq;
private String collectValue;
private String collectYn;
@Id
private String collectUniquKey;
private LocalDateTime regDt;
private LocalDateTime updDt;
}
- 복합키를 만들어서 @IdClass를 이용하여 Entity Class에 복합키를 연결시켜줬고 Composite id class must implement Serializable 오류는 더이상 발생하지 않았다.
728x90