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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top