2011-07-17 37 views
1

在最近一次重构使我的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; 
    } 
} 

回答

1

这是由这一行造成的:

<key column="pOwnerId" property-ref="id"/>

无财产已被定义名为id,只是一个ID名为id ......所以,当Hibernate对属性查找的“身份证”找到没有。

另外我写了这段代码并用这种方法修复了它。

0

它告诉你,你的用户类没有一个名为“ID”属性。从你的问题来看,似乎“用户名”属性被用来映射为hibernate id字段。是对的吗?只是改变

<id name="username"> 

<id name="id"> 

也是白搭。你必须在User类中有一个名为“id”的属性。

+0

糟糕 - 我忘了包含User类。我将编辑我的文章以包含它。我相信我有一个id财产,虽然它可能是畸形的。 – Brian

+0

是的用户名曾经是id,但id在当时是作为一个属性存在的,现在id是id,而username只是一个属性,或者至少这就是我的意图 – Brian

相关问题