Lineamientos Capa de Persistencia

Una entidad es un objeto de dominio de persistencia ligero. Normalmente la entidad representa una tabla en una base de datos relacional, y cada instancia de la entidad corresponde a una fila de esa tabla. El artefacto de programación principal de una entidad es la Entity Class, aunque las entidades pueden utilizar las clases de ayuda.

Una entidad debe seguir los siguientes requerimientos:

  • La clase debe tener la anotación javax.persistence.Entity
  • La clase debe tener un constructor sin argumentos public o protected. La clase puede tener otros constructores
  • La clase no debe ser declarada como final. Ningún método o variable de instancia persistente puede ser declarada como final.
  • Si una instancia de una entidad es pasada por valor como una instancia desprendida del Contexto de Persistencia, a través de la interface remota de negocio de un session bean, la clase debe implementar la interface Serializable
  • Las entidades pueden extender de entidades y clases que no son entidades. Las clases que no son entidades pueden extender de entidades.
  • Las variables de instancia persistentes pueden ser declaradas private, protected, package-private y pueden ser solo accedidas directamente por medio de los métodos de la entidad
  • Las anotaciones que van dentro de las entidades deben estar a nivel de método y no a nivel de campo (método get del campo).
  • Si se requiere que la entidad contenga campos NO persistentes en la base de datos se debe anotar su respectivo método get con @Transient
  • Los campos o propiedades deben ser de los siguientes tipos: Tipos primitivos, java.lang.String, Wrappers de tipos primitivos, tipos serializables definidos por el usuario, byte[], Byte[], Character[], char[], enumeraciones, otras entidades, colecciones de entidades, y clases embebidas
  • El nombre de una entidad no debe sobrepasar los 30 caracteres. El nombre de una entidad es mapeado en la Base de datos de acuerdo al nombre dado a la clase o de acuerdo al nombre dado por medio de la Anotación @Table(name =”nombreEntidad”). Cuando tiene la anterior anotación toma el “nombreEntidad” y crea la tabla en la base de datos, sino toma el nombre de la clase.

Esta recomendación también se debe tener en cuenta en las relaciones @ManyToMany, ya que en estos casos se crea una entidad para mantener la relación. El nombre de esta entidad se genera de la siguiente forma
<nombre de la entidad origen>_< nombre de la entidad destino>
De esta forma, aunque la longitud de los nombres de las entidades origen y destino sean menores a 30 caracteres, el nombre de la entidad de la relación puede ser mayor a 30 caracteres.
Para estos casos se debe usar la anotación @JoinTable indicando el nombre de la entidad de la relación en el atributo name. Ejemplo:

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
@JoinTable(name="RequisitosSustancias",
      joinColumns={@JoinColumn(name="RequisitosSustanciasCE_ID", referencedColumnName="ID")},
      inverseJoinColumns={@JoinColumn(name="TipoDocumento_ID", referencedColumnName="ID")})
public Set<TipoDocumento> getTipoDocumentos() {
     return tipoDocumentos;
}
  • Utilizar la anotación @NamedQuery (anotación a nivel de clase) en las entidades para declarar las consultas que más se utilizan dentro de un aplicativo con respecto a una entidad.
  • No utilizar las anotaciones de Hibernate para especificar las restricciones de campo. Utilizar las anotaciones de JPA. Ejemplo: Para la restricción de nulidad de un campo existe en la API de Hibernate la anotación @NotNull. Para reemplazar la anterior anotación se va utilizar la anotación @Column(nullable = false) para especificar dicha restricción.
  • Utilizar la anotacion @Enumerated(value = EnumType.STRING) cuando el atributo de la entidad sea de tipo Enum. Colocar la anotacion en el metodo get del atributo
  • Utilizar la anotacion @Temporal(value = temporalType.DATE) cuando el atributo de la entidad sea de tipo Date. En caso de que el atributo sea una hora utilizar la misma anotacion pero utilizar el valor de atributo temporalType.TIME. Colocar la anotacion en el metodo get del atributo
  • Se debe sobrescribir los métodos hashCode(), equals(object obj) y clone() e implementar el método deepClone() (clonacion profunda de la entidad). La clonación en JPA permite convertir una entidad manejada en no manejada
  • La ubicación de las Entidades debe ser sobre el directorio src/main del proyecto en un paquete con la siguiente nomenclatura.

{com-edu-org}.{enterprise}.{name_project}.{module-component}.model

Ejemplo: com.heinsohn.core5.batchprocessing.model

  • Uso de @Pattern(message = “#{messages[‘mensaje01’]}”, regex = com.heinsohn.Constantes.PATRON)
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License