java - tablas - ¿Tienes una clase base común para las entidades de Hibernate?
mapear tablas hibernate eclipse (5)
¿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?
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;
...
}
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 TaggedBaseEntity intermedio que implementa una interfaz Taggable , porque algunas de las entidades de nuestra aplicación web tienen etiquetas, como preguntas sobre .
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 el ID es la única propiedad común. Hasta ahora no encontré ningún problema.
El que uso es principalmente 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();
}
}
Puedes encontrar algunas muestras aquí
http://blogsprajeesh.blogspot.com/2010/01/nhibernate-defining-mappings-part-4.html
Funciona bien para mí también.
Tenga en cuenta que en esta entidad también puede agregar algunos detectores de eventos / interceptores como Hibernate Envers uno o uno personalizado según su necesidad para que pueda: - Realizar un seguimiento de todas las modificaciones - Conocer qué usuario realizó la última modificación - Actualizar automáticamente la última modificación - Establecer automáticamente la primera fecha de inserción Y cosas así ...