문제

Hibernate에서 첫 번째 응용 프로그램에서 작업하는 동안

.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)에 상속을 사용하려고 시도했을 때이 문제가 발생했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top