ETC/Exception

[JPA]~~Entity cannot be cast to java.io.Serializleat org.hibernate.type.ManyToOneType.hydate(ManyToOneType.java)

노트코드 2022. 2. 9. 16:12

이슈 발생 원인

-  Entity와 Entity의 연관관계중, ID값이 아닌, 특정 컬럼과 연관관계를 맺는경우 아래와 같이 사용해야하는데

@JoinColumn(name = "해당_테이블_컬럼_이름", referencedColumnName = "반대쪽_컬럼_이름")

이 경우 Serializable을 구현해주지 않으면 위 제목과 같은 에러를 만나게 된다.

 

이유:  영속성 컨텍스트는 엔티티의 PK를 사용해서 엔티티를 관리하는데, JPA를 구현한 하이버네이트 입장에서 지금 PK가 아닌 다른 기준(UNIQUE 필드)으로 데이터를 한번 조회하고, 그 결과에 있는 PK를 다시 찾은 다음에 영속성 컨텍스트에 관리해야 합니다.

이 과정을 풀어내기 위해 하이버네이트 구현체는 객체를 임시로 직렬화(Serializable)해서 메모리에 올려두는 작업을 하는데, 자바의 직렬화 기능을 사용하려면 해당 클래스에 Serializable 마커 인터페이스를 구현해야 합니다.

 

(JPA 표준 스펙에 모든 엔티티는 Serializable을 구현해야 한다. 라고 되어 있기 때문에 하이버네이트 입장에서는 이렇게 구현해도 문제가 없습니다.) - 인프런 김영한님 답변

 

해결방법 :  해당 Entity에 implements Serializable만 해주면된다.

다만, 관계 설정에 있어서 ID가 아닌 다른 컬럼과 관계를 맺는다는거는, 정규화나 설계가 잘못된것으로 보이므로,

가능하면 ID와 연관관계를 맺을 수 있도록 하자

public class BlaBlaEntity implements Serializable{}