Está en la página 1de 6

16/4/2015

BuenasPrcticasJPAyTaylorHeinsohnBusinessTechnology

CreateaccountorSignin

Inicio
Talleres

Searchthissite

Search

BuenasPrcticasJPAyTaylor

Instaladores
Artculos

Fold
TableofContents
UsodeTaylor
Manejodelmodelodeentidades
Enumeraciones
UsodeNamedQuery
Herencia
Concurrencia
Recomendaciones
Optimizacin

UsodeTaylor
Esta seccin busca dar algunos lineamientos o recomendaciones en el uso de
Taylor.
Core5 propone usar la herramienta Taylor para modelar las entidades y sus
relaciones. Taylor permite modelar las entidades y agregarles los estereotipos o
anotaciones de JPA y Hibernate, para luego generar el cdigo de estas entidades.
Por esta razn se considera que Taylor es una herramienta util para agilizar el
desarrollodelasaplicaciones.
Eldocumento[TAYLOR]explicaelusodeestaherramienta.
A continuacin se exponen una serie de recomendaciones o buenas prcticas que
sedebenaplicarenlosproyectos.

Manejodelmodelodeentidades
Debido a que Taylor no permite el trabajo colaborativo, es decir que varias
personaspuedanmodificaralmismotiempoelmodelodeentidades,serecomienda
queunasolapersonasealaencargadaderealizarmodificacionesenelmodelode
entidades.
Es buena prctica mantener el modelo de entidades actualizado, de tal forma que
encualquiermomentosepuedanvolveragenerarlasentidadesparaunproyecto.
Para esto es necesario que el cdigo Java de las entidades no sea modificado
directamente,sinoquecualquiermodificacinalasentidadessehagaatravsdel
modelodeentidades.
ElmodelodeentidadesenTaylordebetenerdefinidalaestructuradepaquetes.La
http://heinsohn.wikidot.com/articulos:lineamientosjpa

1/6

16/4/2015

BuenasPrcticasJPAyTaylorHeinsohnBusinessTechnology

estructura de paquetes propuesta por Core5 consiste en realizar agrupaciones de


entidades por mdulos de la aplicacin. As el paquete para las entidades es
com.heinsohn.{proyecto}.{modulo}. Por ejemplo para el proyecto demo, las
entidades del modulo de seguridad quedan en el directorio src/main y el paquete
com.heinsohn.demo.security.

Enumeraciones
En el modelo de entidades se deben usar enumeraciones siempre que se tengan
camposenlasentidadesdondeelvalordeestosestentreunconjuntodevalores
que no requieren ser parametrizables, es decir que son valores fijos y no van a
cambiar en el tiempo. Como por ejemplo un campo estado con posibles valores:
iniciado,aprobado,rechazado.
Las enumeraciones pueden crearse en la misma entidad donde se usan o pueden
crearse de forma separada. La recomendacin en este caso es que cuando la
enumeracinseusasloenunaentidadsedebecrearenlamismaentidad,perosi
laenumeracinsevaautilizarenvariasentidadessedebecreardeformaseparada.
Cuando un atributo de una entidad corresponde a una enumeracin es buena
practica usar la anotacin @Enumerated(value = EnumType.STRING) para que en
la base de datos no quede guardado el cdigo del literal de la enumeracin, sino
quequedeguardadoelnombredelliteraldelaenumeracin.

UsodeNamedQuery
Un namedQuery es una consulta que esta previamente definida y que puede ser
usadaatravsdeunnombre.
SiemprequesepuedasedebenusarnamedQueriespararealizarconsultasalabase
dedatos.SeconsideramalapracticaescribirlasconsultasdirectamenteenlosEJBs.
UnNamedQuerydebedefinirseenlaentidadalacualhacereferencialaconsulta.
Los nombres de los namedQueries deben tener un estndar definido. El estndar
propuestoes:
{nombreEntidad}.{nombreConsulta}
Sedebeusarelnombredelaentidadcomoprefijodelnombredelaconsultapara
evitarconflictodenombresdeconsultaendiferentesentidades.
Elnombredelaconsultadebeindicarloqueretornaylosparmetrosquerecibe,
de tal forma que sea fcil saber que hace una consulta slo con su nombre, por
ejemplo:
Usuario.usuariosPorPais: Retorna los usuarios que pertenecen a un pais
especifico.Entidad:Usuario.Parametros:pais
Persona.personasPorSexoYEdad:Retornalaspersonasquetienenunsexoy
edadespecificas.Entidad:Persona.Parametros:sexoyedad
La definicin de namedQueries se debe hacer en el modelo de Taylor. Definiendo
los namedQueries desde los diagramas de Taylor, se asegura que ante cualquier
modificacin que sufran las entidades, por nuevos atributos, validaciones,
relaciones, etc., la generacin del cdigo mantendr las consultas que se estn
utilizandoenlosEJBsoclasesutilitariasdelproyecto.

Herencia
Estrategiasparamanejarherenciaenlasentidades
http://heinsohn.wikidot.com/articulos:lineamientosjpa

2/6

16/4/2015

BuenasPrcticasJPAyTaylorHeinsohnBusinessTechnology

Estrategia

Descripcin

Ventajas

Desventajas

SINGLE_TABLE

Creaunasola
tablaenla
BDpara
almacenar
losregistros
detodala
jerarqua

Norequiere
joinspara
hacer
consultas

Tablanonormalizada,
desperdiciodeespacio
porcolumnasquevana
estarnulas,tablascon
muchascolumnas
(atributosdetodaslas
clasesdelajerarqua)

JOINED

Creauna
tablapor
cadaentidad
dela
jerarqua

Tablas
normalizadas,
nohay
desperdicio
deespacio

Lasconsultascausan
joins,consultaslentas
cuandohayjerarquas
profundas

TABLE_PER_CLASS

Creauna
tablapor
cadaclase
hojadela
jerarqua

Consultas
sobrela
misma
entidadno
causanjoins

Tablasnonormalizadas,
desperdiciodeespacio,
consultaspolimorficas
causanqueriescon
UNION

Concurrencia
Estrategiasparamanejarconcurrenciaenelaccesoadatos
Estrategia

Ventajas

Desventajas

Recomendacin

Optimista

nose
mantienen
locksen
labasede
datos

requiereunatributoversionen
laentidad,elusuarioola
aplicacindebenrefrescaro
intentardenuevolas
actualizacionesdedatos
fallidas

Usarenentidades
quetienenpoca
probabilidadde
modificacin
concurrente

Pesimista

Nohay
quehacer
algo
especial
enla
aplicacin

crealocksenlabasededatos
(SELECTFORUPDATE),afecta
laescalabilidad,puedecausar
deadlocks

Usarcuandohay
altaprobabilidad
demodificacin
concurrentepara
unamisma
entidad

Recomendaciones
UsarnamedQueriesparaevitarelusodeconsultasJPQLescritasenlosEJBs.
Lasconsultasdebenhacerreferenciaalosobjetos,ynoalosidentificadores
delasentidades:Enloscasosqueserequieracompararconalgnatributo
de la entidad que no sea de tipo simple (como numricos, cadenas, etc.)
sino que sea una referencia a otra entidad, debe procurarse el uso de las
comparaciones a nivel de entidades, pues Hibernate se encarga de resolver
el JOIN entre tablas buscando los atributos que se anotan con @Id. A
continuacin se muestran dos casos para ilustrar la recomendacin, donde
elTipodeDocumentoesunareferenciaaunaentidad.
No recomendado: select p from persona p where
p.tipoDocumento.id
=
:idTipoDocumento
and
p.numeroDocumento=:numeroDocumento
Recomendado:selectpfrompersonapwherep.tipoDocumento
http://heinsohn.wikidot.com/articulos:lineamientosjpa

3/6

16/4/2015

BuenasPrcticasJPAyTaylorHeinsohnBusinessTechnology

=
:tipoDocumento
:numeroDocumento

and

p.numeroDocumento

ConsultasquehacenreferenciaaatributosdetipoEnumeracin:Cuandose
requiera hacer una consulta con una referencia explcita al valor de una
enumeracin, debe utilizarse el nombre completo de la enumeracin
(incluyendo el paquete) y el valor al que se desea hacer referencia. A
continuacinsemuestraunejemplodeunaconsultaquehacereferenciaal
valorconcretodeunaenumeracin.Nteseennegrillaelnombrecompleto
delaenumeracinyelvalor.
select t from TipoComision t where t.estado =
com.heinsohn.factoring.common.EnumEstadoEntidad.HABILITADO

Sisenecesitanconstruirconsultasdinamicassedebeusarparametrosenla
consultaynoconcatenarlosvaloresenelstringdelaconsulta,paraevitar
SQLinjection.Porejemplo:
Norecomendado:
em.createQuery("select
p
from
persona
p
where
p.tipoDocumento.id = " + tipoDocId + " and
p.numeroDocumento="+numDoc)
Recomendado:
em.createQuery("select
p
from
persona
p
where
p.tipoDocumento.id = :param1 and p.numeroDocumento =
:param2")
.setParameter("param1", tipoDocId ).setParameter("param2",
numDoc)

Evitarelusodequeriespararealizaractualizacionesdedatos.Siseusapara
haceractualizacionesmasivastenerencuentaqueloscambiosnoquedarn
enelcontextodepersistenciaqueseestusandoyquesepierdeelmanejo
deconcurrenciaqueproveeJPA.Porejemplo:
//consultaunempleado
Empleadoempleado=em.find(id,Empleado.class)

//incrementaaldobleelsalariodetodoslosempleados
em.createQuery("updateempleadosetsalario=salario*2").executeUpdate()
if(empleado.getSalario()<10){
empleado.setSalario(15)
}

Suponiendoqueelanteriorcdigoseejecutaenunatransaccin.Siseconsultaun
empleado especifico que tiene salario igual a 9, al final de la transaccin ese
empleadotendrsalario15
Evitarusarrelacionesunoamuchos,omuchosamuchoscontipodefetch
EAGER.Sisenecesitaconsultarentidadesincluyendolasentidadeshijases
preferibleusarunqueryconJOINFETCH.Ejemplo:

http://heinsohn.wikidot.com/articulos:lineamientosjpa

4/6

16/4/2015

BuenasPrcticasJPAyTaylorHeinsohnBusinessTechnology

@Entity
publicclassDepartamento{
@OneToMany(mappedBy="departamento"fetch="EAGER")
Collection<Empleado>empleados
}
Evitar la relacin EAGER anterior cambiandola a LAZY y realizar consultas como la
siguiente:

@Entity
@NamedQueries({
@NamedQuery(name="departamentosConEmpleados",query="selectdfromDepar
})
publicclassDepartamento{
@OneToMany(mappedBy="departamento"fetch="LAZY")
Collection<Empleado>empleados
}

EnelcasoanteriorsilaentidadDepartamentonoesmanejadaporelcontextode
persistencia y se intenta acceder a la coleccin de empleados
(departamento.getEmpleados()), causa que se lance una excepcin. Por eso se
recomienda hacer departamento.getEmpleados().size() cuando la entidad aun esta
siendomanejadaporelcontextodepersistencia.
EvitarelusodeCascade=ALLoMERGEcuandohayjerarquiasprofundas.Si
sedeseautilizarunodeestostiposdeCascadesedebelimitarelalcancede
los mismos. Los posibles tipos son: ALL, PERSIST, MERGE, REMOVE,
REFRESH,laopcinpordefectonohaceningunaoperacinenCascade.
Evitar usar queries nativos, porque se pierde la portabilidad a diferentes
basesdedatos.
No usar transaccionalidad en mtodos que son slo de consulta. Se debe
usar@TransactionAttribute(SUPPORTS)

Optimizacin
Optimizacinendiseo
1. Usarlostiposdedatosmasadecuadosentamao
2. Enloposibleusarllavesprimariassimples
3. La normalizacin reduce la redundancia de datos, por lo que los updates
sern ms rpidos. Sin embargo la normalizacin causa que se tengan que
hacerjoinsenlasconsultas,hacindolasmslentas.
4. Pensar en realizar particin vertical en entidades que tengan muchos
atributosynotodossenecesitenentodosloscasos.Porejemplo:
Persona (Cedula, nombre, apellido, direccin, RH, edad,
cantidaddehijos,estadocivil,sexo,nacionalidad)
Puedecambiarsealassiguientesdosentidades:
http://heinsohn.wikidot.com/articulos:lineamientosjpa

5/6

16/4/2015

BuenasPrcticasJPAyTaylorHeinsohnBusinessTechnology

Persona(Cedula,nombre,apellido,infoDetallePersona)
InfoDetallePersona(direccin, RH, edad, cantidad de hijos,
estadocivil,sexo,nacionalidad)

Laoptimizacinconsisteen:
1. Monitorear las consultas que se generan cuando se ejecutan casos de uso
criticos
2. Identificar consultas: que se demoren mucho tiempo, que se ejecuten a
menudo,quecarguenmsdatosdelosnecesarios
3. Analizarlasconsultasquesegeneran:Esposiblequedividirunaconsultaen
dos o ms pasos dejando a java que realice pasos intermedios, es ms
eficiente que ejecutar una sola consulta que traiga todos los datos de una
vez.
4. Analizar las consultas para evitar consultar datos que no se necesitan:
Cuandoseutilizaem.find(..)ounaconsulta"selectdfromDepartamento",
secargantodoslosatributosdelaentidadDepartamento.Enesecasosila
entidad tiene atributos tipo BLOB que no se necesitan puede hacerse una
consultaqueexcluyaestoscampos.
5. Crear indices sobre columnas que se utilicen frecuentemente en la parte
where de las consultas. Tener en cuenta que los indices mejoran la
velocidaddelasconsultasperoreducenlavelocidaddelosupdates

PoweredbyWikidot.com

Help|TermsofService|Privacy|Reportabug|Flagasobjectionable

Unlessotherwisestated,thecontentofthispageislicensedunderCreativeCommonsAttributionShareAlike3.0License

http://heinsohn.wikidot.com/articulos:lineamientosjpa

6/6