2008-10-01 6 views
20

Haben Sie eine gemeinsame Basisklasse für Hibernate-Entitäten, d. H. Eine MappedSuperclass mit ID, Version und anderen allgemeinen Eigenschaften? Gibt es irgendwelche Nachteile?Haben Sie eine gemeinsame Basisklasse für Hibernate-Entitäten?

Beispiel:

@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; 
    ... 
} 

Antwort

4

Dies funktioniert für uns in Ordnung. Neben der ID und dem Erstellungsdatum haben wir auch ein Änderungsdatum. Wir haben auch ein Zwischenprodukt TaggedBaseEntity, das eine Taggable Schnittstelle implementiert, weil einige Entitäten unserer Webanwendung Tags haben, wie Fragen zu Stack Overflow.

1

Ich würde nicht zögern, eine gemeinsame Basisklasse zu verwenden, nach all dem ist der Punkt der O/R-Zuordnung.

Ich verwende auch gemeinsame Basisklassen, aber nur wenn die Entitäten mindestens einige gemeinsame Eigenschaften teilen. Ich werde es nicht verwenden, wenn die ID die einzige gemeinsame Eigenschaft ist. Bis jetzt hatte ich keine Probleme.

5

Die eine, die ich verwende, ist in erster Linie zu implementieren HashCode() und equals(). Ich fügte auch eine Methode hinzu, um die Entität hübsch auszudrucken. Als Antwort auf DR oben kann das meiste davon überschrieben werden, aber in meiner Implementierung stecken Sie mit einer ID des Typs Long fest.

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

Entschuldigen Sie mich, aber warum verwenden Sie eine while-Schleife für das, was für die Schleife in einem passen mehr zu sein scheint? –

+0

Ja, ich hätte etwas tun können wie: für (i = 0; i

+0

Es ist eine Weile her, seit diese Frage, aber dennoch gibt es einen Fehler in der oben genannten equals() -Methode, die Probleme mit Proxies verursachen kann: anstelle von getClass()! = Obj.getClass() benutze entweder isAssignableFrom() oder! obj instanceof BaseEntity) – javashlook

0

Es funktioniert auch gut für mich.

Beachten Sie, dass auch in dieser Entität einige Event-Listener hinzufügen/Abfangjäger wie Hibernate Envers eine oder jede kundenspezifische ein nach Ihrem Bedarf, so dass Sie: - Verfolgen Sie alle Änderungen - wissen, welche Benutzer die letzte Änderung gemacht - Update automatisch die letzte Änderung - Set automatisch das erste Einführungsdatum Und ther Sachen ...

Verwandte Themen