2010-12-09 8 views
6

के साथ एक ही ऑब्जेक्ट पर अभिभावक/बाल संबंध को कैसे मैप करूँगा इस पोस्ट को पढ़ने के बाद JPA map relation entity parentID मैंने इसे अपने कोड पर लागू करने का प्रयास किया लेकिन यह मेरे लिए काम नहीं किया।मैं जेपीए

यह मैं

@Test 
public void testParentAndSubCategories() { 

    //Create the parent category 
    new Category(null, "Sport", true).save(); 
    Category sportCat = Category.find("byName", "Sport").first(); 

    //Test the newly created parent category state 
    assertNotNull(sportCat); 
    assertEquals("Sport", sportCat.name); 
    assertEquals(true, sportCat.active); 
    assertEquals("Sport", sportCat.fullName); 
    assertNull(sportCat.parentCategory); 
    assertEquals(0, sportCat.subCategories.size()); 

    //Create the subCategory 
    new Category(sportCat, "Hockey", false).save(); 
    Category hockeyCat = Category.find("byName", "Hockey").first(); 

    // Test the newly created sub category 
    assertNotNull(hockeyCat); 
    assertEquals("Hockey", hockeyCat.name); 
    assertEquals(false, hockeyCat.active); 
    assertEquals("Sport/Hockey", hockeyCat.fullName); 
    assertNotNull(hockeyCat.parentCategory); 
    assertEquals("Sport", hockeyCat.parentCategory.name); 
    assertEquals(0, sportCat.subCategories.size()); 

    //Fetch new values for parent category 
    sportCat = Category.find("byName", "Sport").first(); 

    // Test updated parent category 
    assertEquals(1, sportCat.subCategories.size()); 
    assertEquals("Hockey", sportCat.subCategories.get(0).name); 

} 

परीक्षण की यह पंक्ति चलाने हमेशा असफल

@Entity 
public class Category extends Model { 

public static final int EASY = 1; 
public static final int MEDIUM = 2; 
public static final int HARD = 3; 
public static final int VERRY_HARD = 4; 

public String name; 
public String fullName; 
public boolean active; 
public Date createdOn; 
public int difficulty; 

@ManyToOne 
@JoinColumn(name = "FK_PARENT_CATEGORY") 
public Category parentCategory; 

@OneToMany(mappedBy="parentCategory", cascade = CascadeType.ALL) 
public List<Category> subCategories; 

public Category(Category parentCategory, String name, boolean active) { 
    this.name = name; 
    this.active = active; 
    this.parentCategory = parentCategory; 
    this.subCategories = new ArrayList<Category>(); 
    this.createdOn = new Date(); 
    this.difficulty = Category.EASY; 
    this.fullName = name; 
    if (parentCategory != null) 
     this.fullName = parentCategory.fullName + "/" + this.fullName; 

} 

अब इस परीक्षण है कोड मैं अपने वस्तु में है।

// Test updated parent category 
    assertEquals(1, sportCat.subCategories.size()); 

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

उत्तर

5

यह एक ही कक्षा के लिए मानचित्रण माता-पिता और बच्चे के एक समस्या नहीं है। - समस्या यह है कि आपको हाथ से द्वि-दिशात्मक संबंधों के दोनों सिरों को बनाए रखने की आवश्यकता है।

child.setParent(parent) 
parent.addChild(child) 

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

+0

यह वही है जो मैंने किया था। मैंने अभिभावक श्रेणी में उपश्रेणी जोड़ने के लिए एक विधि जोड़ा। मैंने तदनुसार अपना परीक्षण संशोधित किया और यह ठीक वैसे ही काम करता है जैसा मैं चाहता हूं। बहुत बहुत धन्यवाद राल्फ। और जवाब के लिए हर किसी के लिए धन्यवाद। – Alain

2

आपके प्रश्न में दिखाया गया कोड subCategories पर कुछ भी नहीं जोड़ता है। यह केवल एक खाली सूची के साथ शुरू होता है। मैं तुम्हें,

if (parentCategory != null) { 
    parentCategory.subCategories.add(this); 
} 

तो की तरह कुछ की जरूरत के रूप में मैं सही ढंग से समझ (और पढ़ें) अपने कोड, हाइबरनेट नहीं लगता है कि यह है, क्योंकि (नहीं कर सकता) उपश्रेणियाँ पुनः प्राप्त new Category(sportCat, "Hockey", false).save();

0

बुला आप शायद थे के बाद खाली रहता है बच्चे को मूल इकाई जोड़ने के लिए पर्याप्त होने की उम्मीद है, लेकिन मैंने जो देखा है, उससे हाइबरनेट को एक-से-कई रिश्तों के दोनों सिरों को बनाए रखने की आवश्यकता है।

दूसरे शब्दों में, आपको अभिभावकों की श्रेणियों की सूची में बाल श्रेणी जोड़नी होगी। यहाँ (एक अतिरिक्त कैशिंग मुद्दे के साथ) http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-parentchild.html#example-parentchild-bidir

और यह भी:

यह यहाँ वर्णित Hibernate @OneToMany with mappedBy (parent-child) relationship and cache problem