본문 바로가기

Trouble Shooting

[Spring Boot] @IdClass로 복합키 매핑을 했을 때 생기는 오류 해결 방법 (DB 컬럼명과와 엔티티 변수명이 다를 때)

 

먼저 아래 내용을 체크해야 한다.

  1. 엔티티 클래스와 식별자 클래스의 자료형변수명이 같은가?
  2. 식별자 클래스는 Serializable을 구현하고 있는가?
  3. 식별자 클래스의 접근 제어자가 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 속성을 붙여주어야 한다.