Question

Avez-vous une classe de base commune pour les entités Hibernate, c'est-à-dire une classe MappedSuper avec un identifiant, une version et d'autres propriétés communes? Y at-il des inconvénients?

Exemple:

@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;
    ...
}
Était-ce utile?

La solution

Cela fonctionne bien pour nous. En plus de l'ID et de la date de création, nous avons également une date modifiée. Nous avons également une TaggedBaseEntity intermédiaire qui implémente une interface Taggable , car certaines entités de notre application Web ont des balises, comme des questions sur le dépassement de capacité.

Autres conseils

Celui que j’utilise est principalement pour implémenter hashCode () et equals (). J'ai également ajouté une méthode pour imprimer jolie l'entité. En réponse à DR ci-dessus, la plupart de ces modifications peuvent être annulées, mais dans mon implémentation, vous êtes bloqué avec un ID de type 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();
    }
}

Je n'hésiterais pas à utiliser une classe de base commune, après tout, c'est le point du mappage O / R.

J'utilise aussi des classes de base communes, mais uniquement si les entités partagent au moins certaines propriétés communes. Je ne l'utiliserai pas si l'ID est la seule propriété commune. Jusqu'à présent, je n'ai rencontré aucun problème.

Cela fonctionne bien pour moi aussi.

Notez que vous pouvez également ajouter, dans cette entité, des écouteurs / intercepteurs d'événements tels que Hibernate Envers ou tout autre personnalisé en fonction de vos besoins, afin que vous puissiez: - Suivre toutes les modifications - Savoir quel utilisateur a fait la dernière modification - Mettre à jour automatiquement la dernière modification - Définir automatiquement la première date d'insertion Et des trucs comme ça ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top