2009-06-15 12 views
34

मेरे पास दो टेबल हैं: Ta और Tb। उनके पास बिल्कुल एक ही टेबल संरचना है लेकिन अलग-अलग टेबल नाम हैं।जेपीए, विभिन्न तालिकाओं को मैप करने के लिए एक ही कक्षा (इकाई) का उपयोग कैसे करें?

मैं तालिका संरचनाओं को मैप करने के लिए एक इकाई वर्ग बनाने का प्रयास करता हूं। मेरे कुछ सामान्य अनुप्रयोग मॉड्यूल पैरामीटर के आधार पर Ta या Tb गतिशील रूप से क्वेरी करने और अद्यतन करने के लिए इस इकाई वर्ग का उपयोग करेंगे। क्या यह जेपीए में किया जा सकता है? मैं रन क्लास पर अलग-अलग तालिकाओं में इकाई वर्ग को गतिशील रूप से मैप करने के लिए प्रोग्राम कैसे लिख सकता हूं?

उत्तर

37

सुनिश्चित नहीं है कि आप इसे वही कर सकते हैं जैसा आप चाहते हैं लेकिन आप उसी परिणाम का उत्पादन करने के लिए विरासत का उपयोग कर सकते हैं।

AbsT सभी क्षेत्रों लेकिन कोई @Table एनोटेशन

टा और टीबी AbsT से विरासत और एक @Table एनोटेशन प्रत्येक

उपयोग

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
AbsT में

है है।

नमूना कोड:

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class abstract AbsT { 
    @Id Long id; 
... 
} 

@Entity 
@Table(name = "Ta") 
public class Ta extends AbsT { 
... 
} 

@Entity 
@Table(name = "Tb") 
public class Tb extends AbsT { 
... 
} 
+6

यह काम करता है, धन्यवाद! हालांकि, टॉपलिंक के लिए, TABLE_PER_CLASS समर्थित नहीं है। मैंने @mappedSuperClass विधि की कोशिश की और यह भी काम करता है। –

+4

जो भी विरासत बनाम मैप्डसपर क्लास के बारे में अनिश्चित है, उनके यहां वर्णित और तुलना की गई है: http://stackoverflow.com/a/9669719/2278186 – SatA

7

तुम भी उपवर्गों का उपयोग कर यदि आप दो अलग अलग हठ इकाइयों का उपयोग के बिना यह कर सकते हैं।

प्रत्येक दृढ़ता इकाई मैपिंग का एक अद्वितीय सेट निर्दिष्ट कर सकती है (तालिका नाम सहित)। इसे प्राप्त करने का एक तरीका दो orm.xml फ़ाइलों को बनाना है। persistence.xml में आप कुछ इस तरह की आवश्यकता होगी:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    version="1.0"> 

    <persistence-unit name="mapping-1"> 
     . . . 
     <mapping-file>orm-1.xml</mapping-file> 
     . . . 
    </persistence-unit> 

    <persistence-unit name="mapping-2"> 
     . . . 
     <mapping-file>orm-2.xml</mapping-file> 
     . . . 
    </persistence-unit> 
</persistence> 
फिर ORM-1.xml भीतर

:

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd" 
    version="1.0"> 
    <package>mypackage</package> 
    <entity name="myEntity" class="myClass"> 
     <table name="TABLE1"> 
      </table> 
    </entity> 
</entity-mappings> 

और ORM-2.xml भीतर:

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd" 
    version="1.0"> 
    <package>mypackage</package> 
    <entity name="myEntity" class="myClass"> 
     <table name="TABLE2"> 
      </table> 
    </entity> 
</entity-mappings> 

आप प्रत्येक PersistenceUnit (संभवतः आप जो चाहते हैं) के लिए एक अलग इकाई MananFactory बनाने की आवश्यकता होगी, लेकिन यदि आप अलग-अलग डेटाबेस (विभिन्न तालिका नामों के साथ) पर एक ही कक्षा का उपयोग करना चाहते हैं तो यह जाने का एक तरीका होगा।

18

एनोटेशन @ मैप्डसुपरक्लास के साथ एक सार श्रेणी (एक टेम्पलेट क्लास) बनाएं, फिर इसे विस्तारित करें। प्रत्येक वर्ग जो @table, @entity एनोटेशन का उपयोग करता है और इसमें खाली कन्स्ट्रक्टर के अलावा कुछ भी नहीं है। सभी कोड आपके मूल वर्ग में होंगे। अपनी विधियों पर जेनरिक्स का उपयोग करें जो आपकी पैरामीटर इकाई टेम्पलेट क्लास से फैली हुई है और कोई और कोड परिवर्तन की आवश्यकता नहीं है। आपके द्वारा पारित प्रत्येक बेटे में उचित मैपिंग होगी।