toe - No se puede establecer el campo java.lang.String en java.lang.String
socket java ip (2)
user =: username es incorrecto. el usuario no es un campo de cadena de la entidad. Utilice una combinación o use los criterios de hibernación para crear un alias para el usuario y agregue una restricción, por ejemplo, .add (Restriction.eq ("user.username", username).
Actualmente estoy desarrollando una pequeña aplicación MMO con un servidor de socket. La base de datos que estoy usando es PostgreSQL y estoy usando Hibernate ORM. Me tropecé con una excepción cuando solicité todos los avatares que posee un solo usuario.
Recibí 3 clases invocadas, esas son:
- GameServerClient
- Base de datos
- Database.Queries
Cuando el usuario (aplicación cliente) envía una solicitud al servidor a través de los sockets, se llama a un método que debe devolver un JsonString de todos los Avatares.
Sin embargo, utilizando la consulta HQL from UserOwnsAvatar where user = :username
y poniendo el resultado en una ArrayList del objeto UserOwnsAvatar, se devuelve un campo Can not set java.lang.String field nl.marcusink.mmo.server.database.table.User.username to java.lang.String
el stackTrace completo es:
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
el código de consulta es:
Query query = session.createQuery("from UserOwnsAvatar where user = :username");
query.setParameter("username", username);
ArrayList<UserOwnsAvatar> ownedAvatars = (ArrayList<UserOwnsAvatar>) query.list();
La última línea es la causa del error, ¿alguna idea?
EDITAR
@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;
El nombre de usuario aquí es igual al nombre de usuario del objeto Usuario, que es:
@Id
@Column(name = "username", unique = true, nullable = false)
private String username;
Tendrá que establecer el completo (u objeto con solo campos relevantes) en lugar de un valor particular de ese objeto.
Lo que entendí es que está tratando de establecer una String
mientras configura el parámetro, pero la columna es de tipo User
. Hibernate está intentando llamar al método getUsername
en String
y es por eso que el error.
Así que cambie su código a algo como esto:
User user = getSomeUser();
Query query = session.createQuery("from UserOwnsAvatar where user.username = :username");
query.setParameter("username", user);