2012-02-27 13 views
5

Mentre lavoro sulla mia prima app in Hibernate. Durante il tentativo di recuperare un oggetto User dal DB sto ottenendo la seguente eccezione:TypeMismatchException l'ID fornito è di tipo errato

org.hibernate.TypeMismatchException: id del tipo sbagliato Previsto per classe org.cw.form.User. Previsto: Classe java.lang.Integer, ottenuto classe java.lang.String a org.hibernate.event.def.DefaultLoadEventListener.onLoad (DefaultLoadEventListener.java:109) a org.hibernate.impl.SessionImpl.fireLoad (SessionImpl .java: 906) a org.hibernate.impl.SessionImpl.load (SessionImpl.java:823) a org.hibernate.impl.SessionImpl.load (SessionImpl.java:816)

ho creato la tabella USERS con il seguente postgreSQL:

CREATE SEQUENCE user2_id_seq; CREATE UTENTI TABELLA (id intero NON NULL DEFAULT nextval ('user2_id_seq'), user_name varchar (45) NOT NULL UNICO, password varchar (45) NOT NULL, email varchar (45) NON NULL, PRIMARY KEY (id)) ;

e l'entità utente è definito come tale:

@Entity @Table (name = "Utenti") 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... 

io mi sto perdendo qualcosa ?

risposta

5

Sarebbe più facile rispondere se si desidera mostrare come si recuperano gli utenti. In base al messaggio:

Provided id of the wrong type for class org.cw.form.User. 
Expected: class java.lang.Integer, got class java.lang.String 

Credo che si sta fornendo String invece di tipo corretto (Intero):

String userID = "1"; //Should be Integer userID = 1 instead 
session.get(User.class, userID); 
+0

Hey ha funzionato. Grazie. – special0ne

2

Io in realtà non so se sarà risolvere il problema, ma dal momento che si sta utilizzando sequenze di generare gli ID sul lato db, penso che si dovrebbe utilizzare un generatore di sequenza:

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

Vedere questo post per i dettagli: Hibernate sequence on oracle, @GeneratedValue(strategy = GenerationType.AUTO)

2
public User findClientByUsername(String login) {   
     Criteria criteria = sessionFactory.getCurrentSession().createCriteria(User.class); 
     criteria.add(Restrictions.like("userName", login)); 
     return (User) criteria.uniqueResult(); 
    } 

Soluzione del problema.

1

Avevo un altro colpevole che creava questo problema: avevo copiato il repository di un'altra entità che usava una stringa come tipo di chiave primaria.

così ho dovuto

class MyEntity implements Serializable { 

    @Id 
    Integer id 

in combinazione con

interface MyEntityRepository extends CrudRepository<MyEntity, String> { 

che ha prodotto il messaggio di errore.

Cambiare semplicemente il tipo di interfaccia da String a Integer ha risolto il problema per me.

Problemi correlati