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

이제 연락처가 자동으로 매핑되는 간단한 구독자 개체를 검색하려고합니다. 그래서 자바 코드에서하는 일입니다

/** 
    * 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이고 연락처 내부의 모든 세부 정보가 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 : 원시 값이 com.smackdab.model.Contact.shipAddressId의 원시 유형 setter의 특성에 지정되지 않았습니다. – Ahmed

+0

이 테이블은 연락처 테이블에서도이 하나의 shipAddressId를가집니다. 그리고 지금은 비어 있습니다. : s – Ahmed

+1

'Null 값이 프리미티브 타입의 프로퍼티에 할당 되었다면'아마도'contactType' 또는'contactId' 컬럼이 널 값을 포함한다는 것을 의미합니다. 유형을 정수로 변경하십시오. –

관련 문제