Отображение Hibernate возвращает нулевые свойства - PullRequest
1 голос
/ 02 июня 2011

У меня есть настройка отображения Hibernate. Таблица видов, мой Java-класс видов. hibernate.cfg.xml указывает на сопоставления в видов.hbn.xml

В моем коде я использую простой HQL-запрос, а затем выбрасываю полученные экземпляры Species в класс "SpeciesLister" (который я передаю на уровень представления).

   SpeciesLister speciesList = new SpeciesLister();
    Query q = session.createQuery("SELECT s FROM Species s");
    for (Species s : (List<Species>) q.list()){
        speciesList.addSpecies(s);
    }

Класс Species выглядит следующим образом:

package springwildlife;

public class Species implements Serializable
{
    long id;
    String commonName;
    String latinName;
    String order;
    String family;
    ArrayList<Sighting> sightings;

    public Species()
    {
    }

    public Species(String commonName, String latinName)
    {
        sightings = new ArrayList<Sighting>();
        this.commonName = commonName;
        this.latinName = latinName;
    }

    public long getId()
    {
        return id;
    }

    public String getCommonName()
    {
        return commonName;
    }

    public String getLatinName()
    {
        return latinName;
    }
    public String getOrder()
    {
        return order;
    }
    public String getFamily()
    {
        return family;
    }
    public ArrayList<Sighting> getSightings()
    {
        return sightings;
    }

    public void addSighting(Sighting s)
    {
        sightings.add(s);
    }

    public void setId(long id)
    {
        this.id = id;
    }

    public void setCommonName(String cn)
    {
        commonName = cn;
    }

    public void setLatinName(String ln)
    {
        commonName = ln;
    }

    public void setFamily(String f)
    {
        family = f;
    }

    public void setOrder(String o)
    {
        order = o;
    }


}

Моя схема базы данных выглядит следующим образом:

CREATE TABLE species
(
  id serial NOT NULL,
  common_name text,
  latin_name text,
  order_name text,
  family_name text,
  CONSTRAINT id PRIMARY KEY (id)
)

видов.hbn.xml выглядит так:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <class name="springwildlife.Species" table="species">
      <id name="id" type="java.lang.Long" column="id" >
          <generator class="native">
              <param name="sequence">species_id_seq</param>
          </generator>

  </id>

  <property name="commonName" type="java.lang.String">
   <column name="common_name" />
  </property>
  <property name="latinName" type="java.lang.String">
  <column name="latin_name"/>
  </property>
  <property name="order" type="java.lang.String">
  <column name="order_name"/>
  </property>
  <property name="family" type="java.lang.String">
  <column name="family_name"/>
  </property>
 </class>
</hibernate-mapping>

Мой экземпляр SpeciesLister получает полный список ожидаемого количества экземпляров Species. Однако, когда я проверяю полученные экземпляры Species, все их поля имеют значение null, кроме id (long), все остальные, такие как familyName, latinName, commonName, все равны null в сопоставленном объекте.

Это неожиданно, и я не могу понять, почему это происходит. Я делаю что-то неправильно?

Я с подозрением отношусь к двум вещам, но я не уверен, что с ними делать:

  1. Я думаю, что тот факт, что id устанавливается как свойство, а не другие строковые поля, может быть подсказкой.

  2. Я подозреваю, что что-то не так с тем, как я приводил объекты в список экземпляров Species.

1 Ответ

0 голосов
/ 03 июня 2011

Код выглядит нормально.Без использования отладчика трудно сказать наверняка, однако я предполагаю, что где-то в сборке у вас есть инструменты класса времени компиляции.Если это так, я видел случаи, когда присвоение фактическому полю в классе откладывалось до тех пор, пока вы не вызовете метод getter.

Так что я предлагаю вам вместо некоторых операторов печати использовать методы получения, чтобы получить данныепрямой доступ к свойствам и посмотреть, что будет напечатано.

Наконец, пожалуйста, поставьте знак @ перед именами в комментариях (@Mark).Таким образом, ваши корреспонденты будут получать уведомления, и вы можете получить ответ раньше.

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