Programing/Error Resolution(오류해결)

[Spring] Composite id class must implement Serializable 오류 해결

세기루민 2025. 1. 15. 08:03
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