* 오류 발생
-
Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Composite-id class must implement Serializable
public class MissionHistory implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name="mission_id") private long missionId; @Id @Column(name="user_id") private long userId; @Column private int time; @Column private LocalDateTime updated; }
-
JPA로 Entity를 설계하던 중 위와 같은 오류 발생
-
기본키를 복수로 지정해주었더니 직렬화를 해야만한다는 메세지 발생 => 복합키를 사용했기 때문
-
다른 Entity와 연관되어있는 Entity는 Serializable을 구현해야 한다고 한다.
* JPA에서 복합키를 구현하는 방법은?
- Entity에는 보통 @Id를 하나만 사용한다.
- BUT, 복합키로 이뤄져 있을 때는 아래를 고려하여 설계해야 한다.
@Embeddable
,@IdClass
두개를 사용하여 복합키를 설정한다.@EmbededId
는@IdClass
방식 보다 좀더 객체지향 방식
@EmbeddedId
를 이용하여 엔티티를 설계할 때에는 Serializable 인터페이스를 구현한 클래스를 선언하고 필드에 복합키로 사용되는 컬럼을 선언하면 된다.
* 코드 수정
- 위 코드를
@IdClass
를 사용해서 아래와 같이 수정했다.
@NoArgsConstructor
@Table(name="`mission_consumption_history`")
@Getter
@Entity
@IdClass(MissionHistoryId.class)
public class MissionHistory {
@Id
private long missionId;
@Id
private long userId;
@Column
private int time;
@Column
private LocalDateTime updated;
}
public class MissionHistoryId implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="mission_id")
private long missionId;
@Column(name="user_id")
private long userId;
}
* 직렬화란?
- 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술
- 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)
* 사용 이유
-
자바 직렬화 형태의 데이터 교환은 자바 시스템 간의 데이터 교환을 위해서 존재한다.
-
자바 직렬화는 자바 시스템에서 개발에 최적화되어 있다.
참고한 곳
http://woowabros.github.io/experience/2017/10/17/java-serialize.html
http://woowabros.github.io/experience/2019/01/04/composit-key-jpa.html
'대외활동 기록 > NEXTERS 15th' 카테고리의 다른 글
[JPA] SQL Mapper와 ORM (0) | 2019.07.28 |
---|---|
[JPA] OneToMany, ManyToMany 관계 설정하기 (0) | 2019.07.28 |