【问题标题】:Hibernate mapping returns null propertiesHibernate 映射返回空属性
【发布时间】:2011-06-02 16:06:32
【问题描述】:

我有一个 Hibernate 映射设置。表是物种,我的 Java 类是物种。 hibernate.cfg.xml 指向species.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)
)

species.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 实例时,它们的所有字段都为空,除了 id (long),所有其他字段,如 familyName、latinName、commonName 在映射对象中都为空。

这是出乎意料的,我不知道为什么会这样。难道我做错了什么?

我对两件事持怀疑态度,但我不知道该怎么做:

  1. 我认为 id 正在设置属性,而不是其他字符串字段这一事实可能是一个线索。

  2. 我怀疑我将对象转换为 Species 实例列表的方式可能有问题。

【问题讨论】:

  • 数据库中的字段是否也为 NULL 或者是否设置正确,只有检索到的实例中的字段为 NULL?
  • 您可能想要启用调试并查看生成的查询。然后你可以尝试直接在数据库中输入这个查询,看看结果如何。这将缩小范围。
  • 顺便问一下,你的 SpeciesLister 代码是什么?您还可以将调试器断点放在添加物种的循环中,并查看 Hibernate 返回的对象是否正确。
  • joe,数据库字段本身设置正确
  • alex,正在生成的查询(选择 species0_.id 作为 id0_,species0_.common_name 作为 common2_0_,species0_.latin_name 作为 latin3_0_,species0_.order_name 作为 order4_0_,species0_.family_name 作为 family5_0_ from species species0_)执行正确并返回预期结果。

标签: java hibernate


【解决方案1】:

代码看起来没问题。如果不进入调试器,很难确定,但我的猜测是你在构建的某个地方有编译时类检测。如果是这种情况,我已经看到了将类中实际字段的分配延迟到您调用 getter 方法的情况。

因此,我建议您放置一些依赖于 getter 的打印语句来获取数据,而不是直接访问属性并查看打印的内容。

最后,请在 cmets (@Mark) 中的名称前加上 @ 符号。这样,您的通讯员会收到通知,您可能会更快得到回复。

【讨论】:

    猜你喜欢
    • 2019-12-05
    • 2019-10-22
    • 1970-01-01
    • 2021-02-17
    • 2018-02-16
    • 1970-01-01
    • 2019-01-05
    • 2015-04-05
    • 2011-06-22
    相关资源
    最近更新 更多