2008-11-29 11 views
12

मैं अपने हाइबरनेट मैपिंग को परिभाषित करने के लिए एनोटेशन का उपयोग करने पर विचार कर रहा हूं लेकिन एक समस्या में भाग गया हूं: मैं सामान्य फ़ील्ड (आईडी फ़ील्ड समेत) को परिभाषित करने के लिए बेस इकाई वर्ग का उपयोग करना चाहता हूं, लेकिन मैं अलग-अलग टेबल पीढ़ी की विभिन्न रणनीतियां बनाना चाहता हूं:हाइबरनेट/जेपीए एनोटेशन का उपयोग करके जनरेशन टाइप रणनीति को मैं ओवरराइड कैसे करूं?

@MappedSuperclass 
public abstract class Base implements Serializable { 
    @Id 
    @Column(name="ID", nullable = false) 
    private Integer id; 
    public Integer getId(){return id;} 
    public void setId(Integer id){this.id = id;} 
    ... 
} 

@Entity 
@Table(name="TABLE_A") 
public class TableA extends Base { 
    // Table_A wants to set an application-defined value for ID 
    ... 
} 

@Entity 
@Table(name="TABLE_B") 
public class TableB extends Base { 
    // How do I specify @GeneratedValue(strategy = AUTO) for ID here? 
    ... 
} 

क्या ऐसा करने का कोई तरीका है? मैं TableB में निम्नलिखित लेकिन दो बार मेरी होने उसी स्तंभ पर आपत्ति हाइबरनेट सहित कोशिश की है और यह गलत लगता है:

@Override // So that we can set Generated strategy 
@Id 
@GeneratedValue(strategy = AUTO) 
public Integer getId() { 
    return super.getId(); 
} 

उत्तर

4

उपरोक्त कोड में, ऐसा लगता है कि आप क्षेत्र (सुपर क्लास) और पर टिप्पणियों का मिश्रण कर रहे हैं विधियों (उपclass)। हाइबरनेट reference documentation इससे बचने की सिफारिश करता है, और मुझे संदेह है कि इससे समस्या हो सकती है। हाइबरनेट के साथ अपने अनुभव में, यह फ़ील्ड के बजाय गेटटर/सेटर विधियों को एनोटेट करने के लिए सुरक्षित और अधिक लचीला है, इसलिए यदि आप कर सकते हैं तो उस डिज़ाइन पर चिपकने का सुझाव देते हैं।

आपकी समस्या के समाधान के रूप में, मैं आपके बेस सुपरक्लास से आईडी फ़ील्ड को हटाने की सलाह देता हूं। इसके बजाय, उस क्षेत्र को उप-वर्गों में ले जाएं, और सार getId() और setId() अपनी बेस क्लास में विधियां बनाएं। फिर getId() और setId() अपने उप-वर्गों में विधियों को ओवरराइड/कार्यान्वित करें और वांछित पीढ़ी की रणनीति के साथ गेटर्स को एनोटेट करें।

उम्मीद है कि इससे मदद मिलती है।

3

बच्चे में विधि पर दूसरा @Id टैग न जोड़ें।

@Override // So that we can set Generated strategy 
@GeneratedValue(strategy = AUTO) 
public Integer getId() { 
    return super.getId(); 
} 
1

आप गेटर के बजाय क्षेत्र, जब आप उपवर्ग में विधि ओवरराइड पर अपनी टिप्पणियों को रखना हो, तो टिप्पणियों रखा वहाँ नहीं बल्कि सुपर क्लास में लोगों की तुलना में इस्तेमाल किया जाएगा।

2

मेरे संकल्प:

Refactor Base वर्ग में:

@MappedSuperclass 
abstract class SuperBase<K> { 
    public abstract K getId(); 
} 

@MappedSuperclass 
class Base<K> extends SuperBase<K> { 
    @Id @GeneratedValue(AUTO) 
    public K getId() { ... } 
} 

फिर, आप अपने इकाई वर्गों के अधिकांश के लिए बेस से फैली हुई है सकते हैं, और सिर्फ से विस्तार करता है, तो एक @GeneratedValue ओवरराइड करने के लिए, की जरूरत है SuperBase और इसे परिभाषित करें।

+1

यह करने का एक शानदार तरीका है, मेरे लिए काम किया! –

संबंधित मुद्दे

 संबंधित मुद्दे