2012-04-13 91 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