在最近一次重构使我的hibernate对象更符合实际的数据库,我已经开始抛出org.hibernate.HibernateException:无法解析属性: ID。Hibernate抛出org.hibernate.HibernateException:无法解析属性:id
以前,User.hbm.xml将用户名定义为索引,而实际上id是数据库键。当我不得不重构实现创建新用户的功能时,这一点起到了作用。
我在这里和谷歌上探索了一下,但我很茫然。我对hibernate相当陌生,在我看来,它很好地形成了(尽管显然不是!)。下面的代码片段,请告诉我,如果我错过了任何关键代码段,我会提供它。提前致谢!
堆栈跟踪:
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是事务TX = global_session.beginTransaction
线22是用于用户
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;
}
用户类声明.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;
}
}
糟糕 - 我忘了包含User类。我将编辑我的文章以包含它。我相信我有一个id财产,虽然它可能是畸形的。 – Brian
是的用户名曾经是id,但id在当时是作为一个属性存在的,现在id是id,而username只是一个属性,或者至少这就是我的意图 – Brian