2012-04-13 18 views
0

私は2つのテーブル、すなわち加入者と連絡先を持っています。マイContact.hbm.xmlファイルは次のようになります休止状態の複数のテーブルからデータを取得

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

<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_ 

私はコンタクトテーブルからコンタクト詳細を取得しない。どのように私はそれを行うことができるでしょうか?

+0

連絡先オブジェクトがヌルで、連絡先内のすべての詳細がNULLに設定されています。 – Ahmed

+0

.hbmファイルで 'lazy = false'を使用します。あなたがnullのエントリを取得しているため、あなたのケースでは本当です。 このオプションを使用すると、データがサブスクライバに保持されます。 – instanceOfObject

答えて

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:ヌル値がプリミティブ型のsetterのプロパティに割り当てられましたcom.smackdab.model.Contact.shipAddressId – Ahmed

+0

私はこの1つをContactテーブルにも持っています。そして今は空です。 :s – Ahmed

+1

ヌル値がプリミティブ型のプロパティに割り当てられている場合は、おそらく 'contactType'または' contactId'カラムにヌル値が含まれていることを意味します。その型をIntegerに変更してみてください。 –