2009-02-02 9 views
5

मेरे पास एक से कई संबंधों का उपयोग करके दो तालिकाओं को एक साथ जोड़ा गया है: कर्मचारी -> विभाग: और कर्मचारी तालिका में department_id के माध्यम से संबंध।रनटाइम में हाइबरनेट परिवर्तन fetch मोड

मैं हाइबरनेट का उपयोग करें: और मेरी हाइबरनेट मानचित्रण फ़ाइलें हैं:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools 
--> 
<hibernate-mapping default-lazy="false"> 
<class catalog="moi" 
    name="com.ebla.moi.correspondence.model.entity.user.User" table="user"> 
    <id name="id" type="java.lang.Long"> 
    <column name="id"/> 
    <generator class="identity"/> 
    </id> 
    <many-to-one 
    class="com.ebla.moi.correspondence.model.entity.department.Department" 
    fetch="select" name="department"> 
    <column name="department_id"/> 
    </many-to-one> 
    <property generated="never" lazy="false" name="name" type="java.lang.String"> 
    <column length="128" name="name" not-null="true"/> 
    </property> 
    <property generated="never" lazy="false" name="email" type="java.lang.String"> 
    <column length="128" name="email" not-null="true" unique="true"/> 
    </property> 
    <property generated="never" lazy="false" name="maritalStatus" type="java.lang.Short"> 
    <column name="marital_status" not-null="true"/> 
    </property> 
    <property generated="never" lazy="false" name="hireDate" type="java.lang.String"> 
    <column length="64" name="hire_date"/> 
    </property> 
</class> 
</hibernate-mapping> 

और दूसरे मैपिंग फ़ाइल है:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools 
--> 
<hibernate-mapping default-lazy="false"> 
<class catalog="moi" 
    name="com.ebla.moi.correspondence.model.entity.department.Department" table="department"> 
    <id name="id" type="java.lang.Long"> 
    <column name="id"/> 
    <generator class="identity"/> 
    </id> 
    <property generated="never" lazy="false" name="name" type="java.lang.String"> 
    <column length="256" name="name" unique="true"/> 
    </property> 
    <set inverse="true" name="users" sort="unsorted"> 
    <key> 
    <column name="department_id"/> 
    </key> 
    <one-to-many class="com.ebla.moi.correspondence.model.entity.user.User"/> 
    </set> 
</class> 
</hibernate-mapping> 

मेरे समस्या है: कभी कभी मैं अपने विभाग के साथ कर्मचारी प्राप्त करने की आवश्यकता , और दूसरी बार मुझे केवल विभाग की जानकारी के साथ कर्मचारी की जानकारी चाहिए ..... और कर्मचारी के साथ विभाग के साथ एक ही बात .... हाइबरनेट के ऊपर मैपिंग फ़ाइल का उपयोग करके विभाग और उसके उपयोगकर्ताओं को लाएं यदि मुझे कर्मचारी की आवश्यकता है या नहीं ... एफ को हाइबरनेट करने के लिए मेरी जरूरतों को कैसे परिभाषित किया जाए बस खोदना मैं क्या जरूरत है ...

आप

उत्तर

10

धन्यवाद आप के रूप में "सुस्त" संबंध नक्शा और दो प्रश्नों लिख सकता है आपके datas प्राप्त करने के लिए:

  • सामान्य सरल क्वेरी पाने के लिए अपने डेटा ("आलसी")। जैसे "कर्मचारी ई से चुनें और कहां ..."

  • हाइबरनेट को "बच्चे" लाने के लिए मजबूर करने के लिए "fetch join" का उपयोग करके एक ही क्वेरी। जैसे "कर्मचारी से ई का चयन शामिल होने लाने e.department जहां छोड़ दिया ..."

एलएलपी, एंड्रिया

8

आप अपने कर्मचारी लाने के लिए ICriteria उपयोग कर सकते हैं।

आप निर्धारित करने के लिए विभाग दिलवाया जाना चाहिए कि क्या, या नहीं ICriteria की SetFetchMode विधि का उपयोग कर सकते हैं: इस कोड के साथ

ICriteria crit = theSession.CreateCriteria (typeof(Employee)); 
crit.SetFetchMode ("Department", FetchMode.Lazy) 

:

यह सुनिश्चित करें कि विभाग नहीं लाया गया है कर देगा विभाग लाया जाएगा।

ICriteria crit = theSession.CreateCriteria (typeof(Employee)); 
crit.SetFetchMode ("Department", FetchMode.Join) 

कुछ लोग कहते हैं मैपिंग में डिफ़ॉल्ट fetchmode (जो आलसी हो सकता है, मैं लगता है) का उपयोग करने कि यह है सबसे अच्छा अभ्यास है, और हर विशिष्ट परिदृश्य में fetchmode निर्दिष्ट करें। (वह है, आपके भंडार में)।

+0

यह मेरे लिए काम नहीं करता है। यह अभी भी संबंधित संस्थाओं को प्राप्त करता है लेकिन एक खंड में उपयोग नहीं कर रहा है। इसके बजाए, यह एक और चयन कथन कहता है। – supertonsky

2

ऐसा करने का एक तरीका यह एक कर्मचारी का प्रतिनिधित्व दो वर्गों है:

  • Employee विभाग जानकारी के माध्यम से मैप किया गया है जो;
  • EmployeeSummary जिसमें केवल कर्मचारी डेटा ही है।

दोनों वर्गों तो employee मेज पर स्वतंत्र बाइंडिंग है, लेकिन केवल Employee भी department पर संबंध परिभाषित है।

तब जब आपको Employee उदाहरण लोड करने वाली सभी जानकारी की आवश्यकता होती है, और जब आपको केवल कर्मचारी की जानकारी की आवश्यकता होती है तो आप EmployeeSummary उदाहरण लोड करते हैं।

आप कर्मचारी वर्ग दोनों के लिए AbstractEmployee जैसे एक सामान्य सुपरक्लास पेश करके ओआरएम बाइंडिंग और व्यावसायिक तर्क के किसी भी डुप्लिकेशंस को हटा सकते हैं।

+1

मुझे नहीं लगता कि यह इस स्थिति में एक अच्छा विचार है। क्या होगा यदि आपकी कक्षाओं में जटिल बीएल है? आपको इसे डुप्लिकेट करना होगा? –

+0

यदि आप सामान्य सुपरक्लास पेश करते हैं, लेकिन अच्छी बात नहीं है - मैंने इसे प्रतिबिंबित करने के लिए उत्तर अपडेट किया है। –

+0

क्या होगा यदि एक सत्र में एक कर्मचारी और कर्मचारी कर्मचारी, जहां एक ही डेटाबेस रिकॉर्ड से लोड किया गया था, तो उनमें से एक या दोनों बदल गए थे? –

संबंधित मुद्दे