write toe tic tac socket multiple example clients java hibernate sockets server

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