2017-03-19 8 views
7

मेरे पास विरासत कोड है जिसे मैं नए कोड में मैप करने का प्रयास कर रहा हूं।जटिल जुड़ने के लिए हाइबरनेट मैपिंग

OLD_PERSON 
pid 
sid 
name 
age 

NEW_PERSON 
pid 
sid 
fid 
age 

RESOLVE_PERSON 
pid 
fid 
status 

जावा वर्ग

domain.Person { 
ID _id; 
String _name; 
Integer _age; 
} 

विरासत दुनिया में, सिर्फ एक मेज था: OLD_TABLE। हाइबरनेट मैपिंग सरल था, सिर्फ एक वर्ग और इसके कॉलम। नई दुनिया में, मुझे उपर्युक्त 3 टेबल का उपयोग करना होगा और एक इकाई का उत्पादन करना होगा जहां नाम OLD_PERSON और से आयु NEW_PERSON से आता है। तो मूल रूप से एक SQL क्वेरी है:

select op.name as name, np.age as age 
from OLD_PERSON op 
INNER JOIN RESOLVE_PERSON rp 
on rp.pid = op.pid 
INNER JOIN NEW_PERSON np 
on np.pid = rp.pid and np.fid = rp.fid and np.sid = op.sid 
where rp.status = 'CURRENT' 

अनुसंधान पर/मैंने पाया कि मैं "माध्यमिक टेबल" जो "तालिका में शामिल हों" हाइबरनेट एक्सएमएल में के समकक्ष हैं उपयोग कर सकते हैं googling। नोट: मैं एनोटेशन का उपयोग नहीं कर सकता क्योंकि यह कोड पुराना है और मैं अभी भी हाइबरनेट 3.5.6 पर हूं।

तो मैं अपने मानचित्रण फाइल के अंदर एक मेज में शामिल होने कहा:

<class name="domain.Person" table="OLD_PERSON"> 
     <composite-id name="_id" class="Id"> 
      <key-property access="property" name="key1" type="long" column="pid" /> 
      <key-property access="property" name="key2" type="int" column="sid" /> 

      <generator class="assigned" /> 
     </composite-id> 

     <property name="_Name" type="String" column="name" /> 

     <join table="NEW_PERSON" fetch="join" inverse="false"> 
      <key> 
      <column name="pid" /> 
      <column name="sid" /> 
      </key> 
      <property name="_age" column="age" not-null="true" /> 
     </join> 
</class> 

लेकिन शामिल होने के लिए NEW_PERSON तालिका RESOLVE_PERSON तालिका के साथ एक आंतरिक में शामिल होने की आवश्यकता है। मैंने उप-चयन का उपयोग करने का प्रयास किया लेकिन इसका उपयोग करने की सही चीज़ नहीं है। मैं यहां कहीं भी फॉर्मूला प्लग करने में असमर्थ हूं।

यह कैसे प्राप्त किया जा सकता है इस पर कोई संकेतक? जो मैं अनिवार्य रूप से पूछ रहा हूं वह है कि जॉइन पर मानदंड/बाधा जांच कैसे लागू करें।

उत्तर

1

मुझे आपकी समस्या के समान स्थिति थी। मैंने तीसरी तालिका को एक इकाई में मैप किया है और इस इकाई के लिए अपनी संपत्ति से कुछ प्राप्त करने के लिए डीएओ का उपयोग किया है।

यहाँ, (के बाद से मैं एनोटेशन का इस्तेमाल किया है, तो यह कुछ आप सीधे उपयोग कर सकते हैं, लेकिन उम्मीद है कि यह आप कुछ प्रेरणा दे देंगे नहीं है) कोड है

@Entity 
@Table(name = "resolve_person") 
public class ResolvePerson implements java.io.Serializable { 
    private OldPerson old; 
    private NewPerson new; 

    ... 

    @ManyToOne // you may change it to other relationships 
    @JoinColumn(name = "pid", nullable = false) 
    public OldPerson getOldPerson() { 
     return this.old; 
    } 

    public void setOldPerson (OldPerson old) { 
     this.old = old; 
    } 

    @Id 
    @GeneratedValue(generator = "idGenerator") 
    @GenericGenerator(name = "idGenerator", strategy = "foreign", 
      parameters = { @org.hibernate.annotations.Parameter(name = "property", value = "fid") }) 
    @Column(name = "fid", nullable = false, unique = true) 
    public NewPerson getNewPerson() { 
     return this.New; 
    } 

    public void setNewPerson (NewPerson new) { 
     this.new = new; 
    } 
} 

डीएओ काफी सामान्य है,

public List findByProperty(String propertyName, Object value) { 
     log.debug("finding ResolvePerson instance with property: " 
       + propertyName + ", value: " + value); 
     try { 
      String queryString = "from ResolvePerson as model where model." 
        + propertyName + "= ?"; 
      Query queryObject = getSession().createQuery(queryString); 
      queryObject.setParameter(0, value); 
      return queryObject.list(); 
     } catch (RuntimeException re) { 
      log.error("find by property name failed", re); 
      throw re; 
     } 
    } 

अब आप संपत्ति "स्थिति" से "वर्तमान" पर क्वेरी कर सकते हैं।

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