TypeMismatchException L'ID fornito è di un tipo sbagliato
-
13-11-2019 - |
Domanda
Mentre lavoro sulla mia prima app in Hibernate. Mentre provo a recuperare un oggetto utente dal DB, ricevo la seguente eccezione:
org.hibernate.typemismatchException: fornito ID del tipo sbagliato per la classe org.cw.form.user. Previsto: classe java.lang.integer, ottenuto la classe java.lang.string su org.hibernate.event.def.defaultloadeventlistener.onload (defaultloadeventlisten.java:109) su org.hibernate.impl.sessionimpl.fireload (sessionimpl.java: 906) su org.hibernate.impl.sessionimpl.load (sessionimpl.java:823) su org.hibernate.impl.sessionimpl.load (sessionimpl.java:816)
Ho creato la tabella degli utenti con i seguenti 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));
E l'entità utente è definita come tale:
@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...
Mi manca qualcosa?
Soluzione
Sarebbe più facile rispondere se mostreresti come recuperare gli utenti. Basato al messaggio:
Provided id of the wrong type for class org.cw.form.User.
Expected: class java.lang.Integer, got class java.lang.String
Immagino che tu stia fornendo stringa invece del tipo corretto (intero):
String userID = "1"; //Should be Integer userID = 1 instead
session.get(User.class, userID);
Altri suggerimenti
Avevo un colpevole diverso creando questo problema: avevo messo in scena il repository di un'altra entità che utilizzava una stringa come tipo chiave primario.
Così ho avuto
class MyEntity implements Serializable {
@Id
Integer id
in combinazione con
interface MyEntityRepository extends CrudRepository<MyEntity, String> {
che ha prodotto il messaggio di errore.
La semplice modifica del tipo di interfaccia da String a Integer ha risolto il problema per me.
Non so davvero se risolverà il tuo problema, ma dal momento che stai usando sequenze per generare ID sul lato DB, penso che dovresti usare un generatore di sequenze:
@Id
@Column(name="ID")
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="user2_id_seq")
private Integer id;
Si prega di consultare questo post per i dettagli: Sequenza ibernata su Oracle, @GeneratedValue (Strategy = GenerationType.Auto)
public User findClientByUsername(String login) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(User.class);
criteria.add(Restrictions.like("userName", login));
return (User) criteria.uniqueResult();
}
Soluzione del tuo problema.
Ho anche avuto lo stesso problema, se hai realizzato l'ID come autoincremento, non richiede alcun setter, Get va bene come indicato di seguito.
public Long getId() {
return id;
}
Ho avuto questo problema, quando ho provato a usare l'eredità per la classe Identifier (@IdClass).