2008-10-01 6 views
20

¿Tiene una clase base común para las entidades Hibernate, es decir, una MappedSuperclass con id, versión y otras propiedades comunes? ¿Hay algún inconveniente?¿Tiene una clase base común para las entidades Hibernate?

Ejemplo:

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

Respuesta

4

Esto funciona bien para nosotros. Además del ID y la fecha de creación, también tenemos una fecha modificada. También tenemos un intermedio TaggedBaseEntity que implementa una interfaz etiquetable, porque algunas de las entidades de nuestra aplicación web tienen etiquetas, como preguntas sobre el desbordamiento de la pila.

1

No dudaría en utilizar una clase base común, después de todo ese es el punto de la asignación O/R.

También uso clases base comunes, pero solo si las entidades comparten al menos algunas propiedades comunes. No lo usaré, si el ID es la única propiedad común. Hasta ahora no encontré ningún problema.

5

El que uso es principalmente para implementar hashCode() y equals(). También agregué un método para imprimir bastante la entidad. En respuesta a DR anterior, la mayor parte de esto se puede anular, pero en mi implementación se bloquea una ID de tipo Long.

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

Perdone, pero ¿por qué utiliza un bucle while para lo que parece encajar más en un bucle? –

+0

Sí, yo podría haber hecho algo como: for (i = 0; i

+0

Ha pasado un tiempo desde esta pregunta, pero, no obstante, hay un error en el método equals() anterior, que puede crear problemas con los proxies: en lugar de getClass()! = Obj.getClass() use isAssignableFrom() o! (obj instanceof BaseEntity) – javashlook

0

Funciona bien para mí también.

Tenga en cuenta que también se puede en esta entidad añadir algunos detectores de eventos/interceptores como el Hibernate Envers una o ninguna costumbre uno según su necesidad, para que pueda: - Track todas las modificaciones - Saber qué usuario realizó la última modificación - actualización automática de la última modificación - Establecer automáticamente la primera fecha de inserción Y allí cosas por el estilo ...

Cuestiones relacionadas