2012-12-14 27 views
5

मैं केवल जेपीए एनोटेशन का उपयोग कर रहा हूं और जेपीए कार्यान्वयन के रूप में 4.0.1 हाइबरनेट कर रहा हूं।जेपीए/हाइबरनेट मैपिंग टेबल एक से कई रिश्तों के लिए

मैं एक Assessment वर्ग Comment के दो सेट हैं कि है:

:

@Entity 
@Table(name = "ASSESSMENT") 
public class Assessment{ 

    @OneToMany(fetch = FetchType.EAGER) 
    private Set<Comment> auditComments = new HashSet<Comment>(); 

    @OneToMany(fetch = FetchType.EAGER) 
    private Set<Comment> comments = new HashSet<Comment>(); 
} 

टिप्पणी (मैं ही टिककर खेल, setters, झरना एनोटेशन और कोड के अन्य अप्रासंगिक लाइनों लंघन कर रहा हूँ)

@Entity 
@Table(name = "COMMENT") 
public class Comment{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(columnDefinition = "text") 
    private String text; 
} 

अब, क्योंकि Comment में कोई नहीं है Assessment पर वापस संदर्भ (यह उद्देश्य पर है), मैं मैप किए गए संपत्ति का उपयोग नहीं कर सकता और हाइबरनेट को Comment और Assessment के बीच मैपिंग तालिका बनाने की आवश्यकता है। डिफ़ॉल्ट रूप से, इसे ASSESSMENT_COMMENT नाम दिया गया है।

यदि मेरे पास का Assessment में केवल एक सेट था, तो यह पूरी तरह से ठीक काम करेगा।

[ASSESSMENT_ID, COMMENT_ID] 

पूरी तरह से एक-से-अनेक संबंध का प्रतिनिधित्व करेंगी जो: ASSESSMENT_COMMENT केवल दो कॉलम होगा।

अब यहाँ समस्या है:

क्योंकि मैं Comment लेकिन दोनों में से एक सेट नहीं है, हाइबरनेट केवल एक ASSESSMENT_COMMENT तालिका का उपयोग कर दो सेट मैप करने के लिए कोशिश करता है। इस तालिका में 3 कॉलम हैं:

[ASSESSMENT_ID, COMMENT_ID, AUDITCOMMENT_ID] 

उस पर, 3 कॉलम गैर शून्य के रूप में सेट किए गए हैं।

यह निश्चित रूप से काम नहीं कर सकता है। उदाहरण के लिए, यदि मेरे पास ऑडिट में केवल एक आइटम है और टिप्पणियों में कोई भी नहीं है, तो हाइबरनेट COMMENT_ID में एक शून्य के साथ एक पंक्ति डालने का प्रयास करता है जो SQL अपवाद बनाता है।

सवाल:

मेरे लिए यह एक बग की तरह दिखता है। दो मैपिंग टेबल होना चाहिए, एक नहीं।

तो, 1) क्या यह हाइबरनेट में ज्ञात बग है? 2) क्या उसके चारों ओर एक रास्ता है? क्या मैं प्रत्येक मैपिंग टेबल बनाने के लिए हाइबरनेट को मजबूर कर सकता हूं, प्रत्येक सेट के लिए एक। ध्यान रखें कि मैं

उत्तर

8

सबसे पहले, तुम वापस अपने आकलन को इंगित करने के टिप्पणी तालिका में दो कॉलम इस्तेमाल कर सकते हैं Assessment (व्यापार तर्क की आवश्यकता) के लिए एक संदर्भ के लिए Comment वर्ग को नहीं बदल सकते:

@OneToMany(fetch = FetchType.EAGER) 
@JoinColumn(name = "audit_commented_assessment_id") 
private Set<Comment> auditComments = new HashSet<Comment>(); 

@OneToMany(fetch = FetchType.EAGER) 
@JoinColumn(name = "commented_assessment_id") 
private Set<Comment> comments = new HashSet<Comment>(); 

आप दो तालिकाओं में शामिल होने चाहते हैं, सिर्फ इसलिए कहते हैं:

@OneToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "assessment_audit_comment", 
      joinColumns = @JoinColumn(name = "assessment_id"), 
      inverseJoinColumns = @JoinColumn(name = "comment_id")) 
private Set<Comment> auditComments = new HashSet<Comment>(); 

@OneToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "assessment_comment", 
      joinColumns = @JoinColumn(name = "assessment_id"), 
      inverseJoinColumns = @JoinColumn(name = "comment_id")) 
private Set<Comment> comments = new HashSet<Comment>(); 

निश्चित रूप से है कि the documentation में विस्तार से बताया।

+0

धन्यवाद यह इसे ठीक करता है। मेरे पास एक ही प्रकार का दो संग्रह नहीं था इसलिए मुझे कभी भी @ जॉइनटेबल एनोटेशन का उपयोग नहीं करना पड़ा। – phoenix7360

+0

टिप्पणी वर्ग कैसे दिखता है यदि आप एक द्विपक्षीय संबंध चाहते हैं? जैसे टिप्पणी POJO में मैं एक आकलन का संदर्भ लेना चाहता हूं? आप दो @ जियोटेबल (माता-पिता की प्रत्येक मैपिंग टेबल के विरुद्ध) का उपयोग नहीं कर सकते हैं? आपको इसे कैसे करना होगा? – nize

+2

@nize: यदि संघ द्विपक्षीय थे, तो आपको संगठनों के मालिक पक्ष को टिप्पणी करना होगा। टिप्पणी में, आपके पास एक फ़ील्ड 'टिप्पणी एसेसमेंट' और एक फ़ील्ड 'ऑडिट एस्सेसमेंट' होगा। उपरोक्त के रूप में शामिल तालिका के साथ उन्हें '@ ManyToOne' के साथ मैप किया जाएगा, लेकिन शामिल होने के साथ कॉलम और इनवर्क्स जॉइन कॉलम स्विच किए गए हैं। आकलन में, आपके पास बस '@OneToMany (mappedBy = "auditedAssessment") निजी सेट ऑडिट कॉमेंट्स;' और '@OneToMany (mappedBy = "commentedAssessment") टिप्पणियां सेट करें; –