Hibernate бросает org.hibernate.HibernateException: невозможно разрешить свойство: id - PullRequest
1 голос
/ 17 июля 2011

Во время недавнего рефакторинга, чтобы привести мои объекты гибернации в соответствие с реальной базой данных, я начал выдавать 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;
    }
}

Ответы [ 2 ]

1 голос
/ 17 июля 2011

Это вызвано этой строкой:

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

Не определено свойство с именем id, просто идентификатор с именем id ... поэтому, когда hibernate выполняет поиск свойства для'id' ничего не находит.

Также я написал этот код и исправил его таким образом.

0 голосов
/ 17 июля 2011

Это говорит о том, что в вашем классе User нет свойства с именем "id".Из вашего вопроса, кажется, что свойство "username" раньше отображалось как поле идентификатора гибернации.Это правильно?Просто изменить

<id name="username">

на

<id name="id">

не годится.На самом деле у вас должно быть свойство id в классе User.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...