Ne pouvez pas définir de java.lang.Champ de type chaîne de java.lang.Chaîne

Je suis en train de développer un petit MMO application avec un socket serveur. La base de données j'utilise PostgreSQL et je suis à l'aide de l'ORM Hibernate.
Je suis tombé sur une exception lors de la demande de tous les avatars d'un seul utilisateur est le propriétaire.

J'ai 3 classes involed, ceux-ci sont :

  • GameServerClient
  • Base de données
  • Base de données.Les requêtes

Lorsque l'utilisateur (application client) envoie une requête au serveur via les sockets, une méthode est appelée, qui doit retourner un JsonString de tous les Avatars.

Comment jamais, à l'aide de la requête HQL from UserOwnsAvatar where user = :username et ranger le résultat dans une liste de tableaux de la UserOwnsAvatar objet qu'elle renvoie un Can not set java.lang.String field nl.marcusink.mmo.server.database.table.User.username to java.lang.String

la pleine stackTrace :

org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private java.lang.String nl.marcusink.mmo.server.database.table.User.username] by reflection for persistent property [nl.marcusink.mmo.server.database.table.User#username] : Mjollnir94
at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:43)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:223)
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4594)
at org.hibernate.type.EntityType.toLoggableString(EntityType.java:505)
at org.hibernate.internal.util.EntityPrinter.toString(EntityPrinter.java:87)
at org.hibernate.engine.spi.QueryParameters.traceParameters(QueryParameters.java:281)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:194)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1268)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
at nl.marcusink.mmo.server.database.Database$Queries.avatarsRequest(Database.java:134)
at nl.marcusink.mmo.server.connection.GameServerClient.run(GameServerClient.java:91)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field nl.marcusink.mmo.server.database.table.User.username to java.lang.String
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:393)
at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:39)
... 11 more

le code de requête est :

Query query = session.createQuery("from UserOwnsAvatar where user = :username");
query.setParameter("username", username);
ArrayList<UserOwnsAvatar> ownedAvatars = (ArrayList<UserOwnsAvatar>) query.list();

La dernière ligne est la cause de l'erreur, des idées?

MODIFIER

@Id
@ManyToOne(targetEntity = User.class)
@JoinColumn(name = "username", nullable = false)
private User user;
@Id
@OneToOne(targetEntity = Avatar.class)
@JoinColumn(name = "avatar", nullable = false, unique = true)
private Avatar avatar;

Le nom d'utilisateur ici est égal à l'identifiant de l'Utilisateur de l'objet, qui est :

@Id
@Column(name = "username", unique = true, nullable = false)
private String username;
pouvez-vous s'il vous plaît montrer les codes relatifs à la username...
peut-être vous avez besoin d'ajouter public void setUsername(String username) {this.username = username;} à la User classe.
J'ai généré tous les getters et setters pour chaque classe de la table. le public void setUsername(String username) { this.username = username; } est l'un d'entre eux. Que ne pourrais pas être là le problème je pense
Dont l'esprit me pour la correction de mes auto : la requête : user champ de table : username
Oh ce message d'erreur est un gâchis. Comme vous pouvez le voir à partir de la trace de la pile, il tente de get mais produit un message d'erreur “impossible”. Après avoir regardé le code source de UnsafeFieldAccessorImpl .ensureObj, je conclus que, malgré le message d'erreur en se concentrant sur la valeur, c'est le exemple, sur laquelle la tentative a été faite, qui n'est pas de type User...

OriginalL'auteur Marcel | 2015-10-23