2010-06-30 10 views
6

मेरे पास BaseEntity कक्षा है जो मेरे आवेदन में सभी जेपीए इकाइयों का एक सुपरक्लास है।जेपीए की बेसएन्टिटी में बराबर() और हैशकोड() विधियों को कैसे कार्यान्वित करें?

@MappedSuperclass 
public abstract class BaseEntity implements Serializable { 

    private static final long serialVersionUID = -3307436748176180347L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID", nullable=false, updatable=false) 
    protected long id; 


    @Version 
    @Column(name="VERSION", nullable=false, updatable=false, unique=false) 
    protected long version; 
} 

हर जेपीए इकाई BaseEntity तक फैली हुई है और BaseEntity की id और version विशेषताओं के वारिस।

BaseEntity में equals() और hashCode() विधियों को लागू करने का सबसे अच्छा तरीका क्या है? BaseEntity का प्रत्येक उप-वर्ग equals() और hashCode() व्यवहार फ़ॉर्म BaseEntity का उत्तराधिकारी होगा।

मैं इस तरह कुछ करना चाहता हूँ:

public boolean equals(Object other){ 
     if (other instanceof this.getClass()){ //this.getClass() gives class object but instanceof operator expect ClassType; so it does not work 
      return this.id == ((BaseEntity)other).id; 
     } else { 
      return false; 
     } 
    } 

लेकिन instanceof ऑपरेटर classtype है और वर्ग वस्तु की जरूरत है; वह यह है कि:

  • if(other instanceof BaseEntity)

    इस काम करेंगे के रूप में BaseEntity classType यहाँ

  • if(other instanceof this.getClass)

    इस काम नहीं करेगा, क्योंकि this वस्तु की this.getClass() रिटर्न वर्ग वस्तु

+1

बस एक नोट के रूप में, जेपीए कल्पना संस्थाओं की आवश्यकता नहीं है hashCode/के बराबर होती है और एक जेपीए कार्यान्वयन के रूप में DataNucleus के उपयोग के उस रूप का कुछ भी आवश्यकता नहीं है के लिए विशेष रूप से निपटने प्रदान करने के लिए कर सकते हैं। जाहिर है कुछ अन्य (उदाहरण के लिए हाइबरनेट?) आप पर लगा सकते हैं कि – DataNucleus

+0

@ डेटाटाइक्लियस क्या आप कृपया एक संदर्भ दिखा सकते हैं कि हाइबरनेट आपके बराबर कुछ भी लगाता है 'बराबर()/हैशकोड() '(संकेत: हाइबरनेट स्वयं ** नहीं करता है ** किसी इकाई ऑब्जेक्ट पर 'बराबर() 'और' हैशकोड() 'कॉल करें)। –

उत्तर

2

आप

if (this.getClass().isInstance(other)) { 
    // code 
} 
+0

हां यह expeted के रूप में काम किया। –

+0

http://stackoverflow.com/questions/1928191/what-is-the-correct-way-of-overriding-hashcode-and-equals-methods-of-persis –

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