2008-10-01 13 views
20

क्या आपके पास हाइबरनेट इकाइयों के लिए एक सामान्य बेस क्लास है, यानी आईडी, संस्करण और अन्य सामान्य गुणों के साथ मैप किए गए सुपरपरक्लास? क्या कोई कमी है?क्या आपके पास हाइबरनेट इकाइयों के लिए एक सामान्य आधार वर्ग है?

उदाहरण:

@MappedSuperclass() 
public class BaseEntity { 

    private Long id; 
    private Long version; 
    ... 

    @Id @GeneratedValue(strategy = GenerationType.AUTO) 
    public Long getId() {return id;} 

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

    @Version 
    public Long getVersion() {return version;} 
    ... 

    // Common properties 
    @Temporal(TemporalType.TIMESTAMP) 
    public Date creationDate() {return creationDate;} 
    ... 
} 

@Entity 
public class Customer extends BaseEntity { 
    private String customerName; 
    ... 
} 

उत्तर

4

यह हमारे लिए ठीक काम करता है। साथ ही आईडी और निर्माण तिथि, हमारे पास एक संशोधित तिथि भी है। हमारे पास इंटरमीडिएट टैग की गईंबेसएन्टिटी है जो टैगगेल इंटरफ़ेस लागू करता है, क्योंकि हमारे कुछ वेब एप्लिकेशन की इकाइयों में टैग हैं, जैसे स्टैक ओवरफ़्लो पर प्रश्न।

1

ओ/आर मैपिंग के बिंदु के बाद, मैं एक सामान्य बेस क्लास का उपयोग करने में संकोच नहीं करूंगा।

मैं सामान्य आधार वर्गों का भी उपयोग करता हूं, लेकिन केवल अगर संस्थाएं कम से कम कुछ सामान्य गुण साझा करती हैं। यदि आईडी एकमात्र आम संपत्ति है, तो मैं इसका उपयोग नहीं करूंगा। अब तक मुझे कोई समस्या नहीं आई है।

5

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

public abstract class BaseEntity implements Serializable { 

    public abstract Long getId(); 
    public abstract void setId(Long id); 

    /** 
    * @see java.lang.Object#hashCode() 
    */ 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); 
     return result; 
    } 

    /** 
    * @see java.lang.Object#equals(Object) 
    */ 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     BaseEntity other = (BaseEntity) obj; 
     if (getId() == null) { 
      if (other.getId() != null) 
       return false; 
     } else if (!getId().equals(other.getId())) 
      return false; 
     return true; 
    } 

    /** 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() { 
     return new StringBuilder(getClass().getSimpleName()).append(":").append(getId()).toString(); 
    } 

    /** 
    * Prints complete information by calling all public getters on the entity. 
    */ 
    public String print() { 

     final String EQUALS = "="; 
     final String DELIMITER = ", "; 
     final String ENTITY_FORMAT = "(id={0})"; 

     StringBuffer sb = new StringBuffer("{"); 

     PropertyDescriptor[] properties = PropertyUtils.getPropertyDescriptors(this); 
     PropertyDescriptor property = null; 
     int i = 0; 
     while (i < properties.length) { 

      property = properties[i]; 
      sb.append(property.getName()); 
      sb.append(EQUALS); 

      try { 
       Object value = PropertyUtils.getProperty(this, property.getName()); 
       if (value instanceof BaseEntity) { 
        BaseEntity entityValue = (BaseEntity) value; 
        String objectValueString = MessageFormat.format(ENTITY_FORMAT, entityValue.getId()); 
        sb.append(objectValueString); 
       } else { 
        sb.append(value); 
       } 
      } catch (IllegalAccessException e) { 
       // do nothing 
      } catch (InvocationTargetException e) { 
       // do nothing 
      } catch (NoSuchMethodException e) { 
       // do nothing 
      } 

      i++; 
      if (i < properties.length) { 
       sb.append(DELIMITER); 
      } 
     } 

     sb.append("}"); 

     return sb.toString(); 
    } 
} 
+0

मुझे माफ करना, लेकिन क्यों आप थोड़ी देर के पाश का उपयोग कर रहे हैं जो पाश के लिए एक में और अधिक फिट करने के लिए लगता है के लिए? –

+0

हां, मैं कुछ ऐसा कर सकता था: (i = 0; i

+0

यह प्रश्न कुछ समय से हुआ है, लेकिन फिर भी, उपरोक्त बराबर() विधि में एक बग है, जो प्रॉक्सी के साथ समस्याएं पैदा कर सकता है: getClass()! = Obj.getClass() के बजाय या तो उपयोग करने योग्य है() या! (obj exampleof BaseEntity) – javashlook

0

पा सकते हैं यह भी मेरे लिए अच्छी तरह से काम करता है।

सूचना है कि आप भी इस इकाई में कुछ घटना श्रोताओं जोड़ सकते हैं/हाइबरनेट Envers एक या किसी भी कस्टम एक अपनी जरूरत तो आप कर सकते हैं कि के अनुसार की तरह इंटरसेप्टर: - ट्रैक सभी संशोधन - नो जो उपयोगकर्ता अंतिम संशोधन किए गए - स्वचालित रूप से अपडेट अंतिम संशोधन - स्वचालित रूप से सेट पहली प्रविष्टि की तारीख और इस तरह वहाँ सामान ...