Pregunta

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

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;
    ...
}
¿Fue útil?

Solución

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

Otros consejos

El que uso principalmente es para implementar hashCode () y equals (). También agregué un método para imprimir bastante la entidad. En respuesta al DR anterior, la mayoría de esto puede ser anulado, pero en mi implementación, usted está atascado con un 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();
    }
}

No dudaría en usar 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 la identificación es la única propiedad común. Hasta ahora no he encontrado ningún problema.

También me funciona bien.

Tenga en cuenta que también puede agregar en esta entidad algunos detectores / interceptores de eventos como el de Hibernate Envers o cualquier otro personalizado según sus necesidades para que pueda: - Rastrear todas las modificaciones - Saber qué usuario realizó la última modificación. - Actualizar automáticamente la última modificación. - Establecer automáticamente la primera fecha de inserción. Y hay cosas así ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top