2012-08-27 10 views
5

मेरे पास ऐसा एप्लिकेशन है जो कई अन्य पंक्तियों को संदर्भित करता है जो दो अन्य इकाइयों का संदर्भ देते हैं, यानी पंक्ति में दो विदेशी कुंजी संदर्भ हैं जो कई लोगों के संबंधों को समझते हैं।क्या जेपीए और माईएसक्यूएल का उपयोग करके इसे संदर्भित करने के लिए किसी इकाई को लाने के लिए आवश्यक है?

इन दो संस्थाओं संदर्भित किया जा रहा हैं:

CREATE TABLE a (
    `id` INT NOT NULL auto_increment, 
    -- lots of other attributes, 
    PRIMARY KEY (id) 
) 

CREATE TABLE b (
    `id` INT NOT NULL auto_increment, 
    -- lots of other attributes, 
    PRIMARY KEY (id) 
) 

इस इकाई जो संदर्भ देता है एक और ख:

CREATE TABLE x (
    `id` INT NOT NULL auto_increment, 
    `f_a` INT NOT NULL, 
    `f_b` INT NOT NULL, 
    CONSTRAINT `FK_a` FOREIGN KEY (`f_a`) REFERENCES `a` (`id`), 
    CONSTRAINT `FK_b` FOREIGN KEY (`f_b`) REFERENCES `b` (`id`), 
) 

ए, बी, और एक्स वर्गों ए, बी पर मैप किए जाते , और X ग्रहण के माध्यम से जेपीए का उपयोग कर एक्स, यह काफी बुनियादी है और इसके बारे में कुछ भी नहीं है।

जब मैं जावा में एक एक्स बनाने मैं निम्न कार्य (कि ए और बी ध्यान दें पहले से ही मौजूद है और मैं केवल अपने आईडी पता है - वे एक विरासत आवेदन से feeded हैं):

A a = entityManager.find(A.class, knownIdForA); 
B b = entityManager.find(B.class, knownIdForB); 

X x = new X(); 
x.setA(a); 
x.setB(b); 

entityManager.persist(x); 

बात है मुझे लगभग 200,000 इकाइयां डालना है, जो काफी है। क्रमश: एएस और बीएस के लगभग 3 गुना हैं, इसलिए मुझे 200,000 बार ए और ए बी लाने की ज़रूरत है, 200,000 से अधिक विभिन्न ए और बी, इसलिए कैशिंग के साथ मैं इतना कुछ नहीं कर सकता।

मेरा प्रश्न है: क्या यह पूरी इकाई लाने के लिए वास्तव में आवश्यक है? क्या इन लागतों को कम करने का कोई तरीका है? या क्या कोई तरीका है कि मैं जेपीए के लाभ खोने के बिना मैन्युअल रूप से विदेशी कुंजी संदर्भ (जो एक पूर्णांक तक उबाल जाता है) सेट कर सकता हूं (यानी मेरी खुद की क्वेरी लिखना नहीं है)?

प्रश्न का एक वैकल्पिक सूत्र: मैं जेपीए के साथ निम्नलिखित कैसे पूरा करूं?

INSERT INTO x (`f_a`, `f_b`) VALUES (13, 17); 

जहां f_a और f_b विदेशी कुंजी हैं?

उत्तर

6

आप ढूंढने() का उपयोग करके इकाई लोड करने के बजाय EntityManager की getReference() विधि का उपयोग करके "संदर्भ" उदाहरण प्राप्त कर सकते हैं। इन संदर्भों को आलसी तरीके से लाया गया है, इसलिए आपके मामले में उन्हें बिल्कुल लाने की आवश्यकता नहीं होगी।

आपका कोड समान दिखेगा:

A a = entityManager.getReference(A.class, knownIdForA); 
B b = entityManager.getReference(B.class, knownIdForB); 

X x = new X(); 
x.setA(a); 
x.setB(b); 

entityManager.persist(x); 

लेकिन केवल जारी रहती है() कॉल अपने DB का उपयोग होगा।