먼저 아래 내용을 체크해야 한다.
- 엔티티 클래스와 식별자 클래스의 자료형과 변수명이 같은가?
- 식별자 클래스는 Serializable을 구현하고 있는가?
- 식별자 클래스의 접근 제어자가 public인가?
User.java
@Entity
@Getter
@Setter
@Table(name = "users")
@IdClass(UserId.class)
public class User implements Serializable {
/**
* 회원 번호 (Unique, Auto Increment)
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "seq")
private Long id;
/**
* 아이디 (Unique)
*/
@Id
private String usrid;
/**
* 이름
*/
private String name;
}
UserId.java
public class UserId implements Serializable {
private Long id;
private String usrid;
}
위 내용을 바탕으로 이런 소스코드를 만들었는데 오류가 난다. T0T
#1. IllegalArgumentException : Can not set ~ field ~ to org.hibernate.id.IdentifierGeneratorHelper$2
위 오류는 엔티티 클래스에 @Column 어노테이션이 있는데,
식별자 클래스에는 @Column 어노테이션을 붙이지 않았을 때 나오는 오류이다.
아래와 같이 수정하면 된다.
UserId.java
public class UserId implements Serializable {
@Column
private Long id;
private String usrid;
}
#2. SQLGrammarException: could not extract ResultSet
위 오류는 엔티티 클래스에는 name (엔티티와 DB의 이름이 다를 때 지정해주는 속성)이 지정되어 있는데,
식별자 클래스에는 name이 지정되지 않았을 때 나오는 오류이다.
아래와 같이 수정하면 된다.
UserId.java
public class UserId implements Serializable {
@Column(name = "seq")
private Long id;
private String usrid;
}
결론
엔티티 클래스와 DB의 이름이 다르면, 식별자 클래스도 똑같이 @Column 어노테이션과 name 속성을 붙여주어야 한다.