2011-09-19 14 views
7

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

@Entity 
@Table(name = "TB_Reports") 
public class Report 
{ 
    Long id; 
    String name; 
    String value; 

    @Id 
    @GeneratedValue 
    @Column(name = "cReportID") 
    public Long getId() 
    { 
     return this.id; 
    } 

    public void setId(Long id) 
    { 
     this.id = id; 
    } 

    @Column(name = "cCompanyName") 
    public String getname() 
    { 
     return this.name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    @Column(name = "cCompanyValue") 
    public String getValue() 
    { 
     return this.name; 
    } 

    public void setValue(String value) 
    { 
     this.value = value; 
    } 
} 

रिपोर्टपार्सर केवल फ़ील्ड भरने के लिए उपयोग किया जाता है। एक रिपोर्ट करने के लिए इसे डाल सकते हैं और इसे सहेजने के लिए

public class ReportParser extends report 
{ 
    public void setName(String htmlstring) 
    { 
     ... 
    } 

    public void setValue(String htmlstring) 
    { 
     ... 
    } 
} 

प्रयास

... 
ReportParser rp = new ReportParser(); 
rp.setName(unparsed_string); 
rp.setValue(unparsed_string); 
Report r = (Report)rp; 
this.dao.saveReport(r); 

इससे पहले कि मैं एक ORM में ले जाया गया मैं इस पद्धति का उपयोग किया है, लेकिन मैं कैसे हाइबरनेट के साथ ऐसा करने को समझ नहीं सकता । क्या यह संभव है?

उत्तर

3

क्या यह इकाई को उपclass करना बिल्कुल जरूरी है? आप बिल्डर पैटर्न का उपयोग कर सकते हैं:

public class ReportBuilder { 
    private Report report; 
    public ReportBuilder() { 
     this.report = new Report(); 
    } 
    public ReportBuilder setName(String unparsedString) { 
     // do the parsing 
     report.setName(parsedString); 
     return this; 
    } 
    public ReportBuilder setValue(String unparsedString) { 
     // do the parsing 
     report.setValue(parsedString); 
     return this; 
    } 
    public Report build() { 
     return report; 
    } 
} 

Report report = new ReportBuilder() 
        .setName(unparsedString) 
        .setValue(unparsedString) 
        .build(); 
dao.saveReport(report); 
+0

यह इकाई को उपclassing से बेहतर दृष्टिकोण की तरह लगता है। धन्यवाद! – vopilif

0

आपको इकाई वर्गों का विस्तार नहीं करना चाहिए, जब तक कि अधिक विशिष्ट इकाई वर्ग नहीं बनाते। इकाई से संबंधित एनोटेशन उप-वर्ग में बनाए रखा जाता है, इस प्रकार हाइबरनेट उलझन में पड़ जाता है।

इकाई वर्गों में व्यावसायिक तर्क डालना भी अत्यधिक बहस योग्य है — आपको यह पता होना चाहिए कि जेबए कार्यान्वयनकर्ता, जैसे हाइबरनेट, उत्पन्न हो सकते हैं (और आमतौर पर) उत्पन्न प्रॉक्सी के माध्यम से अपने गेटर्स/सेटर्स चला सकते हैं। अंदर जटिल तर्क के साथ आप उन समस्याओं में आ सकते हैं जो पता लगाना मुश्किल है।

+0

हाइबरनेट आपके कोड को किसी भी जेनरेट प्रॉक्सी के माध्यम से तब तक नहीं चलाता जब तक आप इसे नहीं बताते। इससे बचा जाना चाहिए व्यापार तर्क नहीं है, यह व्यवसाय तर्क है जो उचित रूप से संरचित अनुप्रयोग में कहीं और है। – Jay