Pergunta

Você tem uma classe base comum para entidades Hibernate, ou seja, um MappedSuperClass com id, versão e outras propriedades comuns? Há alguma desvantagem?

Exemplo:

@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;
    ...
}
Foi útil?

Solução

Esta multa trabalha para nós. Bem como a data ID e criação, nós também temos uma data modificada. Temos também um intermediário TaggedBaseEntity que implementa um taggable interface, porque algumas das entidades do nosso aplicativo web tem tags, como perguntas sobre estouro de pilha.

Outras dicas

O que eu uso é principalmente para implementar hashCode () e equals (). Eu também adicionei um método para imprimir muito a entidade. Em resposta a DR acima, a maior parte deste pode ser substituído, mas na minha aplicação você está preso com um ID do 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();
    }
}

Eu não hesitaria em usar uma classe base comum, afinal esse é o ponto de O mapeamento / R.

Eu uso classes de base comuns, também, mas só se as entidades partilham pelo menos algumas propriedades comuns. Eu não vou usá-lo, se o ID é propriedade única comum. Até agora eu não encontrar quaisquer problemas.

Ele funciona bem para mim também.

Observe que você pode também nesta entidade adicionar alguns ouvintes de eventos / interceptores como o Hibernate Envers um ou qualquer um costume de acordo com sua necessidade para que você pode: - Acompanhe todas as modificações - Sabe qual o usuário fez a última modificação - Atualização automaticamente a última modificação - Definir automaticamente a primeira data de inserção E ther coisas assim ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top