2012-11-07 19 views
5

में द्वितीयक तालिका पर भेदभावकर्ता कॉलम होना संभव है, मैं वर्तमान में जेपीए इकाइयों के लिए मौजूदा डीबी स्कीमा मैपिंग के साथ संघर्ष कर रहा हूं, और बहुत अजीबता के बीच, मैं इस समस्या पर फंस गया हूं।क्या जेपीए

मैं दो तालिकाओं, इस के समान है:

Table 1   Table 2   
|Service  | |Servicetype  | 
|servicetype | |Servicecategory | 
|   | |    | 

कहाँ तालिका 1 में servicetype तालिका में दो में सेवा प्रकार के लिए एक विदेशी कुंजी है। हालांकि, तालिका 1 में सेवाओं के आधार पर विभिन्न प्रकार के व्यवहार हैं, जिनके आधार पर वे हैं (जबकि 100+ servicetypes हैं, केवल 4 श्रेणियां हैं) मैं तालिका 1 को मैप करने में सक्षम होना चाहता हूं चार अलग-अलग इकाई वर्ग, उनके सेवा प्रकार की श्रेणी के आधार पर। एक अलग discriminatorvalue, जो काम नहीं करता है के साथ, इस से विस्तार buth

@Entity 
@Table(name = "table1") 
@DiscriminatorColumn(name = "servicecategory", discriminatorType =   
    discriminatorType.INTEGER) 
@DiscriminatorValue("1") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@SecondaryTable(name = "table2", 
pkJoinColumns = 
@PrimaryKeyJoinColumn(name = "servicetype", referencedColumnName = 
"servicetype")) 
public class AbstractService implements Serializable { 
...etc 

और 4 वर्गों, eclipselink के बाद से, जो मैं उपयोग कर रहा हूँ, देखने के लिए कोशिश करता है:

यह वही है मैं अब तक किया है table1 में servicecategory का मूल्य।

क्या जेपीए के साथ ऐसा मैपिंग व्यक्त करना संभव है या क्या मुझे प्रत्येक क्वेरी पर "where servicecategory = ?" के साथ मैपिंग करना चाहिए।

+0

क्या आपने परिभाषा में तालिका और कॉलम नाम निर्दिष्ट करने का प्रयास किया है? "table2.servicecategory" – Chris

+0

भेदभावकर्ता टिप्पणी एनोटेशन में? हाँ। लेकिन जेनरेट की गई क्वेरी पहले से ही उपनाम द्वारा तालिका निर्दिष्ट करती है, इसलिए यह आपके जवाब के लिए $ tablealias.table2.servicecategory – vruum

उत्तर

1

कृपया इस सुविधा के लिए समर्थन जोड़ने के लिए एक्लिप्ससेंक में एक वृद्धि दर्ज करें। एक जेपीए समाधान द्वितीयक तालिका के साथ प्राथमिक तालिका को स्विच करना होगा - इससे सम्मिलन आदेश में समस्याएं हो सकती हैं और विदेशी कुंजी टेबल 2 में Servicetype का संदर्भ देगी।

एक ग्रहण लिंक विशिष्ट समाधान है कि अवरोधक क्षेत्र के लिए उपयोग की जाने वाली तालिका को बदलने के लिए एक कस्टमाइज़र का उपयोग करना है। इकाई में @ कस्टमाइज़र टैग जोड़ें और विधि के साथ एक वर्ग निर्दिष्ट करें:

public void customize(ClassDescriptor descriptor) { 
    descriptor.getInheritancePolicy().getClassIndicatorField().setTable(
     descriptor.getTable("table2")); 
} 
+1

धन्यवाद बन जाता है। '@ Customizer' टैग शक्तिशाली उपयोगी दिखता है, लेकिन हम मानक से चिपकने की कोशिश कर रहे हैं, पहले से ही हाइबरनेट से स्विच कर चुके हैं और प्रदाता विशिष्ट सामग्री द्वारा काट दिया गया है। भविष्य के संदर्भ के लिए, मैंने बस सेवा श्रेणी के साथ एक दृश्य तैयार किया, और सम्मिलन को अलग से संभाला, क्योंकि यह ज्यादातर मैं केवल पढ़ने-योग्य तालिका हूं। – vruum