Você está na página 1de 11

Trabalhando com JPA na prtica

O lanamento da especificao EJB 3.0 disponibiliza uma estrutura de EJB bastante simplificada, porm mais poderosa que demonstra uma preferncia assinalada por anota es ao in!s dos tradicionais descritores de implantao do EJB "#. $s anota es, introduzidas no J"%E &.0, so os modificadores que podem ser usados em classes, campos, mtodos, par'metros, !ari(!eis locais, construtores, enumera es e pacotes. O uso da anotao destacado em um con)unto de no!as caracter*sticas do EJB 3.0, tais como as )( bastante con+ecidas classes de EJB baseadas em ob)eto Ja!a, in)eo de dependncia das classes do ,erenciador de EJB, a introduo dos interceptores e uma $-. de persistncia em Ja!a /J-$0 e#tremamente incrementada. -ara ilustrar os conceitos de J-$, se,uiremos um e#emplo real. 1ecentemente, meu escrit2rio te!e que desen!ol!er um sistema de re,istro de impostos. $ssim como a maioria dos sistemas, ele tin+a as suas pr2prias comple#idades e desafios. 3isto que um de seus desafios esta!a relacionado ao acesso aos dados e mapeamento ob)eto4relacional /O150, decidiu4se realizar um 6test4dri!e7, ou se)a, e#perimentar a J-$ enquanto implement(!amos o sistema. 8i!ersos desafios foram encontrados durante o pro)eto9 E#istem, naturalmente, relacionamentos entre as entidades utilizadas na aplicao: O aplicati!o ap2ia buscas comple#as atra!s dos dados relacionais: O aplicati!o de!e ,arantir a inte,ridade dos dados: O aplicati!o !alida os dados antes de persisti4los: Opera es em massa so requeridas. O modelo de dados -rimeiramente, !amos apresentar a !erso reduzida do nosso modelo de dados que ser( suficiente para e#plicar as nuances do J-$. -artindo de uma perspecti!a comercial, um requerente principal submete um requerimento de re,istro de impostos. O requerente pode ter nen+um ou mais s2cios. O requerente e o s2cio de!em especificar dois endereos9 endereo re,istrado e o endereo comercial. O requerente principal tambm de!e declarar e descre!er todas as penalidades que recebeu no passado. $ ;i,ura < apresenta o modelo de dados elaborado.

Figura 1. 5odelo de 8ados.

Definindo entidades 8efinimos as entidades apresentadas na =abela < atra!s do seu mapeamento para tabelas indi!iduais. Entidade 1e,istration -art@ $ddress -enalt@ Tabela Mapeada Para 1E>.%=1$=.O? -$1=A $881E%% -E?$B=A

CaseOfficer C$%EDO;;.CE1 Tabela 1. 5apeamentos entre Entidades e =abelas .dentificar as entidades para mapear as tabelas e colunas do banco de dados foi f(cil. ?a Bista,em < est( um e#emplo simplificado da entidade 1E>.%=1$=.O? /introduzirei mapeamentos e confi,ura es adicionais para esta entidade mais tarde0. istagem 1. 5apeamento para a entidade 1E>.%=1$=.O? EEntit@ E=able/nameFG1E>.%=1$=.O?G0 public class 1e,istration implements %erializableH E.d pri!ate int id: EColumn/nameFG1E;E1E?CED?I5BE1G0 pri!ate %trin, reference?umber:

.......... J 8o ponto de !ista da equipe, o principal benef*cio de utilizar entidades J-$ foi que sentimos como se esti!ssemos codificando classes rotineiras em Ja!a, uma !ez que poder*amos usar anota es para atribuir funcionalidades de persistncia Ks entidades. 8escobrimos que no necessitar*amos de outra camada e#tra de transferncia de dados de ob)etos /8=O0 e que poder*amos reutilizar as entidades para mo!er os dados entre camadas da aplicao. Apoiando polimorfismo Ol+ando para o modelo de dados da aplicao /;i,ura <0, percebemos que a tabela -art@ foi utilizada para armazenar ambos os re,istros do 1equerente /$pplicant0 e do %2cio /-artner0. Estes re,istros compartil+aram al,uns atributos comuns /apresentados no modelo0, mas tambm podero ter no futuro al,uns atributos indi!iduais. %endo assim, optou4se por modelar estas tabelas em uma +ierarquia. Com o EJB ".#, poderia ser utilizada somente uma entidade bean -art@ e ento criar os ob)etos 1equerente ou %2cio, baseados no tipo de -art@, implementando a l2,ica no c2di,o. J-$, por outro lado, nos permite especificar a +ierarquia no n*!el da entidade. 8ecidiu4se ento modelar a +ierarquia com uma entidade abstrata -art@ /Bista,em "0 e duas entidades concretas, $pplicant /1equerente0 e -artner /%2cio0.

istagem !. Classe $bstrata -$1=A EEntit@ E=able/nameFG-$1=AD8$=$G0 E.n+eritance/strate,@F .n+eritance=@pe.%.?>BED=$BBE0 E8iscriminatorColumn/nameFG-$1=AD=A-EG0 public abstract class -art@ implements %erializableH E.d protected int id: EColumn/nameFG1E>D.8G0 protected int re,.8:

protected %trin, name: ......... J $s duas classes concretas, -artner e $pplicant, a,ora +erdaro da classe abstrata -art@ /Bista,em 30. istagem ". Classe concreta $--B.C$?= EEntit@ E8iscriminator3alue/G0G0 public class $pplicant e#tends -art@H EColumn/nameFG=$LD1E;D?OG0 pri!ate %trin, ta#1ef?umber: EColumn/nameFG.?CO1-D8$=EG0 pri!ate %trin, incorporation8ate: ........ J %e a coluna -$1=AD=A-E ti!er o !alor 0, o pro!edor de persistncia retornar( uma inst'ncia da entidade do tipo $pplicant: se o !alor for <, ele retornar( uma inst'ncia da entidade do tipo -artner. #onstruindo rela$%es $ tabela -$1=A no modelo de dados da aplicao contm uma coluna c+a!e4 estran,eira /re,Did0 para a tabela 1E>.%=1$=.O?. ?esta estrutura, a entidade -art@ torna4se a ori,em do relacionamento, pois onde n2s especificamos a coluna de )oin /)uno0. $ entidade 1e,istration torna4se o destino do relacionamento. Com todos os relacionamento com a cardinalidade 5an@=oOne /5uitos para Im0, mais pro!(!el que o relacionamento se)a bidirecional, isto , +a!er( tambm um relacionamento de One=o5an@ /Im para 5uitos0 entre duas entidades /Bista,em M0. $ =abela " mostra nossas defini es dos relacionamentos. &ela$'o Origem Multiplicidade

1e,istration CaseOficcer CaseOficcer 1e,istration -art@ -art@ $ddress -art@ -enalt@ -art@ $ddress -enalt@

Im para Im 5uitos para Im 5uitos para Im 5uitos para Im Im para Im Im para 5uitos Im para 5uitos Im para 5uitos

Bado 1e!erso do 1elacionamento CaseOficcer 1e,istration 1e,istration -art@ 1e,istration $ddress -art@ 1e,istration -art@

-art@ -enalt@ -art@ Tabela !. 8efinio dos relacionamentos

istagem (. 8efinindo o relacionamento entre as entidades 1e,istration e -art@ public class 1e,istration implements %erializableH .... EOne=o5an@/mappedB@ F Gre,istrationG0 pri!ate Collection parties: .... J public abstract class -art@ implements %erializableH .... E5an@=oOne EJoinColumn/nameFG1E>D.8G0 pri!ate 1e,istration re,istration: .... NN ?ota9 O elemento mappedB@ indica que a coluna )oin especificada na outra ponta da relao. Em se,uida, ti!emos que considerar o comportamento dos relacionamentos tais como definido pela especificao da J-$ e implantado pelos pro!edores de persistncia. $ questo foi9 como queremos acessar o conteOdo dos dados relacionados /atributo ;E=CP0Q E#istem duas formas9 EA)E&* sempre que o ob)eto GpaiG for trazido da base de dados, o atributo mapeado com o tipoE$>E1 far( com que o seu conteOdo tambm se)a trazido: A+,* sempre que o ob)eto GpaiG for trazido da base de dados, o atributo mapeado com B$RAfar( com que o seu conteOdo somente se)a trazido quando acessado pela primeira !ez. Com isto em mente, analisaram4se os tipos de ;E=CP padro para relacionamentos definidos no J-$, e ento foi adicionada uma coluna e#tra na =abela " para incluir nossas descobertas /!er =abela 30. &ela$'o Origem Multiplicidade Im para Im 5uitos para Im 5uitos para Im Tipo de FET#E$>E1 E$>E1 E$>E1

1e,istration CaseOficce CaseOficcer r 1e,istration -art@ -art@ $ddress -art@ $ddress

-art@ -enalt@ CaseOficcer 1e,istratio n -art@ 1e,istration $dress -art@

-enalt@ 1e,istration 1e,istration -art@

5uitos para Im Im para Im Im para 5uitos Im para 5uitos

B$RA B$RA B$RA B$RA

Bado 1e!erso do 1elacionamento

-art@ Im para 5uitos B$RA -enalt@ -art@ Tabela ". Confi,urando o tipo de ;E=CP dos relacionamentos $nalisando os requisitos de ne,2cio, percebemos que quando obti!ermos detal+es da entidade 1e,istration, sempre seria necess(rio e#ibir os detal+es da entidade -art@ associada ao ob)eto 1e,istration em questo. Com o tipo de ;E=CP definido B$RA, ter*amos que fazer c+amadas repetiti!as ao banco de dados para obter os dados. .sto indicou que poderia ser obtido um mel+or desempen+o se o tipo de ;E=CP da relao 1e,istration -art@ fosse mudado para E$>E1. Com este a)uste, o pro!edor de persistncia retornaria as informa es relacionadas como parte de um Onico %SB. %imilarmente, quando so e#ibidos os detal+es de uma entidade -art@ na tela, seria necess(rio e#ibir o seu/s0 endereo/s0 associado/s0. ConseqTentemente, tambm fez sentido mudar a relao -art@ $ddress para usar o tipo de busca E$>E1. -or outro lado, o tipo de ;E=CP do relacionamento -art@ -enalt@ poderia ser confi,urado para o tipo B$RA, uma !ez que n2s no necessitamos e#ibir os detal+es das penalidades, a menos que um usu(rio os solicite. %e fosse usado o tipo de busca E$>E1 para um nOmero 6m7 de partes que tm o nOmero das penalidades 6n7 cada um, terminaria sendo carre,ado um nOmero mUn de entidades -enalt@, o que resultaria em uma ,rande quantidade de ob)etos colocados em mem2ria. .stoterminaria causando perda de desempen+o para a aplicao. $ Bista,em & descre!e como feita a confi,urao dos atributos ;E=CP dos relacionamentos. istagem .. Confi,urando o atributo ;E=CP dos relacionamentos public class 1e,istration implements %erializableH EOne=o5an@/mappedB@ F Gre,istrationG, fetc+ F ;etc+=@pe.E$>E10 pri!ate Collection parties: ..... J public abstract class -art@ implements %erializableH EOne=o5an@ /mappedB@ F Gpart@G, fetc+ F ;etc+=@pe.E$>E10 pri!ate Collection

addresses;
@OneToMany (mappedBy = "party", fetch=FetchType.LAZY) pri ate !o""ection pena"tie#$ ..... % Acessando relacionamentos do tipo LAZY Ao con#iderar o &#o de &ma a'orda(em do tipo LAZY para carre(amento do# dado#, con#idere o e#copo do conte)to da per#i#t*ncia. +oc* pode e#co"her entre &m conte)to de per#i#t*ncia ,-T,./,/ o& &m conte)to de per#i#t*ncia de"imitado

pe"a T0A.1A!T2O.. 3m conte)to ,-T,./,/ de per#i#t*ncia permanece 4 i o5 entre tran#a67e# e a67e# 'em como &ma #e##8o de 'ean. +i#to 9&e para a ap"ica68o de#crita ne#te arti(o o conte)to da per#i#t*ncia n8o preci#a #er d&r: e" entre tran#a67e#, opto&;#e por &#ar &m conte)to de per#i#t*ncia T0A.1A!T2O.. ,ntretanto, i#to no# apre#ento& &m pro'"ema com carre(amento de o'<eto# do tipo LAZY. 3ma e= 9&e &ma entidade > o'tida e a tran#a68o termina, a entidade fica i#o"ada. O& #e<a, em no##a ap"ica68o, tentar carre(ar 9&a"9&er dado de re"acionamento &#ando o tipo LAZY re#&"tar: em &m comportamento indefinido. .a maioria do# ca#o#, 9&ando o# ca#eofficer# rec&peram o# dado# de &m re(i#tro, n8o > nece##:rio e)i'ir a# pena"idade#. ?or>m, para (erente#, > preci#o e)i'ir adiciona"mente o# re(i#tro# da# pena"idade#. !on#iderando 9&e, na maioria da# e=e#, n8o > nece##:rio e)i'ir o# re(i#tro# da# pena"idade#, n8o faria nenh&m #entido m&dar o tipo de re"acionamento para ,A@,0. Ao in ># di##o, podemo# pro ocar o carre(amento do tipo LAZY do# dado# do re"acionamento atra ># da detec68o de 9&ando &m (erente e#t: &#ando o #i#tema. 2#to tornar: o# dado# do re"acionamento di#ponA ei# me#mo 9&ando a entidade e#t: i#o"ada e pode #er ace##ada mai# tarde. O e)emp"o da Li#ta(em B i"&#tra e#te conceito. Listagem 6. !arre(ando o# dado# da# pena"idade# de &ma entidade ?arty C. 0e(i#tration re(i#tration = em.find(0e(i#tration.c"a##, re(2/)$ D. E. !o""ection partie# = re(i#tration.(et?artie#()$ F. for (2terator iterator = partie#.iterator()$ iterator.ha#.e)t()$) G H. ?arty party = iterator.ne)t()$ B. party.(et?ena"tie#().#i=e()$ I. % J. ret&rn re(i#tration$ .o e)emp"o da Li#ta(em B, o# m>todo# #i=e() da# co"e67e# de pena"idade# da entidade ?arty foram in ocado# ("inha B). 2#to re#o" e a 9&e#t8o e pro oca o carre(amento do tipo LAZY e toda# a# co"e67e# #er8o po oada# e di#ponA ei# me#mo 9&ando a entidade 0e(i#tration e#ti er i#o"ada. Relaes e persistncia ,m #e(&ida, temo# 9&e con#iderar como o# re"acionamento# #e comportar8o d&rante o proce##o de per#i#t*ncia do# dado#. /e forma #imp"ificada, #e forem feita# 9&ai#9&er modifica67e# no# dado# do# re"acionamento#, 9&eremo# fa=er i#to no nA e" do o'<eto e ter a# modifica67e# per#i#tida# pe"o pro edor de per#i#t*ncia. ,m K?A, pode;#e &ti"i=ar tipo# em !A1!A/, para contro"ar o comportamento da per#i#t*ncia. ,)i#tem 9&atro tipo# em !A1!A/, definido# no K?AL PERSISTL M&ando a entidade propriet:ria (ori(em) > per#i#tida, toda# a# informa67e# re"acionada# a e"a tam'>m #8o per#i#tida#$ MER EL M&ando &ma entidade i#o"ada > 4f&ndida5 (mer(e) no amente em &m conte)to de per#i#t*ncia ati o, toda# a# informa67e# re"acionada# a e"a tam'>m #8o 4f&ndida#5$ REM!"EL M&ando &ma entidade > remo ida, todo# o# dado# re"acionado# a e"a tam'>m #8o remo ido#$ ALLL Todo# o# tipo# acima #8o ap"icado#. #riando $ma entidade /ecidi&;#e 9&e em todo# o# ca#o#, 9&ando &ma no a entidade pai for criada, 9&eremo# 9&e toda# a# entidade# fi"ha# re"acionada# tam'>m fo##em per#i#tida# a&tomaticamente. 2#to torno& a codifica68o mai# f:ci"L te e;#e apena# 9&e

confi(&rar o# dado# do# re"acionamento# corretamente e n8o foi nece##:rio in ocar a opera68o per#i#t() em cada entidade #eparadamente. A##im, o tipo em ca#cata ?,0121T era a op68o mai# atrati a para o conte)to de no##a ap"ica68o. /e##a forma, toda# a# no##a# defini67e# de re"acionamento# foi refatorada para poder &ti"i=:;"o. At$ali%ando $ma entidade N com&m o'ter dado# a partir de &ma tran#a68o e ent8o fa=er m&dan6a# na# entidade# fora da tran#a68o e em #e(&ida per#i#tir a# m&dan6a#. ?or e)emp"o, em no##a ap"ica68o, o# &#&:rio# podiam rec&perar &m re(i#tro e)i#tente e modificar o endere6o do re9&erente principa". M&ando > o'tida &ma entidade 0e(i#tration e)i#tente e, con#e9&entemente, toda# a# #&a# informa67e# re"acionada# dentro de &ma tran#a68o e#pecAfica, a tran#a68o termina aA e a# informa67e# #8o en iada# O camada de apre#enta68o. A e#ta a"t&ra, o o'<eto 0e(i#tration e toda# a# o&tra# in#tPncia# de entidade# re"acionada# tornam;#e i#o"ada# do conte)to de per#i#t*ncia. ,m K?A, para per#i#tir a# modifica67e# em &ma entidade i#o"ada, pode #er &ti"i=ada a opera68o mer(e() do ,ntityMana(er ((erenciador de entidade). A">m di##o, a fim de propa(ar a# modifica67e# ao# dado# do re"acionamento, toda# a# defini67e# do re"acionamento de em inc"&ir o tipo em ca#cata M,0@, <&nto com 9&a"9&er o&tro tipo em ca#cata definido na confi(&ra68o de mapeamento do re"acionamento. !om i#to, no# certificamo# de 9&e e#pecificamo# o# tipo# correto# de !A1!A/, para toda# a# defini67e# de re"acionamento. Remo&endo $ma entidade ,m #e(&ida, ti emo# 9&e determinar o 9&e aconteceria 9&ando determinada# entidade# fo##em apa(ada# o& remo ida#. ?or e)emp"o, #e &ma entidade do tipo 0e(i#tration fo##e apa(ada, poderAamo# com #e(&ran6a apa(ar toda# a# entidade# do tipo ?arty a##ociada# a e#te re(i#tro. Ma# o in er#o n8o > erdadeiro. O tr&9&e a9&i > e itar toda e 9&a"9&er remo68o n8o de#e<ada de entidade# ap"icando, em ca#cata, a opera68o remo e() no re"acionamento. !omo oc* er: na #e68o #e(&inte, tai# opera67e# podem n8o ter #&ce##o em ra=8o de re#tri67e# de inte(ridade referencia". !om i##o, conc"&i&;#e 9&e em &ma c"ara re"a68o pai;fi"ho, ta" como ?arty e Addre## o& ?arty e ?ena"ty, 9&e #e(&em re"a67e# de 43m para M&ito#5, > #e(&ro e#pecificar o tipo em ca#cata 0,MO+, #omente no "ado do pai da re"a68o (3M). 1endo a##im, a# defini67e# do# re"acionamento# foram no amente refatorada#, conforme a Li#ta(em I. Listagem '. 0efatora68o do cQdi(o de acordo do tipo em !A1!ATA do# re"acionamento#. p&'"ic a'#tract c"a## ?arty imp"ement# 1eria"i=a'"eG @OneToMany (mappedBy = "party", fetch = FetchType.,A@,0, ca#cade = G!a#cadeType.?,0121T, !a#cadeType.M,0@,, !a#cadeType.0,MO+,%) pri ate !o""ection

addresses;
@OneToMany (mappedBy = "party", fetch=FetchType.LAZY, ca#cade = G!a#cadeType.?,0121T, !a#cadeType.M,0@,, !a#cadeType.0,MO+,%) pri ate !o""ection pena"tie#$ ..... % erenciando relaes

/e acordo com K?A, (erenciar re"acionamento# > re#pon#a'i"idade e)c"&#i a do pro(ramador. ?ro edore# de per#i#t*ncia n8o pre#&mem nada #o're o e#tado do# dado# do# re"acionamento#, ent8o e"e# n8o tentam (erenciar e#ta informa68o. /ado e#te fato, a no##a e#trat>(ia para (erenciar re"acionamento# e identificar potenciai# :rea# de pro'"ema# foi ree)aminada. ApQ# i##o, de#co'ri&;#e o #e(&inteL 1e tentarmo# confi(&rar &m re"acionamento entre &ma entidade pai e fi"ho, e o pai <: n8o e)i#tir no 'anco de dado# (ta" e= tenha #ido remo ido por o&tro &#&:rio), i#to "e ar: a pro'"ema# de inte(ridade de informa67e#$ 1e tentarmo# apa(ar &m re(i#tro pai #em ante# remo er #e& re(i#tro fi"ho, &ma inte(ridade referencia" #er: io"ada. A##im, ordenamo# a# #e(&inte# diretri=e# de codifica68oL 1e o'ti ermo# &ma entidade e #&a# entidade# re"acionada# em &ma tran#a68o, modificamo# o re"acionamento fora da tran#a68o e ent8o tentamo# per#i#tir a# m&dan6a# dentro de &ma no a tran#a68o, > me"hor redefinir (re; fetch) a entidade pai. 1e tentarmo# apa(ar &m re(i#tro pai #em apa(ar o# re(i#tro# fi"ho#, de emo# confi(&rar o campo de cha e e#tran(eira para todo# o# fi"ho# para .3LO ante# de remo er o pai. !on#idere a re"a68o de 43m para 3m5 entre a# entidade# !a#eOfficer e 0e(i#tration. M&ando apa(amo# &ma determinada entidade do tipo 0e(i#tration, n8o apa(amo# a entidade !a#eofficer. A##im, > nece##:rio confi(&rar a cha e e#tran(eira re(Rid para n&"o ante# 9&e 9&a"9&er entidade do tipo 0e(i#tration #e<a apa(ada (Li#ta(em J). Listagem (. ?rocedimento para remo er &ma entidade do tipo 0e(i#tration @1tate"e## p&'"ic c"a## 0e(Mana(er G ..... p&'"ic oid de"ete0e((int re(2d)G 0e(i#tration re( = em.find(0e(i#tration.c"a##, re(2d)$ !a#eOfficer officer =re(.(et!a#eOfficer()$ officer.#et0e(i#tration(n&"")$ em.remo e(re()$ % % Integridade dos dados M&ando &m &#&:rio e#t: i#&a"i=ando &m re(i#tro do tipo 0e(i#tration, o&tro &#&:rio pode e#tar fa=endo m&dan6a# no me#mo item. 1e o primeiro &#&:rio ent8o fi=er m&dan6a# adicionai# no item em 9&e#t8o, e"e corre o ri#co de #o're#cre a;"a com informa67e# anti(a#. ?ara tratar e#ta 9&e#t8o, decidi&;#e &#ar "optimi#tic "ocSin(" (a"(o como 4tra amento otimi#ta5). ,m K?A, entidade# podem definir &ma co"&na de er#ionamento, 9&e nQ# podemo# &ti"i=ar para imp"ementar o 4optimi#tic "ocSin(5 (Li#ta(em T). Listagem ). 3#ando a co"&na para er#ionamento do# dado# p&'"ic c"a## 0e(i#tration imp"ement# 1eria"i=a'"eG @+er#ion

pri ate int er#ion$ ..... % O pro edor de per#i#t*ncia com'inar: o a"or em memQria da co"&na 4 er#ion5 com a9&e"e do 'anco de dado#. 1e o# a"ore# forem diferente#, o pro edor de per#i#t*ncia re"atar: &ma e)ce68o. "alida*o M&ando di=emo# 9&e o re9&erente principa" de e ter pe"o meno# &m endere6o, e o endere6o de e pe"o meno# conter a primeira "inha e o !,?, e#tamo# ap"icando &ma re(ra de ne(Qcio atra ># da# entidade# ?arty e Addre##. .o entanto, #e di##ermo# 9&e cada "inha do endere6o de e ter #empre meno# de CUU caractere#, e#ta a"ida68o > intrAn#eca da entidade Addre##. ,m no##a ap"ica68o, decidi&;#e e)ec&tar a# re(ra# de a"ida67e# do tipo cr&=amento de o'<etoVne(Qcio em &ma camada de 1e##ion Bean, poi# e#te > o "&(ar onde a maior parte do f"&)o de tra'a"ho e da "Q(ica orientada ao proce##o > codificada. ,ntretanto, a# a"ida67e# intrAn#eca# foram co"ocada# dentro da# entidade#. 3#ando K?A, poderAamo# a##ociar 9&a"9&er m>todo a &m e ento do cic"o de ida para &ma entidade. O e)emp"o da Li#ta(em CU a"ida 9&e &ma "inha de ,ndere6o pode conter n8o mai# 9&e CUU caractere# e chama e#te m>todo ante# 9&e a entidade de ,ndere6o #e<a per#i#tida (com &ma anota68o de @?re?er#i#t). ,m ca#o de fraca##o, e#te m>todo di#para &ma e)ce68o de ne(Qcio (9&e e#tende da c"a##e 0&ntime,)ception) para o chamador, 9&e pode ent8o #er &#ado para pa##ar &ma men#a(em ao &#&:rio. Listagem +,. !riando re(ra# de a"ida68o p&'"ic c"a## Addre## imp"ement# 1eria"i=a'"eG ..... @?re?er#i#t p&'"ic oid a"idate() if(addre##LineCW=n&"" XX addre##LineC."en(th()YCUUU)G throZ neZ +a"idation,)ception("Addre## Line C i# "on(er than CUUU char#.")$ % % -$sca .o##a ap"ica68o de re(i#tro de impo#to# oferece& &ma f&nciona"idade de '&#ca para "oca"i=ar deta"he# #o're &m re(i#tro e#pecAfico, #&a# parte# e o&tro# deta"he#. ?ro er &ma f&nciona"idade de '&#ca eficiente en o" e& :rio# de#afio#, tai# como redi(ir 9&erie# eficiente# e imp"ementar pa(ina68o para fo"hear &ma amp"a "i#ta de re#&"tado#. K?A e#pecifica &ma Lin(&a(em de !on#&"ta# de ?er#i#t*ncia Ka a (Ka a ?er#i#tence M&ery Lan(&a(eL K?;ML) a #er &ti"i=ada com a# entidade# para imp"ementar o ace##o ao# dado#. N &ma (rande me"horia #o're ,KB D.) ,KB ML. #ons$ltas ,m K?A, temo# op67e# para criar con#&"ta# dinamicamente o& definir con#&"ta# e#t:tica#. ,#ta# con#&"ta# e#t:tica# o& nomeada# #&portam parPmetro#$ o# a"ore# do# parPmetro# #8o atri'&Ado# em tempo de e)ec&68o. !omo o e#copo da# con#&"ta# 9&e comp7em no##a ap"ica68o era ra=oa e"mente 'em definido, decidi&; #e &ti"i=ar a# con#&"ta# nomeada# com parPmetro#. A# con#&"ta# nomeada# #8o tam'>m mai# eficiente# por9&e o pro edor da per#i#t*ncia pode (&ardar em cache a# con#&"ta# 1ML trad&=ida# para &#o f&t&ro.

.o##a ap"ica68o fornece& &m #imp"e# ca#o de &#o para i#toL 9&ando &m &#&:rio fornece &m n[mero de refer*ncia de &m re9&erimento para rec&perar deta"he# do re(i#tro. ?ara "idar com e#ta f&nciona"idade, fornecemo# &ma con#&"ta nomeada na entidade 0e(i#tration como a de#crita na Li#ta(em CC. Listagem ++. !on#&"ta O entidade 0e(i#tration @,ntity @Ta'"e(name="0,@21T0AT2O.") @.amedM&ery(name="findBy0e(.&m'er", 9&ery = "1,L,!T r F0OM 0,@21T0AT2O. r \],0, r.app0ef.&m'er=^C") p&'"ic c"a## 0e(i#tration imp"ement# 1eria"i=a'"eG ..... % .e#te conte)to, &m re9&i#ito de '&#ca na no##a ap"ica68o preci#o& de &ma aten68o e#pecia"L &ma con#&"ta de re"atQrio para rec&perar toda# a# parte# com #&a# 9&antidade# totai# de pena"idade#. K: 9&e a ap"ica68o permite 9&e a# parte# e)i#tam #em pena"idade#, &ma #imp"e# opera68o KO2. n8o "i#taria parte# #em nenh&ma pena"idade. ?ara "idar com i#to, foi &ti"i=ada a faci"idade O3T,0 KO2. de K?;ML, ma# poderia tam'>m #er &ti"i=ada &#ar a c":&#&"a @0O3? BY para #omar a# pena"idade#. 1endo a##im, foi adicionada o&tra con#&"ta nomeada na entidade ?arty, como a apre#entada na Li#ta(em CD. Listagem +.. !on#&"ta O entidade ?arty C. D. E. F. @,ntity @Ta'"e(name="?A0TYR/ATA") @2nheritance(#trate(y= 2nheritanceType.12.@L,RTABL,) @/i#criminator!o"&mn(name="?A0TYRTY?,")

H. @.amedM&erie#(G@.amedM&ery(name="(enerate0eport", B. 9&ery=" 1,L,!T .,\ com.##(.artic"e.0eport/TO(p.name, 13M(pen.amo&nt)) I. F0OM ?arty p L,FT KO2. p.pena"tie# pen @0O3? BY p.name""), ", T. 9&ery="3?/AT, ?A0TY ? 1,T p.#tat&#=U Zhere p.re(i#tration2/=^C")%) CU. p&'"ic a'#tract c"a## ?arty G CC. ..... CD. % E/ec$tando at$ali%aes em massa ,m no##a ap"ica68o, &m oficia" pode rec&perar &m re(i#tro e torn:;"o inati o. .e#te ca#o, de e;#e confi(&rar toda entidade ?arty a##ociada ao re(i#tro como inati a. 2#to re#&"ta no a<&#te da co"&na 1tat&# na ta'e"a ?A0TY para U. ?ara me"horar o de#empenho, pode #er &ti"i=ada at&a"i=a68o em ma##a in ># de e)ec&tarmo# 1ML# indi id&ai# para cada ?arty. Fe"i=mente, K?A fornece &ma maneira de fa=er i#to (Li#ta(em CE). Listagem +0. At&a"i=a68o em ma##a da# entidade# ?arty @.amedM&ery(name="'&"S2nacti e", 9&ery="3?/AT, ?A0TY p 1,T p.#tat&#=U Zhere p.re(i#tration2/=^C") p&'"ic a'#tract c"a## ?arty imp"ement# 1eria"i=a'"eG ..... %

1ota2 3ma opera68o em ma##a emite 1ML diretamente ao 'anco de dado#, o 9&e #i(nifica 9&e o conte)to da per#i#t*ncia n8o e#t: at&a"i=ado para ref"etir a# m&dan6a#. Ao &#ar &m conte)to de per#i#t*ncia e#tendido 9&e d&re a">m de &ma [nica tran#a68o, a# entidade# arma=enada# em cache podem conter informa67e# de#at&a"i=ada#. #oncl$s*o .o (era", K?A torno& a codifica68o para a per#i#t*ncia m&ito mai# #imp"e#. Achamo# K?A rico em f&nciona"idade# e 'a#tante eficiente. 1&a rica interface de con#&"ta# e #&a "in(&a(em de con#&"ta# tornaram m&ito mai# f:ci" "idar com cen:rio# re"acionai# comp"e)o#. ?or fim, poderia #er de#tacado tam'>m #e& apoio O heran6a. ,#te apoio no# po##i'i"ito& #&#tentar o mode"o "Q(ico do domAnio no nA e" da per#i#t*ncia e com i##o p&demo# re&ti"i=ar a# me#ma# entidade# atra ># de diferente# camada# da ap"ica68o.

Você também pode gostar