在hibernate中从多个表中检索数据

时间:2012-04-13 19:41:48

标签: java database hibernate multiple-tables

我有2个表,即订阅者和联系人。 表格看起来像这样:

subscriber -> id, contact_id //contact_id is a foreign key
contact -> id, firstName, lastName, email, contactType

我的Contact.hbm.xml文件如下所示:

<hibernate-mapping>
    <class name="com.DBNAME.model.Contact" table="contact" >

        <id name="id" type="int">
            <column name="id" />
            <generator class="identity" />
        </id>

        <property name="contactType" type="int">
            <column name="contactType" sql-type="TINYINT"></column>
        </property>
        <property name="firstName" type="string">
            <column name="firstName"></column>
        </property>
        <property name="lastName" type="string">
            <column name="lastName"></column>
        </property>
    </class>
</hibernate-mapping>

我的Subscriber.hbm.xml文件如下所示:

<hibernate-mapping>
    <class name="com.DBNAME.model.Subscriber" table="subscriber" >

        <id name="id" type="int">
            <column name="id" />
            <generator class="identity" />
        </id>

        <many-to-one name="contact" class="com.DBNAME.model.Contact" column="contact_id" unique="true" fetch="join"/>
    </class>

</hibernate-mapping>

现在我想检索一个简单的Subscriber对象,其中联系人自动映射。所以我在Java代码中所做的是:

/**
     * get Subscribers
     */
    @SuppressWarnings("unchecked")
    private void getSubscribersWithContactDetails() {
        Session session = HibernateUtils.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        try {
            setSubscribers((List<Subscriber>)session.createQuery("from Subscriber").list());
        } catch (HibernateException e) {
            session.getTransaction().rollback();
        } finally {
            session.getTransaction().commit();
        }
        }

/**
     * @param subscribers the subscribers to set
     */
    public void setSubscribers(List<Subscriber> subscribers) {
        this.subscribers = subscribers;
    }

我的数据类如下所示:

    public class Contact implements Serializable {

        private static final long serialVersionUID = 1L;

        private int id;
        private int contactType;
        private String firstName;
        private String lastName;
    // Getters Setters and constructors
    }


public class Subscriber implements Serializable {
    private static final long serialVersionUID = 1L;

    private int         id;
    private Contact     contact; //Foreign Key from Contact -> id
    private int         contactId;
//Constructors, Getters and Setters
}

我的Hibernate生成的查询如下所示:

select subscriber0_.id as id1_, subscriber0_.contact_id as contact2_1_ from subscriber subscriber0_

我没有从联系人表中获取联系方式。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

尝试使用它:

 <many-to-one name="contact" 
     class="com.DBNAME.model.Contact" column="contact_id" 
     unique="true" lazy="false"/>

即。 lazy="false"并且没有fetch属性。