TypeMismatchException предоставленный идентификатор имеет неправильный тип - PullRequest
6 голосов
/ 27 февраля 2012

Во время работы над моим первым приложением в Hibernate.При попытке получить объект User из БД я получаю следующее исключение:

org.hibernate.TypeMismatchException: предоставлен идентификатор неправильного типа для класса org.cw.form.User.Ожидаемый: класс java.lang.Integer, получил класс java.lang.String в org.hibernate.event.def.DefaultLoadEventListener.onLoad (DefaultLoadEventListener.java:109) в org.hibernate.impl.SessionImpl.fireLoad (SessionImpj.mpj.mp906) в 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));

И сущность User определяется так:

@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...

Я что-то упустил?

Ответы [ 6 ]

5 голосов
/ 27 февраля 2012

Было бы легче ответить, если бы вы показали, как вы получаете пользователей.На основании сообщения:

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); 
4 голосов
/ 01 августа 2016

У меня был другой преступник, создавший эту проблему: я вставил в репозиторий другой объект, который использовал String как тип первичного ключа.

Итак, у меня было

class MyEntity implements Serializable {

    @Id
    Integer id

в сочетании с

interface MyEntityRepository extends CrudRepository<MyEntity, String> {

, который выдал сообщение об ошибке.

Простое изменение типа интерфейса со String на Integer решило проблему для меня.

2 голосов
/ 26 ноября 2013
public User findClientByUsername(String login) {        
        Criteria criteria = sessionFactory.getCurrentSession().createCriteria(User.class);
        criteria.add(Restrictions.like("userName", login));
        return (User) criteria.uniqueResult();
    }

Решение вашей проблемы.

2 голосов
/ 27 февраля 2012

Я не знаю, решит ли это вашу проблему, но так как вы используете последовательности для генерации идентификаторов на стороне базы данных, я думаю, вам следует использовать генератор последовательностей:

@Id
@Column(name="ID")
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="user2_id_seq")
private Integer id;

Пожалуйстаподробности см. в этом посте: Последовательность гибернации на oracle, @GeneratedValue (стратегии = GenerationType.AUTO)

0 голосов
/ 07 февраля 2019

Эта проблема возникла при попытке использовать наследование для идентификатора класса (@IdClass).

0 голосов
/ 11 декабря 2018

У меня также была та же проблема: если вы сделали id как автоинкремент, тогда он не требует никаких сеттеров, только get отлично подходит, как указано ниже.

  public Long getId() {
       return id;
   }
...