2011-03-09 13 views
5


मैं ग्रहण (हेलीओस) में हाइबरनेट उपकरण 3.40 का उपयोग कर रहा हूं। मैं ईजेबी 3 शैली (यानी जेपीए 2.0 एनोटेशन) के साथ अपने डीबी (एमएसएसएलएल 2008) से पीओजेओ उत्पन्न करने की कोशिश कर रहा हूं।
मान लें कि मेरे पास दो टेबल A और B हैं जहां A से B तक एक विदेशी कुंजी है।
यह डिफ़ॉल्ट रूप से A के लिए एक POJO उत्पन्न करता है जिसमें B सदस्य (इसके "पैरेंट") और B के लिए POJO है जिसमें सदस्य (इसके "बच्चे") के रूप में Set<A> है।
मुझे यह जानना है कि मैं कैसे rev-eng को नियंत्रित कर सकता हूं ताकि एसोसिएशन का केवल एक पक्ष बनाया जा सके (मेरे पास अलग-अलग उपयोग के मामले हैं इसलिए मूल रूप से सभी तीन विकल्प मेरे लिए महत्वपूर्ण हैं)।
मैं फ़ाइलों के रूप में मैं एनोटेशन और JPA2.0 साथ काम कर रहा हूँ hbm.xml का उपयोग नहीं करना चाहते हैं, लेकिन मैंरिवर्स इंजीनियरिंग के साथ समस्या हाइबरनेट उपकरणों के साथ कई से एक यूनिडायरेक्शनल एसोसिएशन

मैं कोशिश की है hibernae.reveng.xml के माध्यम से हाइबरनेट करने के लिए रिवर्स इंजीनियरिंग प्रक्रिया पर कुछ मेटाडेटा निर्दिष्ट कर सकते हैं foreign-key को कॉन्फ़िगर करना और exclude=true को परिभाषित करना, लेकिन केवल मुझे एक परिदृश्य के लिए आधा जवाब प्रदान किया गया। इसने बीपीके इंट सदस्य के साथ A POJO उत्पन्न किया जो सहनशील और समझा जा सकता है लेकिनB के जेनरेट किए गए POJO अब संकलित नहीं है क्योंकि one-to-many एनोटेशन में एक अवैध विशेषता है; mappedby="unresolved" इस तथ्य के कारण कि A में अब ऐसी संपत्ति नहीं है जो हाइबरनेट रीवेन को वापस मैप कर सके।

तो, मैं वर्तमान में यूनी-दिशात्मक संघ नहीं बना सकता और मैं किसी भी मदद की सराहना करता हूं।

उत्तर

3

पर Hibernate Code Generation Configuration

उदाहरण reveng. strategy के लिए एक कक्षा बनाएं:

public class MyReverseEngineeringStrategy extends DelegatingReverseEngineeringStrategy { 

    public MyReverseEngineeringStrategy(ReverseEngineeringStrategy delegate) { 
     super(delegate); 
    } 

    @Override 
    public void setSettings(ReverseEngineeringSettings settings) { 
     super.setSettings(settings); 
    } 

    @Override 
    public boolean excludeForeignKeyAsCollection(String keyname, 
    TableIdentifier fromTable, java.util.List fromColumns, 
    TableIdentifier referencedTable, java.util.List referencedColumns) { 

    // TODO : Your work here 
    if (keyname.equals("___") && 
     fromTable.getName().equals("___") && 
     fromColumns.contains("___") && 
     referencedTable.getName().equals("___") && 
     referencedColumns.contains("___")) { 

     return true; 
    } 

    return false; 
    } 
} 

विधि excludeForeignKeyAsCollection

Should this foreignkey be excluded as a oneToMany 

के लिए JavaDoc और वहाँ भी है एक और विधि कॉल excludeForeignKeyAsManytoOne

Should this foreignkey be excluded as a many-to-one 
+1

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

+0

मुझे एक ही समस्या है, लेकिन आपका उत्तर "___" के लिए विशिष्ट है, यह सामान्य जवाब नहीं है। फिर भी धन्यवाद – Kummo

0

वर्तमान में (हाइबरनेट उपकरण 5.2 के साथ परीक्षण किया गया है), एक से अधिक कार्यों को एकजुट करने के लिए।

प्रलेखन (https://docs.jboss.org/tools/4.0.0.Final/en/hibernatetools/html_single/index.html#hibernaterevengxmlfile), जैसा कि आप देख सकते हैं कि आप रिश्ते के कुछ पक्ष को बाहर कर सकते हैं:

उदाहरण के लिए (नाम बदलने गुण)

<!-- control many-to-one and set names for a specific named foreign key constraint --> 
<foreign-key constraint-name="ORDER_CUST"> 
    <many-to-one property="customer"/> 
    <set property="orders"/> 
</foreign-key> 

या (छोड़कर गुण)

<!-- can also control a pure (shared pk) one-to-one --> 
    <foreign-key constraint-name="ADDRESS_PERSON"> 
    <one-to-one exclude="false"/> 
    <inverse-one-to-one exclude="true"/> 
    </foreign-key> 

तो @ManyToOne के साथ रिश्ते के केवल एक तरफ होने के लिए, आप निम्न कार्य कर सकते हैं:

<table name="city" schema="public"> 
    <primary-key property="id"> 
     <key-column name="id" type="integer"/> 
    </primary-key> 
</table> 

<table name="country" schema="public"> 
    <foreign-key constraint-name="country_capital_fkey" foreign-schema="public"> 
     <many-to-one property="capital" exclude="false"/> 
     <set exclude="true" /> 
    </foreign-key> 
</table> 

तुम भी डोकर यहाँ के साथ अपने नमूना डेटाबेस का एक उदाहरण लाने कर सकते हैं:

डोकर पुल ghusta/postgres-दुनिया-db: 2.1

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