2012-04-13 89 views
0

我有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> 

现在我想检索一个简单的订阅者对象,其中联系人自动映射。因此,我在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_ 

我没有从联系人表中获取联系信息。我将如何做到这一点?

+0

联系人对象为空,联系人内部的所有详细信息都设置为空。 – Ahmed 2012-04-13 19:43:01

+0

在.hbm文件中使用'lazy = false'。你的情况确实如此,因为你得到空条目。 一旦你使用这个选项,它将把数据保存在订阅者中。 – instanceOfObject 2012-04-13 19:54:25

回答

1

尝试使用此:

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

lazy="false"fetch属性。

+0

org.hibernate.PropertyAccessException:空值已分配给com.smackdab.model.Contact.shipAddressId的原始类型setter的属性 – Ahmed 2012-04-13 19:59:25

+0

我在联系表中也有一个shipAddressId。它现在是空的。 :s – Ahmed 2012-04-13 20:00:04

+1

如果您有'空值被分配给原始类型的属性',这意味着最有可能'contactType'或'contactId'列包含空值。尝试将其类型更改为Integer。 – 2012-04-13 20:02:56