Во время недавнего рефакторинга, чтобы привести мои объекты гибернации в соответствие с реальной базой данных, я начал выдавать org.hibernate.HibernateException: Невозможно разрешить свойство: id.
Ранее User.hbm.xml определял имя пользователя в качестве индекса, а в действительности id - это ключ базы данных.Это вошло в игру, когда мне пришлось провести рефакторинг, чтобы начать реализацию функциональности для создания нового пользователя.
Я немного покопался здесь и в Google, но я в растерянности.Я довольно новичок в спящем состоянии, и мне кажется, что он хорошо сформирован (хотя, очевидно, это не так!).Фрагменты ниже, пожалуйста, дайте мне знать, если я пропустил какой-либо критический фрагмент, и я предоставлю его.Заранее спасибо!
Трассировка стека:
org.hibernate.HibernateException: Unable to resolve property: id
at org.hibernate.tuple.entity.EntityMetamodel.getPropertyIndex(EntityMetamodel.java:486)
at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyIndex(AbstractEntityPersister.java:1812)
at org.hibernate.engine.EntityEntry.getLoadedValue(EntityEntry.java:254)
at org.hibernate.type.CollectionType.getKeyOfOwner(CollectionType.java:364)
at org.hibernate.type.CollectionType.resolve(CollectionType.java:425)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:139)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:982)
at org.hibernate.loader.Loader.doQuery(Loader.java:857)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2533)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)
at space.data.hibernate.HibernateDatabase.loadUser(HibernateDatabase.java:178)
at space.data.hibernate.HibernateDatabase.loadUser(HibernateDatabase.java:22)
at space.network.authenticator.AuthenticationRequestProcessor.isValidUser(AuthenticationRequestProcessor.java:424)
at space.network.authenticator.AuthenticationRequestProcessor.processMessage(AuthenticationRequestProcessor.java:196)
at space.network.authenticator.AuthenticationRequestProcessor.processMessage(AuthenticationRequestProcessor.java:182)
at space.network.authenticator.AuthenticationRequestProcessor.process(AuthenticationRequestProcessor.java:119)
at space.network.authenticator.AuthenticationServer.execute(AuthenticationServer.java:153)
at space.network.authenticator.AuthenticationServer.main(AuthenticationServer.java:46)
Метод вызова:
Строка 178 - это ТранзакцияОбъявление класса для пользователя
public User loadUser(String username)
{
User user = null;
String sql = "SELECT * FROM User WHERE name='" + username + "';";
// Logger.logData(sql);
List<User> users = null;
try
{
Transaction tx = global_session.beginTransaction();
users = (List<User>) global_session.createSQLQuery(sql)
.addEntity(User.class).list();
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
}
if (users != null && users.size() > 0)
{
user = users.get(0);
}
return user;
}
User.hbm.xml
<hibernate-mapping>
<class name="space.data.hibernate.User" table="User">
<id access="field" column="id" name="id" type="int">
<generator class="increment"/>
</id>
<!--<id access="field" column="name" name="username" type="java.lang.String">
<generator class="increment"/>
</id> -->
<property generated="never" lazy="false" name="username" type="java.lang.String">
<column name="name"/>
</property>
<property generated="never" lazy="false" name="password" type="java.lang.String">
<column name="password"/>
</property>
<!-- <property generated="never" lazy="false" name="id" type="int">
<column name="id"/>
</property>-->
<property generated="never" lazy="false" name="walletAmount" type="double">
<column name="wallet"/>
</property>
<set name="assets" table="InstanceObject">
<key column="pOwnerId" property-ref="id"/>
<one-to-many class="space.data.hibernate.InstanceObject"/>
</set>
<set name="knowledge" table="Knowledge">
<key column="pOwnerId" property-ref="id"/>
<one-to-many class="space.data.hibernate.Knowledge"/>
</set>
<set name="missions" table="MiningMission">
<key column="pOwnerId" property-ref="id"/>
<one-to-many class="space.data.hibernate.MiningMission"/>
</set>
</class>
</hibernate-mapping>
Класс пользователя:
public class User implements space.data.generic.User
{
private int id;
private String username;
private String password;
private String error;
private Set<InstanceObject> assets;
private Set<Knowledge> knowledge;
private Set<MiningMission> missions;
private double walletAmount;
protected boolean loggedIn;
public User()
{
super();
loggedIn = false;
}
public User(String username, String password)
{
super();
this.username = username;
this.password = password;
loggedIn = false;
error = "";
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public void setPassword(String password)
{
this.password = password;
}
public String getPassword()
{
return password;
}
public void setId(int id)
{
this.id = id;
}
public int getId()
{
return id;
}
public void setErrorMessage(String error)
{
this.error = error;
}
public String getErrorMessage()
{
return error;
}
}