hibernate关联查询查不到数据的问题

照着网上的hibernate many-to-one示例,一直查不出关联表的数据。2个映射文件如下。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
<hibernate-mapping>
<class name=”com.xxx.domain.Software” table=”software” >
<id name=”id” type=”int”>
<column name=”id” />
<generator class=”increment” />
</id>
<property name=”name” type=”string”>
<column name=”name” length=”50″ />
</property>
<many-to-one name=”softwareCategory” class=”com.xxx.domain.SoftwareCategory”
column=”category_id” cascade=”all”>
</many-to-one>
</class>
</hibernate-mapping>

 

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
<hibernate-mapping>
<class name=”com.xxx.domain.SoftwareCategory” table=”software_category” catalog=”wifi99″>
<id name=”id” type=”int”>
<column name=”id” />
<generator class=”increment” />
</id>
<property name=”name” type=”string”>
<column name=”name” length=”50″ />
</property>
</class>
</hibernate-mapping>

根据id查询software对象,关联的softwareCategory为null。检查数据库里数据,确定没问题。google上查了半天,原因是配置many-to-one时要没有加上lazy=”false”。

Hibernate中使用addEntity方法解决使用SQL查询时对象映射问题

我们在使用hibernate时,有时遇到比较复杂的查询,不好写HQL语句,只能写SQL。但是这时查询出来的是Object对象,我们需要将这些Ojbect对象转换成我们想要的域对象。

如果我们已经在hbm.xml文件里定义过表和领域类的映射关系,这时就很简单,只要加上addEntity方法就可以解决,如下。为了简化,下面的sql语句比较简单。

String sql = "select s.* from software s";
Query query = getHibernateTemplate().getSessionFactory().openSession().createSQLQuery(sql).addEntity(Software.class);
return (List<Software>)query.list();

需要强调的是:必须已经定义过software表和Software类的映射关系。

比如我已经在software.hbm.xml有如下定义了:

<hibernate-mapping>
    <class name="com.lixiaodong.Software" table="software" catalog="lixiaodong">
        <id name="id" type="int">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="name" type="string">
            <column name="name" length="50" />
        </property>
    </class>
</hibernate-mapping>