Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Buenas Prácticas JPA y Taylor - Heinsohn Business Technology
Buenas Prácticas JPA y Taylor - Heinsohn Business Technology
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
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