2010-12-23 15 views
7

मैं डीबी में निम्न स्कीमा मिल गया है (सरलीकृत)क्या किसी भी संगठन को परिभाषित किए बिना किसी इकाई में किसी फ़ील्ड को मैप करना संभव है?

MainTable(
    ID primary key 
    SOMEFIELD 
    CODE_FK1 -- references OtherTable1 CODE (without declared foreign key) 
    CODE_FK2 -- references OtherTable2 CODE (without declared foreign key) 
    ... Other fields used 
) 

OtherTable1(
    CODE primary key 
    LABEL 
    ... other fields not used 
) 

OtherTable2(
    CODE primary key 
    LABEL 
    ... other fields not used 
) 

अगर वहाँ आदेश सीधे मेरे दूसरे टेबल, यानी बिना से लेबल का उपयोग करने के मुख्य तालिका के लिए मेरे इकाई निर्धारित करने का कोई रास्ता नहीं है मैं पूछ रहा हूँ इन अन्य टेबल के लिए परिभाषित इकाइयों।

मैं डीबी स्कीमा नहीं बदल सकता, जो वास्तव में भयानक है (हर जगह लेबल/कोड जोड़े हैं, गुणक तालिकाओं में परिभाषित हैं)। और यदि यह संभव था, तो यह समाधान मेरे कोड को सरल रखने की अनुमति देगा, क्योंकि मुझे वास्तव में इन अन्य इकाइयों की आवश्यकता नहीं है। आपकी मदद के लिए अग्रिम द्वारा

@Entity 
public class MainEntity{ 
    @Id 
    private Integer ID; 

    @Column(name="SOMEFIELD") 
    private String SomeField; 

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE 
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1") 
    private String Label1; 

    @SomeAnnotation to Join CODE_FK_1 with OtherTable1.CODE 
    @SomeAnnotation like @Column(name="LABEL", table="OtherTable1") 
    private String Label1; 

} 

धन्यवाद:

मुझे लगता है कि यह ऐसा ही कुछ परिणाम होगा!

+1

मैं वास्तव में संदेह है, तो इस के साथ इकाई स्तर रिश्तों पर जेपीए (के साथ संभव है अन्य संस्थाओं को परिभाषित किया गया है, न कि कैसे शामिल इकाइयों में खेतों को प्राप्त करने के तरीके)। क्या आपने उन दो विकल्पों पर विचार किया है: ए) जेपीए इकाइयों को सभी प्रासंगिक तालिकाओं को मानचित्र करें, और जब आपको आवश्यकता हो तो क्वेरी करें; बी) अगर डीबी इंटरैक्शन ज्यादा नहीं है, तो जीवन को सरल बनाने के लिए जेडीबीसी का उपयोग करें? –

उत्तर

12

एक और संभावना अन्य तालिका से मूल्य लाने के लिए @Formula एनोटेशन का उपयोग किया जाएगा। जब भी आप अपनी इकाई लोड करते हैं, यह स्वचालित रूप से उप-चयन उत्पन्न करेगा।

मुझे लगता है कि आप कुछ इस तरह की आवश्यकता होगी:

@Entity 
public class MainEntity{ 
    @Id 
    private Integer ID; 

    @Column(name="SOMEFIELD") 
    private String SomeField; 

    @Formula("(SELECT ot1.LABEL FROM OtherTable1 ot1 WHERE ot1.CODE = CODE_FK_1)") 
    private String Label1; 

} 

वहाँ [हाइबरनेट डॉक्स] में इस बारे में बहुत कम जानकारी है [1], तो आप कुछ परीक्षण और त्रुटि की आवश्यकता हो सकती यह सही पाने के लिए (लेकिन आप इसे hibernate.show_sql=true साथ बाहर काम करने के लिए सक्षम होना चाहिए

इस दृष्टिकोण के लिए 2 संभव कमियां हैं:।

  1. यह हाइबरनेट-विशिष्ट कोड
  2. है
  3. यह सादा एसक्यूएल है, और इस तरह डेटाबेस विशिष्ट हो सकता है

HTH

[1]: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-property हाइबरनेट डॉक्स

+1

मैन। आपने मुझे लगभग 2 घंटे का काम बचाया। आपको बहुत - बहुत धन्यवाद! –

1

आप @ सेकेंडरीटेबल एनोटेशन का उपयोग कर सकते हैं। इस उदाहरण देखें:

https://github.com/hibernate/hibernate-core/blob/master/hibernate-core/src/test/java/org/hibernate/test/annotations/join/Dog.java

+0

आपके सुझाव के लिए धन्यवाद, लेकिन हम laready कोशिश की। वास्तव में, हमने एक अपवाद प्राप्त किया: org.hibernate.AnnotationException: माध्यमिकटेबल JoinColumn एक गैर प्राथमिक कुंजी का संदर्भ नहीं दे सकता है। मुझे हाइबरनेट के बगट्रैक पर पोस्ट की गई एक समस्या मिली: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4987। – mdomenjoud

+0

फिर मैं उस जिरा में टिप्पणी करने की सलाह देता हूं। एक परीक्षण केस प्रदान करना न भूलें :-) अन्यथा, यह अभी भी अगले संस्करण में एक बग होगा। – jpkrohling

+0

पोस्ट में एक टूटी हुई लिंक है ... – slartidan

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

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