2010-05-09 5 views
11

मैं एनोटेटेड हाइबरनेट का उपयोग कर रहा हूं, और मैं सोच रहा हूं कि निम्नलिखित संभव है या नहीं।इंजनों पर इंटरफेस का उपयोग कर जावा/हाइबरनेट

मुझे उन ऑब्जेक्ट्स का प्रतिनिधित्व करने वाले इंटरफ़ेस की श्रृंखला स्थापित करना है जिन्हें जारी रखा जा सकता है, और मुख्य डेटाबेस वर्ग के लिए एक इंटरफ़ेस जिसमें इन ऑब्जेक्ट्स (डेटाबेस के लिए एक एपीआई) जारी रखने के लिए कई ऑपरेशन शामिल हैं।

नीचे, मुझे इन इंटरफेस को लागू करना है, और उन्हें हाइबरनेट के साथ जारी रखना है।

तो मैं उदाहरण के लिए, होगा:

public interface Data { 
    public String getSomeString(); 
    public void setSomeString(String someString); 
} 

@Entity 
public class HbnData implements Data, Serializable { 
    @Column(name = "some_string") 
    private String someString; 

    public String getSomeString() { 
    return this.someString; 
    } 
    public void setSomeString(String someString) { 
    this.someString = someString; 
    } 
} 

अब, यह ठीक, एक तरह से काम करता है। परेशानी तब आती है जब मैं घोंसला वाली संस्थाएं चाहता हूं। जो मैं चाहता था के इंटरफेस आसान पर्याप्त है:

public interface HasData { 
    public Data getSomeData(); 
    public void setSomeData(Data someData); 
} 

लेकिन जब मैं वर्ग को लागू, मैं इंटरफ़ेस हुए कहा कि यह वर्ग नहीं जानता है हाइबरनेट से एक त्रुटि पालन कर सकते हैं, जैसा कि नीचे, और मिल "डेटा"।

@Entity 
public class HbnHasData implements HasData, Serializable { 
    @OneToOne(cascade = CascadeType.ALL) 
    private Data someData; 

    public Data getSomeData() { 
    return this.someData; 
    } 

    public void setSomeData(Data someData) { 
    this.someData = someData; 
    } 
} 

सरल परिवर्तन "डेटा" से "HbnData" से प्रकार बदलने के लिए होगा, लेकिन है कि स्पष्ट रूप से इंटरफेस कार्यान्वयन टूट जाएगा, और इस तरह अमूर्त असंभव बना।

क्या कोई मुझे यह समझाने के लिए समझा सकता है कि यह हाइबरनेट के साथ कैसे काम करेगा?

+2

और संस्थाओं के लिए इंटरफेस का उपयोग करने के बिंदु क्या है? एक इंटरफ़ेस में किस राज्य को बनाए रखा जाना चाहिए? इंटरफेस व्यवहार के बारे में हैं, राज्य नहीं, और मुझे नहीं लगता कि आप एक इंटरफेस क्यों जारी रखना चाहते हैं। –

+2

मुझे यह एहसास है ... इरादा दृढ़ता ढांचे पर एक अमूर्तता बनाना था, जिससे विभिन्न (या नहीं) ढांचे का उपयोग करके इसे कई बार कार्यान्वित करना संभव हो गया। प्रश्न में आवेदन को मेरे नियंत्रण से परे एक तरह से मॉड्यूलर स्थापित किया गया है, और मुझे यह निर्दिष्ट करने का एक तरीका चाहिए कि डेटाबेस को कौन से संदेश जवाब देने में सक्षम होना चाहिए, और वस्तुओं के गुणों में कौन सा गुण है ... और इसलिए: इंटरफेस। विचार यह है कि कोई इंटरफेस को कार्यान्वित कर सकता है, और मॉड्यूल स्विच कर सकता है। हालांकि, इंटरफेस को लागू करने से हाइबरनेट के साथ कुछ परेशानी होती है ... और इसलिए मेरा प्रश्न। – wen

उत्तर

15

शायद OneToOne.targetEntity ?:

@OneToOne(targetEntity = HbnData.class, cascade = CascadeType.ALL) 
private Data someData; 
+0

धन्यवाद, वास्तव में वह था जो मैं खोज रहा था। ^^ – wen

+0

वही यहाँ! आप मेरे हीरो हैं! – nterry

+0

मुझे नहीं लगता कि यह समस्या को कैसे हल करता है, यह अभी भी एक प्रकार तक सीमित है। HbnData द्वारा डेटा को बदलें वही नहीं है? – MilacH

3

इंटरफ़ेस जो मैं आमतौर पर उपयोग करता हूं वह डेटा एक्सेस ऑब्जेक्ट या डीएओ है। जावा जेनरिक का उपयोग करके, मैं इसे सिर्फ एक बार लिख सकता हूं; हाइबरनेट यह संभव कार्यान्वयन सिर्फ एक बार भी लिखने के लिए बनाता है:

package persistence; 

import java.io.Serializable; 
import java.util.List; 

public interface GenericDao<T, K extends Serializable> 
{ 
    T find(K id); 
    List<T> find(); 
    List<T> find(T example); 
    List<T> find(String queryName, String [] paramNames, Object [] bindValues); 

    K save(T instance); 
    void update(T instance); 
    void delete(T instance); 
} 
संबंधित मुद्दे