2011-08-25 15 views
8

मैं asking and answering my own question हूं, लेकिन मुझे नहीं लगता कि मेरे पास सबसे अच्छा जवाब है। यदि आपके पास बेहतर है, तो कृपया इसे पोस्ट करें!जेपीए में @EmbeddedId के रूप में @ManyToOne विशेषता को एक समग्र प्राथमिक कुंजी कैसे बनाएं?

संबंधित प्रश्न:

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

तर्क के लिए, चलो उन बारहमासी पसंदीदा, ऑर्डर और ऑर्डरलाइन का उपयोग करें।

-- 'order' may have been a poor choice of name, given that it's an SQL keyword! 
create table Order_ (
    orderId integer primary key 
); 
create table OrderLine (
    orderId integer not null references Order_, 
    lineNo integer not null, 
    primary key (orderId, lineNo) 
); 

मैं जेपीए का उपयोग कर जावा में इस मैप करने के लिए करना चाहते हैं:

करें SQL कुछ इस तरह लग रहा है। आदेश छोटा है, और ऑर्डरलाइन को @IdClass के साथ संभाला जा सकता है। Here's the code for that - कोड काफी पारंपरिक है, और मुझे आशा है कि आप मेरी idiosyncrasies को माफ कर देंगे।

हालांकि, @IdClass का उपयोग करके एक आईडी क्लास लिखना शामिल है जो ऑर्डरलाइन में फ़ील्ड को डुप्लिकेट करता है। मैं उस डुप्लिकेशन से बचना चाहता हूं, इसलिए मैं इसके बजाय @EmbeddedId का उपयोग करना चाहता हूं।

हालांकि, यह करने के लिए एक अनुभवहीन प्रयास विफल रहता है:

@Embeddable 
public class OrderLineKey { 
    @ManyToOne 
    private Order order; 
    private int lineNo; 
} 

OpenJPA एक @EmbeddedId के रूप में है कि के उपयोग को खारिज कर दिया। मैंने अन्य प्रदाताओं की कोशिश नहीं की है, लेकिन मैं उन्हें सफल होने की उम्मीद नहीं करूंगा, क्योंकि जेपीए विनिर्देश के लिए आवश्यक है कि आईडी कक्षा बनाने वाले फ़ील्ड बुनियादी हों, संबंध न हों।

तो, मैं क्या कर सकता हूं? मैं उस वर्ग को कैसे लिख सकता हूं जिसकी कुंजी में @ManyToOne संबंध है, लेकिन इसे @EmbeddedId के रूप में संभाला जाता है?

उत्तर

16

मुझे ऐसा करने का कोई तरीका नहीं पता है जिसमें किसी भी फ़ील्ड को डुप्लिकेट करना शामिल नहीं है (क्षमा करें!)। लेकिन यह एक सीधा और मानक तरीके से किया जा सकता है जिसमें केवल रिलेशनशिप फ़ील्ड को डुप्लिकेट करना शामिल है। कुंजी @MapsId एनोटेशन जेपीए में पेश 2.

एम्बेड करने योग्य कुंजी वर्ग इस तरह दिखता है:

@Embeddable 
public class OrderLineKey { 
    private int orderId; 
    private int lineNo; 
} 

और एम्बेडिंग इकाई वर्ग इस तरह दिखता है:

@Entity 
public class OrderLine{ 
    @EmbeddedId 
    private OrderLineKey id; 

    @ManyToOne 
    @MapsId("orderId") 
    private Order order; 
} 

@MapsId एनोटेशन घोषित करता है कि जिस रिश्ते क्षेत्र को लागू किया गया है वह एम्बेडेड आईडी से मूलभूत क्षेत्र को फिर से मानचित्रित करता है।

Here's the code for OrderId

+9

क्या होगा यदि आप जिस इकाई को संदर्भित करना चाहते हैं वह एक समग्र कुंजी है?क्या आप एम्बेडेड आईडी में एकाधिक कॉलम पर MapsId का उपयोग कर सकते हैं? –

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