TypeMismatchException 제공된 ID는 잘못된 유형입니다
-
13-11-2019 - |
문제
.DB에서 사용자 객체를 검색하려고하면 다음 예외가 발생합니다.
org.hibernate.typemismatchException : 잘못된 유형의 ID 제공 org.cw.form.user 클래스.예상 : 클래스 java.lang.Integer, Class. java.lang.String. org.hibernate.event.def.defaultLoadEventListener.Onload (defaultloadEventListener.java:109) org.hibernate.impl.SessionImpl.Fireload (sessionimpl.java:906) org.hibernate.impl.sessionImpl.load (sessionimpl.java:823) org.hibernate.impl.sessionImpl.load (sessionimpl.java:816)
다음 PostgreSQL을 사용하여 사용자 테이블을 만들었습니다.
.CREATE SEQUENCE user2_id_seq; CREATE TABLE USERS(id integer NOT NULL DEFAULT nextval('user2_id_seq'), user_name varchar(45) NOT NULL UNIQUE , password varchar(45) NOT NULL, email varchar(45) NOT NULL, PRIMARY KEY (id));
및 사용자 엔티티는 다음과 같이 정의됩니다.
.@Entity @Table(name="USERS") public class User { @Id @Column(name="ID") @GeneratedValue(strategy= GenerationType.IDENTITY) private Integer id; @Column(name="USER_NAME", unique = true) private String userName; @Column(name="PASSWORD") private String password; @Column(name="EMAIL") private String email; .. all the getters and setters...
나는 뭔가를 놓치고있다?
해결책
사용자가 어떻게 검색합니까?메시지를 기반으로 :
Provided id of the wrong type for class org.cw.form.User.
Expected: class java.lang.Integer, got class java.lang.String
.
올바른 유형 (정수) 대신 문자열을 제공하는 것 같습니다.
String userID = "1"; //Should be Integer userID = 1 instead
session.get(User.class, userID);
. 다른 팁
이 문제를 만드는 데 다른 범인이있었습니다. 문자열을 기본 키 유형으로 사용한 다른 엔티티의 저장소를 복사했습니다.
그래서
class MyEntity implements Serializable {
@Id
Integer id
.
와 함께
interface MyEntityRepository extends CrudRepository<MyEntity, String> {
.
오류 메시지를 생성했습니다.
문자열에서 Integer에서 인터페이스 유형을 변경하면 문제가 해결되었습니다.
문제가 해결 될 것인지 여부를 알지 못하지만 DB 측에서 ID를 생성하기 위해 시퀀스를 사용하고 있으므로 시퀀스 생성기를 사용해야한다고 생각합니다.
@Id
@Column(name="ID")
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="user2_id_seq")
private Integer id;
.
이 게시물을 참조하십시오. 자세한 내용은이 게시물을 참조하십시오.전략= generationtype.auto)
public User findClientByUsername(String login) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(User.class);
criteria.add(Restrictions.like("userName", login));
return (User) criteria.uniqueResult();
}
.
문제의 해결책.
I 또한 ID를 자동으로 만들었습니다. 이제는 setter가 필요하지 않습니다. 아래에 설명 된 것처럼 괜찮습니다.
public Long getId() {
return id;
}
. 식별자 클래스 (@IdClass)에 상속을 사용하려고 시도했을 때이 문제가 발생했습니다.