본문 바로가기

공부방/Spring

[오류] FK가 PK가 아닌 다른 컬럼과 연관관계가 있을 때

결론:

FK가 바라보고 있는 엔티티에 implements Serializable을 추가해주면 된다.

 

 

연관 관계 매핑 fetch join에서

FK가 PK가 아닌 다른 컬럼과 연관관계가 있을 때, referencedColumnName 사용. (default는 연관테이블의 @Id를 보고 쿼리생성)

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "REGIST_ID", referencedColumnName = "SSO_KEY")
private User user;

 

 

--> Exception 발생

java.lang.ClassCastException: com.humuson.tasbatch.domain.postman.TasUser cannot be cast to java.io.Serializable

-> 해결 : PK를 가진 클래스를 implements Serializable

 

 

 

왜냐하면 영속성 컨텍스트는 엔티티의 PK를 사용해서 엔티티를 관리하는데, JPA를 구현한 하이버네이트 입장에서 지금 PK가 아닌 다른 기준(UNIQUE 필드)으로 데이터를 한번 조회하고, 그 결과에 있는 PK를 다시 찾은 다음에 영속성 컨텍스트에 관리해야 합니다. 이 속에서는 엔티티를 생성하고 관리하는 복잡한 라이프사이클도 있구요. 이 복잡한 과정을 풀어내기 위해 하이버네이트 구현체는 객체를 임시로 직렬화(Serializable)해서 메모리에 올려두는 작업을 하는 것 같습니다. 결국 자바의 직렬화 기능을 사용하려면 해당 클래스에 Serializable 마커 인터페이스를 구현.

 

 

JPA 표준 스펙에 모든 엔티티는 Serializable을 구현해야 한다. 라고 되어 있기 때문에 하이버네이트 입장에서는 이렇게 구현해도 문제가 없다.
(필수는 아니라 실용적인 관점에 구현하지 않아도 된다.)

 

 

연관관계는 PK를 보도록 설계하는것이 원칙이지만, 레거시 테이블이 PK가 아닌 다른 unique key를 바라보고 있도록 생성돼 있을 경우 이렇게 해결하면 된다.

'공부방 > Spring' 카테고리의 다른 글

스프링 프레임워크의 등장 배경  (0) 2023.04.23
[Mysql] order by, group by  (0) 2023.01.10
deleteById, deleteByName  (0) 2022.09.30
[JPA] PK가 아닌 필드를 참조하는 FK를 만들 때  (0) 2022.08.31
다대다 연관관계  (1) 2022.06.08