Home
Documentação de Referência Hibernate
Contents
1. org hibernate transaction OrionTransactionManagerLookup Orion org hibernate transaction ResinTransactionManagerLookup Resin org hibernate transaction JOTMTransactionManagerLookup JOTM org hibernate transaction JOnASTransactionManagerLookup JOnAS org hibernate transaction JRun4TransactionManagerLookup JRun4 org hibernate transaction BESTransactionManagerLookup Borland ES 3 8 2 SessionFactory vinculada a JNDI Uma sessionFactory de Hibernate vinculada JNDI pode simplificar a localiza o da f brica e a Cria o de novas sessions Observe que isto n o est relacionado a um Datasource ligado a JNDI simplesmente ambos usam o mesmo registro Se voc desejar ter uma SessionFactory limitada a um nome de espa o de JNDI especifique um nome ex java hibernate SessionFactory usando a propriedade hibernate session factory name Se esta propriedade for omitida a sessionFactory n o ser limitada ao JNDI Isto muito til em ambientes com uma implementa o padr o JNDI de somente leitura ex Tomcat Ao vincular a SessionFactory ao JNDI o Hibernate ir utilizar os valores de hibernate jndi url hibernate jndi class para instanciar um contexto inicial Se eles n o forem especificados ser usado o padr o InitialContext O Hibernate colocar automaticamente a SessionFactory no JNDI depois que voc chamar a cfg buildSessionFactory Isto significa que voc ter esta chamada em pelo meno
2. ee eeeeeeeeeeeeeeeeaes 215 15 1 Diferencia o de mai scula e min scula i rara 215 15 2 A ClAUSUIA TOM sormeani a A Sal anaa panda no baat ancas nara san Unai eia 215 15 3 Associa es UNI ES ve cn Aesees sete eee case ties E T 216 15 4 Formas de sintaxe de uni es ie eeaeraeraraa arara 218 15 5 Refer ncia propriedade do identificador rr nrreeeesrsrnnne 218 15 6 A Clausula SCIOCE desieectsisvyccetsnnatlecaseueeseannnbsed ena snestbennebdeastedoestaniiedviendesebaanddaaes 219 15 7 Fun es de agrega o cece eeeeeee eee ee eeeeee tees eeeeeeeeeeaaeeeeeeaeeeeeaaaeeeeeaaaes 220 15 8 Pesquisas Polim rficas cence eeeeeeeeee ai ana aaa ia niais 221 15 9 A cl usula Where sisvotisssicvedesbiveccasbecvndeelieOdeavadevenssildedlasbeveeess tin btasseiavebsahtvtesys 221 152110 o oieee PR OR RE RR q RR NA dotsantecverabeactoeas 223 15 11 A cl usula ordenar por iara aE aaa 227 15 12 A cl usula agrupar por iris ee aaeaeeeeeeeeeeeeaaaaeeneeseeeees 228 15 13 SubconSultaS arseron naa E nanda Sabia Dane pena P icon lan aaa OR 228 15 14 Exemplos de HQ isasacaaa osso dievecsch sanada sae iaaa Wy odes SUAS aaa Sad JA da bar a 229 15 15 Atualiza o e corre o em lote ce eeeeeeeeeeeeeeeaeaaeaeeseeeeeeeaeaaaaenees 232 15 16 Dicas amp Truques ic teen setores ocre astra gas nens
3. 00 cece cece cece ee eee ee eee ee cence ceeeeeeeeeeeeeeeeees 311 24 1 Empregador Empregado ce AEEA E 311 24 2 Autor Trabalho mssins iain aa a a a aa a 313 24 3 Cliente Ordem Produto e rreraraa arara aran ar anaananas 315 24 4 Exemplos variados de mapeamento ear 317 HIBERNATE Persist ncia Rela 24 4 1 Associa o um para um Typed 00 raras 317 24 4 2 Exemplo de chave composta ie 318 24 4 3 Muitos para muitos com fun o de chave composta compartilhada 320 24 4 4 Conte do baseado em discrimina o teen aeeaeeeeeeeeeeeeaes 320 24 4 5 Associa es em chaves alternativas i 321 25 Melhores pr ticas z 2samp nessas nfs Das oadipica EasD yess eietadarvaabeesesnsviea AEE 323 26 Considera es da Portabilidade do Banco de Dados cccccceseeeeeeeeneeeees 327 26 1 Fundamentos da Portabilidade erraram 327 26 2 Dialeto sei ccieicedt pe eee RO eee ena adie Bee 327 26 3 Resolu o do Dialoto sasasi ER a EEA 327 26 4 Gera o do identificador esac ee eeeeeeeeeeeeaeaaeaeeeeeeeeeeeaaaaeeeees 328 26 5 Fun es do banco de dados eeeeecceeeeeeeeeeeeeeeeeeeeeeaaeeeeeeaaeeeeeeaaeeeeeeaaeeeeeeaa 329 26 6 Tipos de mapeamentos uinnean KEENAN ENKAN aaa arenas 329 Refer ncias quarsesanuiastalasi erica Naa EARE IEE E TI
4. Adicionamos uma op o para o m todo principal com o objetivo de listar os eventos arquivados if args 0 equals store mgr createAndStoreEvent My Event new Date else if args 0 equals list List events mgr listEvents for int i 0 i lt events size i 13 Capitulo 1 Tutorial Event theEvent Event events get i System out printl1n Event theEvent getTitle Time i Nos tamb m adicionamos um novo listEvents method is also added private List listEvents theEvent getDate Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction List result session createQuery from Event list session getTransaction commit return result Here we are using a Hibernate Query Language HQL query to load all existing Event Objects from the database Hibernate will generate the appropriate SQL send it to the database and populate Event objects with the data You can create more complex queries with HQL See Cap tulo 15 HQL A Linguagem de Consultas do Hibernate for more information Agora podemos chamar nossa nova funcionalidade usando novamente o Maven exec plugin mvn exec java Dexec mainClass org hibernate tutorial 1 Dexec args list 1 2 Parte 2 Mapeando associa es EventManager N s mapeamos uma classe de entidade de persist ncia para uma tabela Ag
5. JMX deployment Se voc usa um JMX servidor de aplica es capaz ex Jboss AS voc pode fazer a instala o do Hibernate como um MBean controlado Isto evita ter que iniciar uma linha de c digo para construir sua sessionFactory de uma Configuration O container iniciar seu HibernateService e tamb m cuidar das depend ncias de servi os DataSources t m que estar dispon veis antes do Hibernate iniciar etc Dependendo do seu ambiente voc pode ter que ajustar a op o de configura o hibernate connection aggressive release para verdadeiro true se seu servidor de aplica es lan ar exe es reten o de conex o 3 8 1 Configura o de estrat gia de transa o A API Hibernate session independente de qualquer sistema de demarca o de transa o em sua arquitetura Se voc deixar o Hibernate usar a JDBC diretamente atrav s de um pool de conex es voc pode inicializar e encerrar suas transa es chamando a API JDBC Se voc rodar em um servidor de aplica es J2EE voc poder usar transa es controladas por beans e chamar a API JTA e UserTransaction quando necess rio Para manter seu c digo port vel entre estes dois e outros ambientes recomendamos a API Hibernate Transaction que envolve e esconde o sistema subjacente Voc tem que especificar uma classe construtora para inst ncias Transaction ajustando a propriedade de configura o do hibernate transaction factory class E
6. Session session _sessions openSession Transaction tx null Ery i tx session beginTransaction BlogItem item BlogItem session load BlogItem class itemid item setText text tx commit catch HibernateException he f tex null ts rollback throw he finally session close public List listAllBlogNamesAndItemCounts int max throws HibernateException Session session _sessions openSession Transaction tx null List result null Ery i tx session beginTransaction Query q session createQuery select blog id blog name count blogItem from Blog as blog T w 308 C digo Hibernate left outer join blog items as blogItem Mgroup by blog name blog ad 1 p order by max blogItem datetime i q setMaxResults max result q list exe commit Oy catch HibernateException he af txt null tx reliback throw he finally session close return result public Blog getBlogAndAllItems Long blogid throws HibernateException Session session _sessions openSession Transaction tx null Blog blog null try tx session beginTransaction Query q session createQuery from Blog as blogs left outer join fetch blog items where blog id blogid i q setParameter blogid blogid blog Blog q uniqueResult Exo Commits catch HibernateException he If txt null tx rollback throw he
7. gt lt class gt lt hibernate mapping gt Discutiremos agora o conte do deste documento de mapeamento Iremos apenas descrever os elementos do documento e fun es que s o utilizadas pelo Hibernate em tempo de execu o O documento de mapeamento tamb m cont m algumas fun es adicionais e opcionais al m de elementos que afetam os esquemas de banco de dados exportados pela ferramenta de exporta o de esquemas Por exemplo o atributo not nu11 5 1 1 Doctype Todos os mapeamentos de XML devem declarar o doctype exibido O DTD atual pode ser encontrado na URL abaixo no diret rio hibernate x x x src org hibernate Ou no hibernate3 jar O Hibernate sempre ir procurar pelo DTD inicialmente no seu classpath Se voc tentar localizar o DTD usando uma conex o de internet compare a declara o do seu DTD com o conte do do seu classpath 5 1 1 1 Solucionador de Entidade O Hibernate ir primeiro tentar solucionar os DTDs em seus classpath Isto feito registrando uma implementa o org xml sax EntityResolver personalizada com o SAXReader que ele utiliza para ler os arquivos xml Este EntityResolver personalizado reconhece dois nomes de espa o de sistemas ld diferentes Um hibernate namespace reconhecido quando um solucionador encontra um systema ld iniciando com nttp nibernate sourceforge net O solucionador tenta solucionar estas entidades atrav s do carregador de classe que carregou as classes
8. lt many to one name currentContract column currentContractId entity name CurrentContract gt lt class gt Note como as associa es s o agora especificadas utilizando O entity name ao inv s da class 5 4 Identificadores quotados do SQL Voc poder for ar o Hibernate a quotar um identificador no SQL gerado anexando o nome da tabela ou coluna aos backticks no documento de mapeamento O Hibernate usar o estilo de quota o correto para o SQL Dialect Geralmente s o quotas d plas mas par nteses para o Servidor SQL e backticks para MeuSQL lt class name LineItem table Line Item gt lt id name id column Item Id gt lt generator class assigned gt lt id gt lt property name itemNumber column Item gt lt class gt 5 5 Alternativas de Metadados O XML n o para todos e portanto existem algumas formas alternativas de defiinir o metadado de mapeamento no Hibernate 5 5 1 Usando a marca o XDoclet Muitos usu rios do Hibernate preferem encubar a informa o de mapeamento diretamente no c digo de fonte utilizando o XDoclet hibernate tags N s n o falaremos sobre esta abordagem 106 Usando a marca o XDoclet neste documento uma vez que estritamente considerado parte de um XDoclet No entanto inclu mos os seguintes exemplos da classe cat com os mapeamentos de XDoclet package eg import java util Set import java util Date hibernate
9. necess rio um mecanismo diferente para comportamento pregui oso em associa es de final nico A entidade alvo da associa o precisa usar um proxy O Hibernate implementa proxies para inicializa o pregui osa em objetos persistentes usando manipula o de bytecode atrav s da excelente biblioteca CGLIB Por padr o o Hibernate3 gera proxies na inicializa o para todas as classes persistentes que os usem para habilitar recupera o pregui osa de associa es many to one one to one O arquivo de mapeamento deve declarar uma interface para usar como interface de proxy para aquela classe com a fun o proxy Por padr o o Hibernate usa uma subclasse dessa classe Note que a classe a ser usada via proxy precisa implementar o construtor padr o com pelo menos visibilidade de package N s recomendamos esse construtor para todas as classes persistentes Existe alguns truques que voc deve saber quando estender esse comportamento para classes polim rficas Por exemplo lt class name Cat proxy Cat gt lt subclass gt lt class gt Primeiramente inst ncias de cat nunca ser o convertidas para DomesticCat mesmo que a inst ncia em quest o seja uma inst ncia de Domesticcat Cat cat Cat session load Cat class id instantiate a proxy does not hit the db if cat isDomesticCat 1 hit the db to initialize the proxy DomesticCat dc DomesticCat cat i Error E segundo poss vel q
10. not found opcional padr o para exception Especifica como as chaves exteriores que informam que linhas que estejam faltando ser o manuseadas O ignore tratar a linha faltante como uma associa o nula amp entity name opcional O nome da entidade da classe associada formula optional Uma instru o SQL que define um valor para uma chave exterior computed Setting a value of the cascade attribute to any meaningful value other than none will propagate certain operations to the associated object The meaningful values are divided into three categories First basic operations which include persist merge delete save update evict replicate lock and refresh second special values delete orphan and third all comma separated combinations of operation names cascade persist merge evict Or cascade all delete orphan See Se o 10 11 Persist ncia Transitiva for a full explanation Note that single valued many to one and one to one associations do not support orphan delete Segue abaixo uma amostra de uma t pica declara o many to one lt many to one name product class Product column PRODUCT ID gt O atributo property ref deve apenas ser usado para mapear dados legados onde uma chave exterior se refere uma chave exclusiva da tabela associada que n o seja a chave prim ria Este um modelo relacional desagrad vel Por exemplo suponha que a classe Product tenha um n mero sequenc
11. 152 Tabela por subclasse usando um discriminador S o necess rias quatro tabelas As tr s tabelas subclasses possuem associa o de chave prim ria para a tabela de superclasse desta maneira o modelo relacional atualmente uma associa o de um para um 9 1 3 Tabela por subclasse usando um discriminador A implementa o de tabela por subclasse do Hibernate n o necessita de coluna de discriminador Outro mapeador objeto relacional usa uma implementa o diferente de tabela por subclasse que necessita uma coluna com o tipo discriminador na tabela da superclasse A abordagem escolhida pelo Hibernate muito mais dif cil de implementar por m mais correto de um ponto de vista relacional Se voc deseja utilizar uma coluna discriminadora com a estrat gia tabela por subclasse voc poder combinar o uso de lt subclass gt lt join gt dessa maneira lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT_ID gt lt generator class native gt lt a gt lt discriminator column PAYMENT_TYPE type string gt lt property name amount column AMOUNT gt lt subclass name CreditCardPayment discriminator value CREDIT gt lt join table CREDIT_PAYMENT gt lt key column PAYMENT_ID gt lt property name creditCardType column CCTYPE gt lt join gt lt subclass gt lt subclass name CashPayment discriminator value CASH gt lt join table CASH PAYMENT
12. 171 Cap tulo 10 Trabalhando com ReplicationMode IGNORE ignore o objeto quando houver uma linha de banco de dados existente com o mesmo identificador ReplicationMode OVERWRITE subscreva uma linha de banco de dados existente com um mesmo identificador ReplicationMode EXCEPTION jogue uma exce o se houver uma linha de banco de dados existente com o mesmo identificador ReplicationMode LATEST VERSION subscreva a linha se seu n mero de vers o for anterior ao n mero de vers o do objeto caso contr rio ignore o objeto O caso de uso para este recurso inclui dados de reconcilia o em inst ncias de banco de dados diferentes atualizando informa es da configura o do sistema durante a atualiza o do produto retornando mudan as realizadas durante transa es n o ACID entre outras fun es 10 10 Limpando a Sess o De vez em quando a session ir executar as instru es SQL necess rias para sincronizar o estado de conex o JDBC com o estado de objetos mantidos na mem ria Este processo de flush ocorre por padr o nos seguintes pontos antes de algumas execu es de consultas a partir deorg hibernate Transaction commit a partir de session flush As instru es SQL s o editadas na seguinte ordem 1 todas as inser es de entidade na mesma ordem que os objetos correspondentes foram salvos usando Session save todas as
13. ccccececccceeeeeeeeeeeeeeeeaeeeeeeeaeeeeeeeaaeeeeeeneeeeeee 195 12 2 4 Tempo de espera de Transa o raias 196 12 3 Controle de concorr ncia otimista errar 197 12 3 1 Checagem de vers o da aplica o a 197 12 3 2 Sess o estendida e versionamento autom tico i 198 12 3 3 Objetos destacados e versionamento autom tico 199 12 3 4 Versionamento autom tico customizado 199 124 Bloqueio PESSIMISTA ssa sscsassiaassadia srs ace cidexnived daa din lada safoa asia ias sn gap onda na deter aie 200 12 5 Modos para liberar a conex o A K a aA arara anna 201 13 Interceptadores e Eventos een eraa ana eraa aaa 203 13 1 Interc ptadores is asia aces rnin eace cea e cede chasse detuned setden ence ceae sede hue ee ceeaek sees 203 13 2 Sistema de Eventos 3 2c2isesseedssnteoedas ea a Aaa ead deta fado Elas EM aa de 205 13 3 Seguran a declarativa do Hibernate rien a 206 14 Batch processing 2 2 2sasis cele ede possa gas eee een ee tee een 209 14 1 Inser o em lotes irc araaaa seaaaaaaneeeeeeeeeaea 209 14 2 Atualiza o em TOLOS nornen A saida a nada E exten aeeneoecey 210 14 3 A interface de Sess o sem Estado errar 210 14 4 Opera es no estilo DML eee rraraa aaa 211 15 HQL A Linguagem de Consultas do Hibernate
14. do some work tx commit 192 Usando JTA catch RuntimeException e if ts I null te rollback throw e or display error message finally SESS Glosel y Voc n o pode chamar flush da Session explicitamente A chamada ao commit dispara automaticamente a sincroniza o para a sess o dependendo do Se o 10 10 Limpando a Sess o Uma chamada ao close marca o fim de uma sess o A principal implica o do close que a conex o JDBC ser abandonada pela sess o Este c digo Java port vel e funciona em ambientes n o gerenciados e de JTA Uma solu o muito mais flex vel o gerenciamento de contexto sess o atual da constru o interna do Hibernate como descrito anteriormente Non managed environment idiom with getCurrentSession try factory getCurrentSession beginTransaction do some work factory getCurrentSession getTransaction commit catch RuntimeException e factory getCurrentSession getTransaction rollback throw e or display error message Voc muito provavelmente nunca ver estes fragmentos de c digo em uma aplica o regular as exce es fatais do sistema devem sempre ser pegas no topo Ou seja o c digo que executa chamadas do Hibernate na camada de persist ncia e o c digo que trata RuntimeException e geralmente pode somente limpar acima e na sa da est o em camadas diferentes O gerenciament
15. finally session close return blog public List listBlogsAndRecentItems throws HibernateException Session session _sessions openSession Transaction tx null List result null try tx session beginTransaction Query q session createQuery from Elog as Blog 4 inner join blog items as blogItem where blogItem datetime gt minDate i 309 Capitulo 23 Exemplo Aplicat Calendar cal Calendar getInstance cal roll Calendar MONTH false q setCalendar minDate cal result q list tx commit catch HibernateException he f us nuit ex rolls y throw he finally session close I return result 310 Exemplo Varios Mapeamentos Este cap tulo mostra algums mapeamentos de associa es mais complexos 24 1 Empregador Empregado O modelo a seguir do relacionamento entre Employer Employee utiliza uma entidade de classe atual Employment para representar a associa o Isto feito porque pode se ter mais do que um per odo de trabalho para as duas partes envolvidas Outros Componentes s o usados para modelar valores monet rios e os nomes do empregado Employee Employer as Employment id long startDate Date name String endDate Date getld long id long setldLid long getStanDated Date getNamed String setStanDatel stanDate Date setNamel name String getEndDated Date
16. lt property name foo column FO0O type string gt lt property name bar column BAR type integer gt lt many to one name baz class Baz column BAZ_ID gt lt dynamic component gt A sem ntica de um mapeamento lt dynamic component gt id ntica lt component gt A vantagem deste tipo de mapeamento a habilidade de determinar as propriedades atuais do bean no momento da implementa o apenas editando o documento de mapeamento A Manipula o em tempo de execu o do documento de mapeamento tamb m poss vel usando o parser DOM At melhor voc pode acessar e mudar o tempo de configura o do metamodelo do Hibernate atrav s do objeto configuration 149 150 Mapeamento de Heran a 9 1 As tr s estrat gias O Hibernate suporta as tr s estrat gias b sicas de mapeamento de heran a tabela por hierarquia de classes table per subclass tabela por classe concreta Al m disso o Hibernate suporta um quarto tipo de polimorfismo um pouco diferente polimorfismo impl cito poss vel usar diferentes estrat gias de mapeamento para diferentes ramifica es da mesma hierarquia de heran a Voc pode fazer uso do polimorfismo impl cito para alcan lo atrav s da hierarquia completa De qualquer forma o Hibernate n o suporta a mistura de mapeamentos lt subclass gt lt joined subclass gt lt union subclass gt dentro do mesmo elemento ra z lt class gt
17. o statusChanges como um List ao inv s de um Set a consulta teria sido muito mais simples de escrever select count payment status name from Payment as payment join payment currentStatus as status where payment status name lt gt PaymentStatus AWAITING APPROVAL or payment statusChanges maxIndex payment statusChanges user lt eurrentUser group by status name status sortOrder order by status sortOrder A pr xima consulta usa a fun o isNul1 do Servidor MS SQL para retornar todas as contas e pagamentos n o efetuados para a organiza o para aquele que o usu rio atual pertencer Traduz se para uma consulta SQL com tr s uni es inteiras uma uni o externa e uma subsele o nas tabelas ACCOUNT PAYMENT PAYMENT STATUS ACCOUNT TYPE ORGANIZATION ORG USER select account payment from Account as account left outer join account payments as payment where currentUser in elements account holder users and PaymentStatus UNPAID isNull payment currentStatus name PaymentStatus UNPAID order by account type sortOrder account accountNumber payment dueDate Para alguns bancos de dados precisaremos eliminar a subsele o correlacionada select account payment from Account as account join account holder users as user left outer join account payments as payment where currentUser user and PaymentStatus UNPAID isNull payment currentStatus name PaymentStatus UNPAID order by
18. previsto como um objeto de tempo de inicializa o a ser descartado quando um SessionFactory for criado 3 2 Obtendo uma SessionFactory Quando todos os mapeamentos forem analisados pelo org hibernate cfg Configuration a aplica o deve obter uma factory para as inst ncias do org hibernate Session O objetivo desta factory ser compartilhado por todas as threads da aplica o SessionFactory sessions cfg buildSessionFactory O Hibernate permite sua aplica o instanciar mais do que um org hibernate SessionFactory Isto ser til se voc estiver usando mais do que um banco de dados 3 3 Conex es JDBC Normalmente voc deseja que O org hibernate SessionFactory crie e fa a um um pool de conex es JDBC para voc Se voc seguir essa abordagem a abertura de um org hibernate Session ser t o simples quanto Session session sessions openSession open a new Session Assim que voc fizer algo que requeira o acesso ao banco de dados uma conex o JDBC ser obtida a partir do pool Para esse trabalho precisaremos passar algumas propriedades da conex o JDBC para o Hibernate Todos os nomes de propriedades Hibernate e sem nticas s o definidas na classe org hibernate cfg Environment Descreveremos agora as configura es mais importantes para a conex o JDBC O Hibernate obter conex es e efetuar o pool usando java sql DriverManager se voc determinar as seguintes propriedades 36 Conex
19. setEndDatel endDate Date getHourlyRated MonetoryAmount setHourlyRateirate Monetory mount getldd long setldtid long getEmployerd Employer setEmployertemp Employer getEmployeed Employee setEmployeetemp Employee id long firstName String taxfileNumber String initial char getNamed Name lastName String setNametname Name getFirstNamed String getidd long setFirstNamel firstName String setidLid long getinitiald char getTaxfileNumberd String setinitialinitial chan setTaxfileNumber taxfileNumberString getLastNamed String setLastNamel lastName String employee J monona amount BigDecimal getAmount BigDecimal setAmountLamount BigDecimal getCurrencyd Currency setCurrencyl currency Currency Abaixo segue o documento de um poss vel mapeamento lt hibernate mapping gt lt class name Employer table employers gt lt id name id gt lt generator class sequence gt lt param name sequence gt employer_id_seq lt param gt lt generator gt lt id gt lt property name name gt lt class gt lt class name Employment table employment_periods gt lt id name id gt lt generator class sequence gt lt param name sequence gt employment_id_seq lt param gt lt generator gt lt 1d gt lt property name startDate column start date gt lt property name endDate column end_dat
20. support this operation none geralmente este o padr o caso nenhum otimizador for especificado isto n o executar quaisquer otimiza es e alcan ar o banco de dados para cada e toda solicita o hilo aplica se ao algoritmo em volta dos valores restaurados do banco de dados Espera se que os valores a partir do banco de dados para este otimizador sejam sequenciais Os valores restaurados a partir da estrutura do banco de dados para este otimizador indica um n mero de grupo O increment size multiplicado pelo valor em mem ria para definir um grupo hi value pooled assim como o caso do hilo este otimizador tenta minimizar o n mero de tentativas no banco de dados No entanto n s simplesmente implementamos o valor de inicializa o para o pr ximo grupo na estrutura do banco de dados ao inv s do valor sequencial na combina o com um algoritmo de agrupamento em mem ria Neste caso O increment size refere se aos valores de entrada a partir do banco de dados 5 1 7 Composi o id lt composite id name propertyName class ClassName mapped true false access field property ClassName gt node element name lt key property name propertyName type typename column column name gt lt key many to one name propertyName class ClassName column column name gt lt composite id gt Uma tabela com uma chave composta pode ser mapeada com m ltiplas propriedades da classe como p
21. DomesticCat podem ser retornadas pelo 1oad ou iterate Cat cat Cat session load CatImpl class catid Iterator iter session createQuery from CatImpl as cat where cat name fritz iterate Cat fritz Cat iter next Nota list normalmente retorna proxies Relacionamentos s o tamb m inicializados de forma pregui osa Isso significa que voc precisa declarar qualquer propriedade como sendo do tipo cat e n o cat Impl 271 Capitulo 20 Aumentando o des Algumas opera es n o requerem inicializa o por proxy equals se a classe persistente n o sobrescrever equals hashCode se a classe persistente n o sobrescrever hashCode O m todo getter do identificador O Hibernate ir detectar classes persistentes que sobrescrevem equals OU hashCode Escolhendo 1azy no proxy ao inv s do padr o lazy proxy podemos evitar problemas associados com typecasting Por m iremos precisar de instrumenta o de bytecode em tempo de compila o e todas as opera es ir o resultar em inicializa es de proxy imediatas 20 1 4 Inicializando cole es e proxies Ser lan ada uma Lazy InitializationException se uma cole o n o inicializada ou proxy for acessado fora do escopo da session isto quando a entidade que cont m a cole o ou que possua a refer ncia ao proxy estiver no estado desanexado Algumas vezes precisamos garantir que o proxy ou cole o
22. Estas quest es est o endere adas nas seguintes se es 12 1 1 Unidade de trabalho First let s define a unit of work A unit of work is a design pattern described by Martin Fowler as maintaining a list of objects affected by a business transaction and coordinates the writing out 187 Cap tulo 12 Transa es e Con of changes and the resolution of concurrency problems PoEAA In other words its a series of operations we wish to carry out against the database together Basically it is a transaction though fulfilling a unit of work will often span multiple physical database transactions see Se o 12 1 2 Longas conversa es So really we are talking about a more abstract notion of a transaction The term business transaction is also sometimes used in lieu of unit of work Primeiro n o use o antipattern sess o por opera o isto n o abra e feche uma session para cada simples chamada ao banco de dados em uma nica thread Naturalmente o mesmo se aplica s transa es do banco de dados As chamadas ao banco de dados em uma aplica o s o feitas usando uma sequ ncia planejada elas s o agrupadas em unidades de trabalho at micas Veja que isso tamb m significa que realizar um auto commit depois de cada instru o SQL in til em uma aplica o esta modalidade ideal para o trabalho ad hoc do console do SQL O Hibernate impede ou espera que o servidor de aplica o impessa isso apl
23. SwarmCache yes yes JBoss Cache 1 x yes yes JBoss Cache 2 yes yes 20 3 Gerenciando os caches Quando passar um objeto para save update OU saveOrUpdate e quando recuperar um objeto usando um load get list iterate OU scroll este objeto ser adicionado ao cache interno da session Quando o flush for subsequentemente chamado o estado deste objeto ser sincronizado com o banco de dados Se voc n o desejar que esta sincroniza o aconte a ou se voc estiver processando uma grande quantidade de objetos e precisar gerenciar a mem ria de forma eficiente o m todo evict pode ser usado para remover o objeto de suas cole es de cache de primeiro n vel ScrollableResult cats sess createQuery from Cat as cat scroll a huge result set while cats next Cat cat Cat cats get 0 doSomethingWithACat cat sess evict cat A session tamb m oferece um m todocontains para determinar se uma inst ncia pertence ao cache de sess o Para despejar completamente todos os objetos do cache de Sess o chame Session clear Para o cache de segundo n vel existem m todos definidos na SessionFactory para despejar o estado de cache de uma inst ncia classe inteira inst ncia de cole o ou papel de cole o inteiro sessionFactory evict Cat class catId evict a particular Cat sessionFactory evict Cat class evict all Cats sessionFactory evictCollection Cat kitt
24. a chave natural em vez de uma chave substituta Este o comportamento padr o se voc n o especificar um elemento lt generator gt A escolha do gerador assigned faz com que o Hibernate utilize unsaved value undefined Isto for a o Hibernate ir at o banco de dados para determinar se uma inst ncia est transiente ou desacoplada a n o ser que haja uma vers o ou uma propriedade de timestamp ou que voc definia Interceptor isUnsaved 5 1 4 6 Chaves prim rias geradas por triggers O Hibernate n o gera DDL com triggers apenas para sistemas legados lt id name id type long column person id gt lt generator class select gt lt param name key gt socialSecurityNumber lt param gt lt generator gt ae gt No exemplo acima h uma nica propriedade com valor nomeada socialSecurityNumber definida pela classe uma chave natural e uma chave substituta nomeada person ia cujo valor gerado por um trigger 5 1 5 Aprimora o dos geradores de identificador Iniciando com a libera o 3 2 3 existem dois novos geradores que representam uma reavalia o de dois diferentes aspectos da gera o identificadora O primeiro aspecto a portabilidade do banco de dados o segundo a otimiza o A otimiza o significa que voc n o precisa questionar o banco de dados a cada solicita o para um novo valor de identificador Estes dois geradores possuem por inten o substituir alguns dos geradores nomeados
25. cl usula tipicamente nomeada STARTS WITH e increment_size opcional padr o para 1 o valor pelo qual as chamadas para a sequ ncia tabela devem diferenciar se Nos termos da cria o da sequ ncia isto an logo cl usula tipicamente nomeada INCREMENT BY force table use opcional padr o para false devemos for ar o uso de uma tabela como uma estrutura de refor o mesmo que o dialeto possa suportar a sequ ncia value column opcional padr o para next val apenas relevante para estruturas de tabela este o nome da coluna onde na tabela que usado para manter o valor optimizer optional defaults to none See Se o 5 1 6 Otimiza o do Gerador de Identifica o O segundo destes novos geradores O org hibernate id enhanced TableGenerator que primeiramente uma substitui o para o gerador table mesmo que isto funcione muito mais como um org hibernate id MultipleHiLoPerTableGenerator O segundo como uma reimplementa o do org hibernate id MultipleHiLoPerTableGenerator que utiliza a no o dos otimizadores pugl veis Basicamente este gerador define uma tabela capacitada de manter um n mero de valores de incremento simult neo pelo uso m ltiplo de filas de chaves distintas Este gerador possui um n mero de par metros de configura o table name opcional padr o para hibernate sequences O nome da tabela a ser usado e value column name Opcional padr o para n
26. gt Capitulo 1 Tutorial ad lt class gt lt hibernate mapping gt O elemento ia a declara o de uma propriedade do identificador O atributo do mapeamento name id declara que o nome da propriedade JavaBeans e informa o Hibernate a utilizar os m todos getId and setId para acessar a propriedade A atributo da coluna informa o Hibernate qual coluna da tabela EvENTS mant m o valor de chave prim ria O elemento generator aninhado especifica a estrat gia da gera o do identificador como os valores do identificador s o gerados Neste caso n s escolhemos native do qual oferece um n vel de portabilidade dependendo no dialeto do banco de dados configurado O Hibernate suporta o banco de dados gerado globalmente nico assim como a aplica o determinada identificadores A gera o do valor do identificador tamb m um dos muitos pontos de extens o do Hibernate e voc pode realizar o plugin na sua pr pria estrat gia Dica Q native is no longer consider the best strategy in terms of portability for further discussion see 3 el Finalmente incluiremos as declara es para as propriedades persistentes da classe no arquivo mapeado Por padrao nenhuma das propriedades da classe considerada persistente lt hibernate mapping package org hibernate tutorial domain gt lt class name Event table EVENTS gt lt id name id column EVENT ID gt lt generator class nativ
27. gt lt DOCTYPE hibernate mapping PUBLIC 95 Capitulo 5 Mapeamento O R Basico _ Hibernate Hibernate Mapping DTD EN http hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt class name Cat table CATS gt lt id name id column uid type long gt lt generator class hilo gt lt id gt lt property name birthdate type date gt lt property name color not null true gt lt property name sex not null true gt lt property name weight gt lt many to one name mate gt lt set name kittens gt lt key column MOTHER gt lt one to many class Cat gt lt set gt lt joined subclass name DomesticCat table DOMESTIC_CATS gt lt key column CAT gt lt property name name type string gt lt joined subclass gt lt class gt lt class name eg Dog gt lt li mapping for Dog could go here gt lt class gt lt hibernate mapping gt For information about inheritance mappings see Cap tulo 9 Mapeamento de Heran a 5 1 19 Subclasse de Uni o Uma terceira op o mapear apenas as classes concretas de uma hierarquia de heran as para tabelas Isto chamado estrat gia table per concrete class Cada tabela define todos os estados persistentes da classe incluindo estados herdados No Hibernate n o absolutamente necess rio mapear explicitamente como hierarquia de heran as Voc pode simplesmente
28. in the first session Cat cat Cat firstSession load Cat class catId j Cat potentialMate new Cat firstSession save potentialMate in a higher layer of the application cat setMate potentialMate later in a new session secondSession update cat update cat secondSession update mate update mate Se o cat com identificador catid j tivesse sido carregado pelasegundasess o quando a aplica o tentou re acopl lo teria surgido uma exce o Use update se voc tiver certeza de que a sess o j n o cont m uma inst ncia persistente com o mesmo identificador e merge se voc quiser mesclar suas modifica es a qualquer momento sem considerar o estado da sess o Em outras palavras update geralmente o primeiro m todo que voc chama em uma nova sess o assegurando que o re acoplamento de suas inst ncias seja a primeira opera o executada The application should individually update detached instances that are reachable from the given detached instance only if it wants their state to be updated This can be automated using transitive persistence See Se o 10 11 Persist ncia Transitiva for more information O m todo 10ck tamb m permite que um aplicativo re associe um objeto com uma nova sess o No entanto a inst ncia desanexada n o pode ser modificada just reassociate sess lock fritz LockMode NONE do a version check then reassociate sess lock izi Lo
29. item setBlog blog item setDatetime Calendar getInstance blog getItems add item Session session _sessions openSession Transaction tx null try tx session beginTransaction session update blog Ex commit catch HibernateException he af Exi noll tx collback throw he finally session close return item public BlogItem createBlogItem Long blogid String title String text throws HibernateException BlogItem item new BlogItem item setTitle title item setText text item setDatetime Calendar getInstance Session session _sessions openSession Transaction tx null try tx session beginTransaction Blog blog Blog session load Blog class blogid item setBlog blog blog getItems add item exe Commenter iy catch HibernateException he df txl nulil tx rollback throw he 307 Cap tulo 23 Exemplo Aplicat finally session close return item public void updateBlogItem BlogItem item String text throws HibernateException item setText text Session session _sessions openSession Transaction tx null try tx session beginTransaction session update item Ex commit catch HibernateException he 2E exl nulil ex rollback throw he Ji finally session close public void updateBlogItem Long itemid String text throws HibernateException
30. lt properties name logicalName insert true false update true false optimistic lock true false 09000060 unique true false SPEOpemrEy eo i lt many to one assaz gt lt properties gt name O nome l gico do agrupamento Isto n o o nome atual de propriedade insert As colunas mapeadas aparecem nos SQL de INSERTs update As colunas mapeadas aparecem nos SQL de UPDATEs 9o00 optimistic lock opcional padr o para true Especifica que atualiza es para estes componentes requerem ou n o aquisi o de um bloqueio otimista Em outras palavras determina se uma vers o de incremento deve ocorrer quando estas propriedades estiverem sujas 6 unique opcional valor padr o false Especifica que existe uma unique restri o em todas as colunas mapeadas do componente Por exemplo se temos o seguinte mapeamento de lt properties gt lt class name Person gt lt id name personNumber gt lt properties name name unique true update false gt lt property name firstName gt lt property name initial gt lt property name lastName gt lt properties gt 93 Capitulo 5 Mapeamento O R Basico lt class gt Ent o podemos ter uma associa o de dados legados que referem a esta chave exclusiva da tabela Person ao inv s de se referirem a chave prim ria lt many to one name person class Person property ref name gt lt column name fir
31. might return stale data sess find from Cat as cat left outer join cat kittens kitten change to izi is not flushed tz commit flush occurs sess closel 7 During flush an exception might occur e g if a DML operation violates a constraint Since handling exceptions involves some understanding of Hibernate s transactional behavior we discuss it in Cap tulo 12 Transa es e Concorr ncia 10 11 Persist ncia Transitiva um tanto inc modo salvar deletar ou reanexar objetos individuais especialmente ao lidar com um grafo de objetos associados Um caso comum um relacionamento pai filho Considere o seguinte exemplo Se os filhos em um relacionamento pai filho fossem do tipo valor ex cole o de endere os ou strings seus ciclos de vida dependeriam do pai e nenhuma a o seria requerida para cascateamento de mudan a de estado Quando o pai salvo os objetos filho de valor s o salvos tamb m quando o pai deletado os filhos tamb m ser o deletados etc Isto funciona at para opera es como remo o de filho da cole o O Hibernate ir detectar isto e como objetos de valor n o podem ter refer ncias compartilhadas ir deletar o filho do banco de dados Agora considere o mesmo cen rio com objeto pai e filho sendo entidades e n o de valores ex categorias e tens ou cats pai e filho As entidades possuem seus pr prios ciclos de vida suportam refer ncias compartilhadas portanto
32. o para a inst ncia atual aquela com ffectiveEndDate nulo usando lt many to one name currentAccount Info property ref currentAccountKey class AccountInfo gt lt column name accountNumber gt lt formula gt 1 lt formula gt lt many to one gt Em um exemplo mais complexo imagine que a associa o entre Employee Organization mantida em uma tabela Employment cheia de dados hist ricos do trabalho Ent o a associa o do funcion rio mais recentemente e empregado aquele com a mais recente startDate deve ser mapeado desta maneira lt join gt lt key column employeelId gt lt subselect gt select employeeId orgId from Employment s group by orgId having startDate max startDate lt subselect gt lt many to one name mostRecentEmployer class Organization 141 Capitulo 7 Mapeamento de ass column orgId gt lt join gt Esta funcionalidade permite um grau de criatividade e flexibilidade mas geralmente mais pratico tratar estes tipos de casos usando uma pesquisa HQL ou uma pesquisa por crit rio 142 Mapeamento de Componentes A no o de componente re utilizada em v rios contextos diferentes para prop sitos diferentes pelo Hibernate 8 1 Objetos dependentes Um componente um objeto contido que persistido como um tipo de valor n o uma refer ncia de entidade O termo componente refere se no o de composi o da or
33. poss vel usar junto s estrat gias uma tabela por hierarquia e tabela por subclasse abaixo do mesmo elemento lt class gt combinando os elementos lt subclass gt e lt join gt veja abaixo poss vel definir mapeamentos subclass union subclass joined subclass em documentos de mapeamento separados diretamente abaixo de hibernate mapping Isso permite que voc estenda uma hierarquia de classes apenas adicionando um novo arquivo de mapeamento Voc deve especificar uma fun o extends no mapeamento da subclasse nomeando uma superclasse previamente mapeada Anteriormente esta caracter stica fazia o ordenamento dos documentos de mapeamento importantes Desde o Hibernate3 o ordenamento dos arquivos de mapeamento n o importa quando usamos a palavra chave extends O ordenamento dentro de um arquivo de mapeamento simples ainda necessita ser definido como superclasse antes de subclasse lt hibernate mapping gt lt subclass name DomesticCat extends Cat discriminator value D gt lt property name name type string gt lt subclass gt lt hibernate mapping gt 9 1 1 Tabela por hierarquia de classes Vamos supor que temos uma interface Payment com sua implementa o creditCardPayment CashPayment ChequePayment O mapeamento da tabela por hierarquia seria parecido com 151 Capitulo 9 Mapeamento de Her lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT
34. quase todas as associa es devem navegar nas duas dire es em consultas 325 326 Consideracoes da Portabilidade do Banco de Dados 26 1 Fundamentos da Portabilidade Um dos pontos de venda do Hibernate e realmente Mapeamento do Objeto Relacional como um conjunto a no o da portabilidade do banco de dados Isto pode significar um usu rio de TI interno migrando a partir de um fornecedor de banco de dados a outro ou isto pode significar que um framework ou aplicativo implement vel consumindo o Hibernate para produtos de banco de dados m ltiplos de destina o simultaneamente pelos usu rios Independente do cen rio exato a id ia b sica que voc queira que o Hibernate o ajude a rodar em refer ncia a qualquer n mero de banco de dados sem as altera es a seu c digo e preferencialmente sem quaisquer altera es ao metadados de mapeamento 26 2 Dialeto A primeira linha de portabilidade para o Hibernate o dialeto que trata se de uma especializa o de um contrato org hibernate dialect Dialect Um dialeto encapsula todas as diferen as em como o Hibernate deve comunicar se com um banco de dados particular para completar algumas tarefas como obter um valor de sequ ncia ou estruturar uma consulta SELECT O Hibernate vincula uma variedade de dialetos para muitos dos bancos de dados mais populares Se voc achar que seu banco de dados particular n o est seguindo os mesmos n o ser dif cil escrever
35. 198 Objetos destacados e versionamento automatico Nota Note que vers es mais atuais de Hibernate requerem a desconex o e reconex o expl citas de uma Session Estes m todos s o desatualizados pois o in cio e t rmino de uma transa o t m o mesmo efeito Note tamb m que voc deve manter a Session desconectada fechada para a camada de persist ncia Ou seja use um bean de sess o com estado EJB para prender a Session em um ambiente de tr s camadas N o transfira camada web ou at serializ lo para uma camada separada para armazena lo no HttpSession O modelo da sess o estendida ou sess o por conversa o mais dif cil de implementar com gerenciamento autom tico de sess o atual Voc precisa fornecer sua pr pria implementa o do CurrentSessionContext para isto Veja o Hibernate Wiki para exemplos 12 3 3 Objetos destacados e versionamento autom tico Cada intera o com o armazenamento persistente ocorre em uma session nova Entretanto as mesmas inst ncias persistentes s o reusadas para cada intera o com o banco de dados A aplica o manipula o estado das inst ncias desatachadas originalmente carregadas em uma outra Session e as reata ent o usando Session update Session saveorUpdate OU Session merge foo is an instance loaded by a previous Session foo setProperty bar session factory opensSession Transaction t session beginTransaction session saveOrUp
36. 40 Propriedades opcionais de configura o Nome da Propriedade hibernate jdbc factory class hibernate jdbc use scrollable resultset hibernate jdbc use streams for binary hibernate jdbc use get generated keys hibernate connection provider class Prop sito for automatically versioned data Defaults to false e g true false Escolher um org hibernate jdbc Batcher Muitas aplica es n o ir o precisar desta propriedade de configura o exemplo classname of BatcherFactory Habilita o uso dos resultados de ajustes rol veis do JDBC2 pelo Hibernate Essa propriedade somente necess ria quando se usa Conex es JDBC providas pelo usu rio Do contr rio o Hibernate os os metadados da conex o e g true false Utilize fluxos para escrever ler tipos binary ou tipos serializable para do JDBC system level property e g true false Possibilita 0 Uso do PreparedStatement getGeneratedKeys JDBC3 para recuperar chaves geradas de forma nativa depois da inser o Requer driver JDBC3 e JRE1 4 ajuste para falso se seu driver tiver problemas com gerador de indentificadores Hibernate Por padr o tente determinar o driver capaz de usar metadados da conex o exemplo true false O nome da classe de um org hibernate connection ConnectionProvider do qual prover conex es JDBC para o Hibernate exemploclassname of ConnectionProvider hibernate connection isolation Det
37. A Cascata geralmente til para associa es lt one to one gt lt one to many gt Se o tempo de vida do objeto filho estiver vinculado ao tempo de vida do objeto pai fa a disto um objeto de ciclo de vida especificando um cascade all delete orphan Caso contr rio voc pode n o precisar realizar a cascata Mas se voc achar que ir trabalhar com o pai e filho juntos com frequ ncia na mesma transa o e quiser salvar voc mesmo considere o uso do cascata persistir mesclar salvar atualizar Ao mapear uma associa o tanto uma associa o de valor nico como uma cole o com casca de all a associa o demarcada como um relacionamento de estilo parent child onde salvar atualizar deletar do pai resulta em salvar atualizar deletar do s filho s Al m disso uma mera refer ncia ao filho de um pai persistente ir resultar em salvar atualizar o filho Entretanto esta met fora est incompleta Um filho que n o referenciado por seu pai n o deletado automaticamente exceto no caso de uma associa o lt one to many gt mapeada com casca de delete orphan A sem ntica exata de opera es em cascata para o relacionamento pai filho s o como as que se seguem Se um pai passado para persist todos os filhos s o passados para persist Se um pai passado para merge todos os filhos s o passados para merge e Se um pai for passado para save update OU saveorUpdat
38. As vezes deletar elementos de cole o um por um pode ser extremamente ineficiente O Hibernate n o completamente burro portanto ele sabe que n o deve fazer isso no caso de uma cole o que tenha sido esvaziada recentemente se voc chamou list clear por exemplo Neste caso o Hibernate ir editar um nico DELETE Vamos supor que tenha adicionado um elemento nico uma cole o de tamanho vinte e ent o remove dois elementos O Hibernate ir editar uma instru o INSERT e duas instru es DELETE a n o ser que a cole o seja uma bag Isto certamente desej vel No entanto suponha que removamos dezoito elementos deixando dois e ent o adicionando tr s novos elementos Existem duas formas poss veis de se proceder delete dezoito linhas uma por uma e ent o insira tr s linhas remova toda a cole o em um SQL DELE H E e insira todos os cinco elementos atuais um por um O Hibernate n o sabe que a segunda op o provavelmente mais r pida neste caso O Hibernate n o deseha saber a op o uma vez que tal comportamento deve confundir os triggers do banco de dados etc Felizmente voc pode for ar este comportamento ou seja uma segunda estrat gia a qualquer momento descartando ou seja desreferenciando a cole o original e retornando uma cole o recentemente instanciada com todos os elementos atuais claro que deletar somente uma vez
39. Date serialNumber String getldd long getldd long setQuantity quantity int getidd long setldtid long setidLid long getProducto Product setidLid long getNamed String getLineltemsd List setProductiproduct Product getSerialNumberd String setName name String setLineltemsilineltems List setSerialNumbert serialNumber String getOrdersd Set getCustomerd Customer customer orders setOrderstorders Set setCustomericustomer Customen getDated Date setDatel date Date O documento de mapeamento ser parecido com lt hibernate mapping gt lt class name Customer table customers gt lt id name id gt lt generator class native gt ais lt property name name gt lt set name orders inverse true gt lt key column customer_id gt lt one to many class Order gt lt set gt lt class gt 315 Capitulo 24 Exemplo Varios lt class name Order table orders gt lt id name id gt lt generator class native gt lt id gt lt property name date gt lt many to one name customer column customer id gt lt list name lineItems table line items gt lt key column order_id gt lt list index column line number gt lt composite element class LineItem gt lt property name quantity gt lt many to one name product column product_id gt lt composite element gt Us E lt class gt l
40. Hibernate allows you to customize the SQL it uses to read and write the values of columns mapped to simple properties For example if your database provides a set of data encryption functions you can invoke them for individual columns like this lt property name creditCardNumber gt lt column name credit card num read decrypt credit card num write encrypt gt lt property gt O Hibernate aplica automaticamente as express es personalizadas a todo instante que a propriedade referenciada numa consulta Esta funcionalidade parecida a uma formula de propriedade derivada com duas diferen as Esta propriedade suportada por uma ou mais colunas que s o exportadas como parte da gera o do esquema autom tico Esta propriedade de grava o leitura e n o de leitura apenas Caso a express o writeseja especificada dever conter um para o valor 5 8 Objetos de Banco de Dados Auxiliares Permite o uso dos comandos CREATE e DROP para criar e remover os objetos de banco de dados arbitr rios Juntamente s ferramentas de evolu o do esquema do Hibernate eles possuem a habilidade de definir completamente um esquema de usu rio dentro dos arquivos de mapeamento do Hibernate Embora criado especificamente para criar e remover algo como trigger ou procedimento armazenado qualquer comando SQL que pode rodar atrav s de um m todo java sgl Statement execute v lido Existem dois m dulos essenciais p
41. N s agora criaremos um EventManagerServlet Esse servlet lista todos os eventos salvos no banco de dados e cria um formul rio HTML para entrada de novos eventos 1 3 1 Criando um servlet b sico N s deveremos criar o nosso servket de processamento b sico primeiramente Uma vez que o servlet manuseia somente requisi es cer do HTTP o m todo que iremos implementar doGet package org hibernate tutorial web Imports public class EventManagerServlet extends HttpServlet protected void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException SimpleDateFormat dateFormatter new SimpleDateFormat dd MM yyyy try Begin unit of work HibernateUtil getSessionFactory getCurrentSession beginTransaction Process request and render page End unit of work HibernateUtil getSessionFactory getCurrentSession getTransaction commit catch Exception ex HibernateUtil getSessionFactory getCurrentSession getTransaction rollback 22 Processando e renderizando if ServletException class isInstance ex throw ServletException ex else throw new ServletException ex Salve esse servlet como src main java org hibernate tutorial web EventManagerServlet java O modelo que estamos aplicando neste c digo chamado session per request Quando uma solicita o chega ao servlet uma nova s
42. Neste caso n s n o precisamos chamar O addEntity lt sql query name persons gt lt return alias person class eg Person gt SELECT person NAME AS person name person AGE AS person age person SEX AS person sex FROM PERSON person WHERE person NAME LIKE namePattern lt sql query gt List people sess getNamedQuery persons setString namePattern namePattern setMaxResults 50 TESO Os elementos lt return join gt lt load collection gt s o usados para unir associa es e definir consultas que inicializam cole es lt sql query name personsWith gt lt return alias person class eg Person gt lt return join alias address property person mailingAddress gt SELECT person NAME AS person name person AGE AS person age person SEX AS person sex address STREET AS address street 248 Consultas SQL Nomeadas address CITY AS address city address STATE AS address state address ZIP AS address zip FROM PERSON person JOIN ADDRESS address ON person ID address PERSON_ID AND address TYPE MAILING WHERE person NAME LIKE namePattern lt sql query gt Uma consulta SQL nomeada pode devolver um valor escalar Voc deve declarar um alias de coluna e um tipo Hibernate usando o elemento lt return scalar gt lt sql query name mySqlQuery gt lt return scalar column name type string gt lt return scalar column age type long gt SELECT p NAME AS
43. Read only entities Criteria setReadOnly true Criteria setReadOnly true must be called before Criteria list Criteria uniqueResult Of Criteria scroll Entities and proxies that exist in the session before being returned by an HQL query or criteria are not affected Uninitialized persistent collections returned by the query are not affected Later when the collection is initialized entities loaded into the session will be read only if Session isDefaultReadOnly returns true Using Query setReadOnly true Of Criteria setReadOnly true works well when a single HQL query or criteria loads all the entities and intializes all the proxies and collections that the application needs to be read only When it is not possible to load and initialize all necessary entities in a single query or criteria you can temporarily change the session default to load entities as read only before the query is executed Then you can explicitly initialize proxies and collections before restoring the session default Session session factory openSession Transaction tx session beginTransaction setDefaultReadOnly true Contract contract Contract session createQuery from Contract where customerName Sherman uniqueResult Hibernate initialize contract getPlan Hibernate initialize contract getVariations Hibernate initialize contract getNotes setDefaultReadOnly false ta conmit i
44. ausente assume se que o mapeamento para entidades n o POJO table opcional padr o para nomes de classes n o qualificadas O nome da sua tabela do banco de dados discriminator value opcional padr o para o nome da classe Um valor que distingue subclasses individuais usadas para o comportamento polim rfico Valores aceitos incluem null not null mutable opcional valor padrao true Especifica quais instancias da classe sao ou nao mutaveis schema opcional Sobrep e o nome do esquema especificado pelo elemento ra z lt hibernate mapping gt catalog opcional Sobrep e o nome do cat logo especificado pelo elemento ra z lt hibernate mapping gt proxy opcional Especifica uma interface para ser utilizada pelos proxies de inicializa o lazy Voc pode especificar o nome da pr pria classe dynamic update opcional valor padr o false Especifica que o SQL de upDATE deve ser gerado em tempo de execu o e conter apenas aquelas colunas cujos valores foram alterados dynamic insert opcional valor padr o falso Especifica que o SQL de INSERT deve ser gerado em tempo de execu o e conter apenas aquelas colunas cujos valores n o est o nulos select before update opcional valor padr o false Especifica que o Hibernate nunca deve executar um SQL de UPDATE a n o ser que seja certo que um objeto est atualmente modificado Em certos casos na verdade apenas quando um objeto transiente f
45. considerado pelas propriedades e cole es que n o especificarem uma fun o cascade A fun o auto import nos deixa utilizar nomes de classes n o qualificados na linguagem de consulta por padr o lt hibernate mapping schema schemaName catalog catalogName default cascade cascade style default access field property ClassName default lazy true false auto import true false 90000006 package package name 69 Capitulo 5 Mapeamento O R Basico eoo 8 schema opcional O nome do esquema do banco de dados catalog opcional O nome do cat logo do banco de dados default cascade opcional o padr o none Um estilo cascata padr o default access opcional o padr o property A estrat gia que o Hibernate deve utilizar para acessar todas as propridades Pode ser uma implementa o personalizada de PropertyAccessor default lazy Opcional o padr o true O valor padr o para atributos 1azy n o especificados da classe e dos mapeamentos de cole es auto import opcional o padr o true Especifica se podemos usar nomes de classes n o qualificados das classes deste mapeamento na linguagem de consulta package opcional Especifica um prefixo do pacote a ser considerado para nomes de classes n o qualificadas no documento de mapeamento Se voc tem duas classes persistentes com o mesmo nome n o qualificadas voc deve ajustar auto import false C
46. de dados Por exemplo para um modo POJO o tuplizador correspondente sabe como criar um 61 Capitulo 4 Classes Persistentes POJO atrav s de seu construtor Al m disso ele sabe como acessar propriedades de POJO usando assessores de propriedades definidas Existem dois tipos de alto nivel de Tuplizadores representados pelas interfaces org hibernate tuple entity EntityTuplizer e org hibernate tuple component ComponentTuplizer Os EntityTuplizers sao respons veis pelo gerenciamento dos contratos mencionados acima em rela o s entidades enquanto OS component Tuplizers realizam o mesmo para os componentes Os usu rios podem tamb m plugar seu pr prio tuplizador Talvez voc queira usar uma implementa o java util Map ao inv s de uma java util HashMap enquanto estiver no modo de entidade mapa din mico ou talvez voc precise definir uma estrat gia de gera o de proxy diferente ao inv s de uma utilizada por padr o Ambas seriam alcan adas definindo uma implementa o de tuplizador personalizada As defini es do tuplizador est o anexadas entidade ou ao mapeamento de componente que tiverem que gerenciar Retornando ao exemplo da entidade do nosso cliente lt hibernate mapping gt lt class entity name Customer gt F Override the dynamic map entity mode tuplizer for the customer entity gt lt tuplizer entity mode dynamic map class CustomMapTuplizerImpl gt lt id name id
47. element Gattribute lt generator class generatorClass gt lt itd name opcional O nome da propriedade do identificador type opcional um nome que indica o tipo de Hibernate column opcional padr o para o nome da propridade O nome coluna chave prim ria unsaved value opcional padr o para um valor sens vel O valor da propriedade de identifica o que indica que a inst ncia foi novamente instanciada unsaved diferenciando de inst ncias desconectadas que foram salvas ou carregadas em uma sess o anterior access opcional padr o para property A estrat gia que o Hiberante deve utilizar para acessar o valor da propriedade 9o00 Se a fun o name n o for declarada considera se que a classe n o tem a propriedade de identifica o A fun o unsaved value n o mais necess ria no Hibernate 3 H uma declara o alternativa lt composite id gt que permite o acesso dados legados com chaves compostas N s realmente desencorajamos o uso deste para qualquer outra fun o 74 5 1 4 1 Gerador O elemento filho opcional lt generator gt nomeia uma classe Java usada para gerar identificadores nicos para inst ncias de uma classe persistente Se algum par metro requerido para configurar ou inicializar a inst ncia geradora eles s o passados utilizando o elemento lt param gt lt id name id type long column cat id gt lt generator class org hibernate id TableHiLo
48. es JDBC Tabela 3 1 Propriedades JDBC Hibernate Nome da Propriedade Prop sito hibernate connection driver class JDBC driver class hibernate connection ur JDBC URL hibernate connection username database user hibernate connection password database user password hibernate connection pool size maximum number of pooled connections No entanto o algoritmo de pool de conex es do pr prio Hibernate um tanto rudimentar A inten o dele ajudar a iniciar e n o para ser usado em um sistema de produ o ou at para testar o desempenho Voc deve utilizar um pool de terceiros para conseguir um melhor desempenho e estabilidade Apenas substitua a propriedade hibernate connection pool size pela configura o espec fica do pool de conex es Isto ir desligar o pool interno do Hibernate Por exemplo voc pode gostar de usar C3P0 O C3P0 um pool conex o JDBC de c digo aberto distribu do junto com Hibernate no diret rio lib O Hibernate usar o pr prio org nibernate connection C3P0ConnectionProvider para o pool de conex o se voc configurar a propriedade hibernate c3p0 Se voc gostar de usar Proxool consulte o pacote hibernate properties e o web site do Hibernate para mais informa es Este um exemplo de arquivo hibernate properties para c3p0 hibernate connection driver class org postgresql Driver hibernate connection url jdbc postgresql localhost mydatabase hibernate connection username my
49. gt lt inverse end gt lt bag name categories table CATEGORY_ITEM inverse true gt lt key column ITEM ID gt lt many to many class Category column CATEGORY ID gt lt bag gt lt class gt As mudan as feitas somente de um lado da associa o n o s o persistidas Isto significa que o Hibernate tem duas representa es na mem ria para cada associa o bidirecional uma associa o de A para B e uma outra associa o de B para A Isto mais f cil de compreender se voc pensa sobre o modelo de objetos do Java e como criamos um relacionamento muitos para muitos em Java category getItems add item The category now knows about the relationship item getCategories add category The item now knows about the relationship session persist item The relationship won t be saved session persist category The relationship will be saved A outra ponta usada para salvar a representa o em mem ria base de dados Voc pode definir uma associa o bidirecional um para muitos atrav s de uma associa o um para muitos indicando as mesmas colunas da tabela que associa o muitos para um e declarando a propriedade inverse true lt class name Parent gt lt id name id column parent_id gt lt set name children inverse true gt lt key column parent_id gt lt one to many class Child gt lt set gt lt class gt lt class name Child gt
50. gt lt synchronize table Product gt lt composite id name id class Order Id gt lt key property name customerid length 10 gt lt key property name orderNumber gt lt composite id gt lt property name orderDate type calendar date not null true gt lt property name total gt lt formula gt select sum li quantity p price from LineItem li Product p where li productId p productId and li customerId customerId and li orderNumber orderNumber lt formula gt lt property gt lt many to one name customer column customerIid insert false update false not null true gt lt bag name lineItems fetch join inverse true cascade save update gt lt key gt 318 Exemplo de chave composta lt column name customerId gt lt column name orderNumber gt lt key gt lt one to many class LineItem gt lt bag gt lt class gt lt class name LineItem gt lt composite id name id class LineItem Id gt lt key property name customeriId length 10 gt lt key property name orderNumber gt lt key property name productId length 10 gt lt composite id gt lt property name quantity gt lt many to one name order insert false update false not null true gt lt column name customerId gt lt column name orderNumber gt lt many to one gt lt many to one name product insert false update false
51. hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt class name Blog table BLOGS gt lt id name id column BLOG_ID gt lt generator class native gt lt id gt lt property name name column NAME not null true 304 Mapeamentos Hibernate unique true gt lt bag name items inverse true order by DATE TIME cascade all gt lt key column BLOG_ID gt lt one to many class BlogItem gt lt bag gt lt class gt lt hibernate mapping lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN http hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt class name BlogItem table BLOG ITEMS dynamic update true gt lt id name id column BLOG_ITEM_ID gt lt generator class native gt lt id gt lt property name title column TITLE not null true gt lt property name text column TEXT not null true gt lt property name datetime column DATE_TIME not null true gt lt many to one name blog column BLOG ID not null true gt 305 Capitulo 23 Exemplo Aplicat lt class gt lt hibernate mapping gt 23 3 C digo Hibernate A seguinte classe demonstra algumas atividades que podemos realizar com estas classes usand
52. inicializado antes de fechar a Session Claro que sempre podemos for ar a inicializa o chamando cat getsex OU cat getKittens size por exemplo Mas isto parece confuso para quem l o c digo e n o conveniente para c digos gen ricos Os m todos est ticos Hibernate initialize Hibernate isInitialized favorecem a aplica o para trabalhar com cole es ou proxies inicializados de forma pregui osa O Hibernate initialize cat ir for ar a inicializa o de um proxy cat contanto que a session esteja ainda aberta Hibernate initialize cat getKittens tem um efeito similar para a cole o de kittens Uma outra op o manter a session aberta at que todas as cole es e os proxies necess rios sejam carregados Em algumas arquiteturas de aplica es particularmente onde o c digo que acessa os dados usando Hibernate e o c digo que os usa se encontram em diferentes camadas da aplica o ou diferentes processos f sicos ser um problema garantir que a session esteja aberta quando uma cole o for inicializada Existem dois caminhos b sicos para lidar com esse problema Em uma aplica es web um filtro serviet pode ser usado para fechar a session somente no final da requisi o do usu rio quando a renderiza o da view estiver completa o modelo Abrir Sess o em View Claro que isto demanda uma exatid o no manuseio de exce es na infraestrutura de sua aplica o extremamente impor
53. lt many to many class User gt lt column name userName gt lt formula gt org lt formula gt lt many to many gt lt set gt lt class gt 24 4 4 Conte do baseado em discrimina o lt class name Person discriminator value P gt lt id name id column person id unsaved value 0 gt lt generator class native gt lt id gt 320 Associa es em chaves alternativas lt discriminator type character gt lt formula gt case when title is not null then E when salesperson is not null then Prsa Tp end lt formula gt lt discriminator gt lt property name name not null true length 80 gt lt property name sex not null true update false gt lt component name address gt lt property name address gt lt property name zip gt lt property name country gt lt component gt lt subclass name Employee discriminator value E gt lt property name title length 20 gt lt property name salary gt lt many to one name manager gt lt subclass gt lt subclass name Customer discriminator value C gt lt property name comments gt lt many to one name salesperson gt lt subclass gt lt class lt class name Person gt lt id name id gt lt generator class hilo gt lt id gt lt property name name length 100 gt lt one to one name address property ref person ell 24 4
54. mapear cada classe com uma declara o lt class gt separada Por m se voc deseja usar associa es polim rficas por exemplo uma associa o para a superclasse de sua hierarquia voc precisa usar o mapeamento lt union subclass gt Por exemplo lt union subclass name ClassName table tablename proxy ProxyInterface 90009 lazy true false dynamic update true false dynamic insert true false schema schema catalog catalog 96 Uniao extends SuperclassName abstract true fFalser persister ClassName subselect SQL expression entity name EntityName node element name gt lt property gt lt union subclass name O nome de classe completamente qualificada da subclasse table O nome da tabela da subclasse proxy opcional Especifica a classe ou interface que usar os proxies de inicializa o lazy 9o00 lazy opcional padr o para true Configurar lazy false desabilitar o uso de inicializa o lazy A coluna discriminat ria n o requerida para esta estrat gia de mapeamento For information about inheritance mappings see Cap tulo 9 Mapeamento de Heran a 5 1 20 Uni o Usando o elemento lt join gt gt poss vel mapear propriedades de uma classe para v rias tabelas que possuem uma rela o um por um Por exemplo lt join table tablename schema owner catalog catalog fetch join select inverse true false 000000
55. n o se aplica s cole es mapeadas inverse true 20 6 Monitorando desempenho A otimiza o n o muito usada sem o monitoramento e acesso ao n mero de desempenho O Hibernate oferece uma grande variedade de n meros sobre suas opera es internas Estat sticas em Hibernate est o dispon veis atrav s do SessionFactory 20 6 1 Monitorando uma SessionFactory Voc poder acessar as m tricas da sessionFactory de duas formas Sua primeira op o chamar a sessionFactory getStatistics ler ou disp r aS Estat sticas voc mesmo O Hibernate tamb m usa o JMX para publicar m tricas se voc habilitar o MBean de StatisticsService Voc deve habiliar um MBean nico para todas as suas SessionFactory ou uma por factory Veja o seguinte c digo para exemplos de configura es minimal sticos MBean service registration for a specific SessionFactory 285 Capitulo 20 Aumentando o des Hashtable tb new Hashtable Corpus ley pe atatistics Tr tb put sessionFactory myFinancialApp ObjectName on new ObjectName hibernate tb MBean object name StatisticsService stats new StatisticsService MBean implementation stats setGessionractory sessionractory Bind the stats to a SessionFactory server registerMBean stats on Register the Mbean on the server MBean service registration for all SessionFactory s Hashtable tb new Hashtable tb put type statistic
56. o Vamos reunir algumas pessoas e eventos em um novo m todo na classe EventManager private void addPersonToEvent Long personId Long eventId Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction Person aPerson Person session load Person class personld Event anEvent Event session load Event class eventId aPerson getEvents add anEvent session getTransaction commit Ap s carregar um Person e um Event simplesmente modifique a cole o usando os m todos normais de uma cole o Como voc pode ver n o h chamada expl cita para update OU save O Hibernate detecta automaticamente que a cole o foi modificada e que necessita ser atualizada Isso chamado de checagem suja autom tica e voc tamb m pode us la modificando o nome ou a data de qualquer um dos seus objetos Desde que eles estejam no estado persistent ou seja limitado por uma session do Hibernate em particular o Hibernate monitora qualquer altera o e executa o SQL em modo de grava o tempor ria O processo de sincroniza o do estado da mem ria com o banco de dados geralmente apenas no final de uma unidade de trabalho normalmente apenas no final da unidade de trabalho cnamado de flushing No nosso c digo a unidade de trabalho termina com o commit ou rollback da transa o do banco de dados Voc pode tamb m querer carregar pessoas e eventos em diferentes u
57. o para integer O tipo do n mero da vers o access opcional padr o para property A estrat gia que o Hiberante deve utilizar para acessar o valor da propriedade unsaved value opcional valor padr o para undefined Um valor para a propriedade vers o que indica que uma inst ncia foi instanciada recentemente unsaved distinguindo de inst ncias desconectadas que foram salvas ou carregadas em sess es anteriores undefined especifica que o valor da propriedade de identifica o deve ser utilizado O generated opcional valor padr o never Especifica que este valor de propriedade da vers o na verdade gerado pelo banco de dados Veja o generated properties para maiores informa es insert opcional padr o para true Especifica se a coluna de vers o deve ser inclu da na instru o de inser o do SQL Pode ser configurado como false se a coluna do banco de dados estiver definida com um valor padr o de o o 0000 O N meros de vers o podem ser dos tipos Hibernate long integer short timestamp OU calendar A vers o ou timestamp de uma propriedade nunca deve ser nula para uma inst ncia desconectada assim o Hibernate ir identificar qualquer inst ncia com uma vers o nula ou timestamp como transiente n o importando qual outra estrat gia unsaved value tenha sido especificada A declara o de uma vers o nula ou a propriedade timestamp um caminho f cil para tratar problemas com reconex e
58. o seu pr prio 26 3 Resolu o do Dialeto Originalmente o Hibernate sempre solicita que os usu rios especifiquem qual dialeto a ser usado No caso dos usu rios buscarem banco de dados m ltiplos de destina o simultaneamente com as pr prias constru es que eram problem ticas Normalmente isto solicita que seus pr prios usu rios configurem o dialeto do Hibernate ou definam o pr prio m todo de determina o do valor Inicializando com a vers o 3 2 o Hibernate introduziu a no o de detec o autom tica do dialeto para uso baseado no java sqgl DatabaseMetaData obtido a partir de um java sgl Connection para aquele banco de dados Era muito melhor esperar que esta resolu o limitada aos bancos de dados Hibernate soubesse com anteced ncia e que em ocasi o alguma era configur vel ou substitu vel Starting with version 3 3 Hibernate has a fare more powerful way to automatically determine which dialect to should be used by relying on a series of delegates which implement the org hibernate dialect resolver DialectResolver which defines only a single method 327 Capitulo 26 Considera es da public Dialect resolveDialect DatabaseMetaData metaData throws JDBCConnectionException The basic contract here is that if the resolver understands the given database metadata then it returns the corresponding Dialect if not it returns null and the process continues to the next resolver The signature also ide
59. rfi Polim rfi Polim rfi Polim rfi externa tabela lt many lt one lt one lt many s get Payfremt clasfsom supported por to one gt to one gt to to id Payment Order hierarquia many gt many gt p o join de class o payment pP table per lt many lt one lt one lt many s get Payfreat clasfssom supported subclass to one gt to one gt to to id Payment Order many gt many gt p o join o payment pP tabela lt many lt one lt one lt many s get Payfeont clas amp om supported por to one gt to one gt to to id Payment Order classe many gt many gt p o join concreta for o payment subclasses inverse true p de only uni o tabela lt any gt not not lt many ss createCfridreria B iment cnats add Restrictions por supported supported to any gt Payment Supported supported classe p concreta polimorfismo implicito 157 158 Trabalhando com objetos O Hibernate uma solu o completa de mapeamento objeto relacional que n o apenas poupa o desenvolvedor dos detalhes de baixo n vel do sistema de gerenciamento do banco de dados como tamb m oferece um gerenciamento de estado para objetos Isto ao contr rio do gerenciamento de instru es SQL em camadas de persist ncia JDBC SQL comuns uma vis o natural da persist ncia orientada a objetos em aplica es Java Em outras palavras desenvolvedores de aplica es Hibernate podem sempre considerar o estado de se
60. sito para um banco de dados relacional em particular e g full classname of Dialect Na maioria dos casos 0 Hibernate ir atualmente estar apto a escolher a implementa o org hibernate dialect Dialect correta baseada no JDBC metadata retornado pelo JDBC driver Escreve todas as instru es SQL no console Esta uma alternativa para configurar a categoria de log org hibernate soL to debug e g true false Imprime o SQL formatado no log e recipiente e g true false Qualifica no SQL gerado os nome das tabelas desqualificadas com o esquema espa o da tabela dado e g SCHEMA NAME Qualifica no SQL gerado os nome das tabelas desqualificadas com cat logo dado e g CATALOG NAME hibernate session factory name O org hibernate SessionFactory ir automaticamente se ligar a este nome no JNDI depois de ter sido criado e g jndi composite name hibernate max fetch depth hibernate default batch fetch size Estabelece a profundidade m xima para rvore de busca de uni o externa para associa es finais nicas um para um muitos para um Um o desativa por padr o a busca de uni o externa eg valores recomendados entreo e 3 Determina um tamanho padr o para busca de associa es em lotes do Hibernate 39 Capitulo 3 Configuration Nome da Propriedade hibernate default_entity_mode hibernate order_updates hibernate generate_statistics hibernate
61. tempo de intera o do usu rio com bloqueios na base de dados para impedir a modifica o concorrente e para garantir o isolamento e a atomicidade Esse naturalmente um anti pattern uma vez que a disputa do bloqueio n o permitiria o escalonameneto da aplica o com o n mero de usu rios concorrentes Claramente temos que usar diversas transa es para implementar a conversa o Neste caso manter o isolamento dos processos de neg cio torna se responsabilidade parcial da camada da aplica o Uma nica conversa o geralmente usa diversas transa es Ela ser at mica se somente uma destas transa es a ltima armazenar os dados atualizados todas as outras simplesmente leram os dados por exemplo em um di logo do estilo wizard que mede diversos ciclos de requisi o resposta Isto mais f cil de implementar do parece especialmente se voc usar as caracter sticas do Hibernate Versionamento autom tico o Hibernate pode fazer o controle autom tico de concorr ncia otimista para voc ele pode automaticamente detectar se uma modifica o concorrente ocorreu durante o tempo de intera o do usu rio Geralmente n s verificamos somente no fim da conversa o Objetos Desanexados se voc se decidir usar o j discutido pattern sess o por solicita o todas as inst ncias carregadas estar o no estado destacado durante o tempo em que o 189 Cap tulo 12 Transa es e Con usu rio estiver p
62. todo do proxy for invocado Veja Inicializa o de Cole es e Proxies abaixo Polimorfismo impl cito significa que inst ncias de uma classe ser o retornadas por uma consulta que d nome a qualquer superclasse ou interface e classe implementada al m das inst ncias de qualquer subclasse da classe ser o retornadas por uma consulta que nomeia a classe por si Polimorfismo expl cito significa que inst ncias da classe ser o retornadas apenas por consultas que explicitamente nomeiam a classe e que as consultas que nomeiam as classes ir o retornar apenas inst ncias de subclasses mapeadas dentro da declara o lt class gt como uma lt subclass gt OU lt joined subclass gt Para a maioria dos casos o valor padr o polymorphism implicit apropriado Polimorfismo explicito til quando duas classes distintas est o mapeadas para a mesma tabela Isso aceita uma classe peso leve que cont m um subconjunto de colunas da tabela 72 Classe O atributo persister deixa voc customizar a estrat gia de persist ncia utilizada para a classe Voc pode por exemplo especificar sua pr pria subclasse do org hibernate persister EntityPersister OU voc pode criar uma implementa o completamente nova da interface org hibernate persister ClassPersister que implementa a persist ncia atrav s de por exemplo chamadas a procedimentos armazenados serializa o de arquivos planos ou LDAP Veja org hibernate test CustomPersis
63. 6 Mapeamento de associa es mais complexas ii es 141 8 Mapeamento de Componentes rrenan 143 8 1 Objetos dependentes e eae eeeeeeeeaeaaaaeeeeeeeeeaeaaaaees 143 HIBERNATE Persist ncia Rela 8 2 Cole es de objetos dependentes eee eeeeeeeeeeeeaeaaeeteeeeeeeeeaeaaea 145 8 3 Componentes como ndices de Map eterna ara 146 8 4 Componentes como identificadores compostos 147 8 5 Componentes Din micos aiiai aaan a Ea 149 9 Mapeamento de Heran a eee eeeeeee cane eeeeaaeeeeeeaaeeeeeeaaeeeeeeaaeeeeeeaaanees 151 9 1 As tr s estrat gias inscr airone anaa eed cnn E EEA 151 9 1 1 Tabela por hierarquia de classes ra 151 9 1 2 Tabela por subclasse cece eee e ee cet eeeeeeeeeeeeaeaaeeeeeeeeeeeeaeaaaaenees 152 9 1 3 Tabela por subclasse usando um discriminador ceeeeeeeeeeeeeeee teens 153 9 1 4 Mesclar tabela por hierarquia de classes com tabela por subclasse 153 9 1 5 Tabela por classe concreta cece ee eeeeee eae ee eeaaaeeeeeaaeeeeeeaaneeees 154 9 1 6 Tabela por classe concreta usando polimorfismo impl cito 155 9 1 7 Mesclando polimorfismo impl cito com outros mapeamentos de heran a 156 O72 LIMILA ES Gessasiessamendaseiinaaad io isan sie T Aa 157 10 Trabalhando com ob
64. 7 Mapeamento de ass 7 2 2 Um para um Uma associa o unidirecional um para um em uma chave externa quase id ntica A nica diferen a a restri o nica na coluna lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt many to one name address column addressId unique true not null true gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key addressId bigint not null unique create table Address addressId bigint not null primary key Uma associa o unidirecional um para um na chave prim ria geralmente usa um gerador de id especial Note que n s invertemos a dire o da associa o nesse exemplo lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt class gt lt class name Address gt lt id name id column personId gt lt generator class foreign gt lt param name property gt person lt param gt lt generator gt lt id gt lt one to one name person constrained true gt elass gt create table Person personId bigint not null primary key 132 Um para muitos create table Address personId bigint not null primary key 7 2 3 Um para muitos Uma associa o
65. Dada a maturidade de diversas implementa es aut nomas dispon veis do JTA TransactionManager a maioria se n o todos dos aplicativos deveria utilizar o gerenciador de transa es JTA sendo ou n o instalados dentro de um recipiente 32EE Baseado neste recurso voc deve sempre utilizar sess es contextuais baseadas em JTA Entretanto a partir da vers o 3 1 o processo por tras do m todo SessionFactory getCurrentSession agora plug vel Com isso uma nova interface org hibernate context CurrentSessionContext e um novo par metro de configura o hibernate current session context class foram adicionados para possibilitar a compatibilidade do contexto e do escopo na defini o de sess es correntes Consulte no Javadocs sobre a interface org hibernate context CurrentSessionContext para uma discuss o detalhada Ela define um m todo nico currentsession pelo qual a implementa o respons vel por rastrear a sess o contextual atual Fora da caixa o Hibernate surge com tr s implementa es dessa interface e org hibernate context JTASessionContext AS sess es correntes s o rastreadas e recebem um escopo por uma transa o uta O processamento aqui exatamente igual abordagem anterior do JTA somente Consulte em Javadocs para maiores detalhes org hibernate context ThreadLocalSessionContext AS sess es correntes s o rastreadas por uma thread de execu o Novamente consulte em Javadocs
66. Esta distribui o cont m outro aplicativo de amostra sob o diret rio de fonte do projeto tutorial eg 1 1 Parte 1 A primeira aplica o Hibernate Vamos supor que precisemos de uma aplica o com um banco de dados pequeno que possa armazenar e atender os eventos que queremos al m das informa es sobre os hosts destes eventos Nota Mesmo que usando qualquer banco de dados do qual voc se sinta confort vel n s usaremos http hsqldb org o em mem ria banco de dados Java para evitar a descri o de instala o configura o de quaisquer servidores do banco de dados 1 1 1 Configura o O primeiro passo em que precisamos tomar configurar o ambiente de desenvolvimento N s usaremos o layout padr o suportado por muitas ferramentas de constru o tais como Maven http maven org Maven em particular possui um excelente recurso de descri o disto layout http maven apache org guides introduction introduction to the standard directory layout html Assim como este tutorial deve ser um aplicativo da web n s criaremos e faremos uso dos diret rios src main java src main resources src main webapp Capitulo 1 Tutorial N s usaremos Maven neste tutorial tirando vantagem destas capacidades de depend ncia transitiva assim como a habilidade de muitos IDEs de configurar automaticamente um projeto baseado no descritor maven lt project xmlns http maven apache org POM 4 0 0 xmins xsi
67. Hibernate fazer cache de todas as inst ncias de customer inseridas num cach em n vel de sess o N s demonstraremos neste capitulo como evitar este problema Entretanto se voc vai realizar processamento em lotes muito importante que voc habilite o uso de lotes JDBC se voc pretende obter um desempenho razo vel Defina o tamanho do lote JDBC em um valor razo vel algo entre 10 50 por exemplo hibernate jdbc batch size 20 Note que o Hibernate desabilita o loteamento de inser o no nivel JDBC de forma transparente se voc utilizar um gerador de identificador identiy Voc tamb m pode querer rodar esse tipo de processamento em lotes com o cache secund rio completamente desabilitado hibernate cache use second level cache false Mas isto n o absolutamente necess rio desde que possamos ajustar 0 CacheMode para desabilitar a intera o com o cache secund rio 14 1 Inser o em lotes Quando voc estiver inserindo novos objetos persistentes voc s deve executar os m todos flush clear regularmente na sess o para controlar o tamanho do cache prim rio Session session sessionFactory openSession Transaction tx session beginTransaction 209 Capitulo 14 Batch processing for Cintia lt 0 000s at aad Customer customer new Customer session save customer if i 20 0 20 same as the JDBC batch size lush a batch of inserts and release memory ses
68. Hibernate pode localizar uma linha individual eficazmente e atualizar ou deletar individualmente como um list map ou set Na implementa o atual a estrat gia de gera o de identificador native n o suportada para identificadores de cole o usando 0 lt idbag gt 6 4 Exemplos de cole es Esta sess o cobre os exemplos de cole es A seguinte classe possui uma cole o de inst ncias child package eg import java util Set public class Parent private long id private Set children public long getId return id private void setId long id this id id private Set getChildren return children private void setChildren Set children this children children 126 Exemplos de cole es Se cada Filho tiver no m ximo um Pai o mapeamento natural uma associa o um para muitos lt hibernate mapping gt lt class name Parent gt lt id name id gt lt generator class sequence gt cle lt set name children gt lt key column parent_id gt lt one to many class Child gt lt set gt lt class gt lt class name Child gt lt id name id gt lt generator class sequence gt lt id gt lt property name name gt lt class gt lt hibernate mapping gt Esse mapeamento gera a seguinte defini o de tabelas create table parent id bigint not null primary key create table child id bigint not null primary key name varchar 255 par
69. If Session isDefaultReadOnly returns true entities loaded by the following are automatically made read only Session load Session get Session merge executing scrolling or iterating HQL queries and criteria to override this setting for a particular HQL query or criteria see Se o 11 1 3 Loading read only entities from an HQL query criteria Changing this default has no effect on persistent entities already in the session when the default was changed persistent entities that are refreshed via Session refresh a refreshed persistent entity will only be read only if it was read only before refreshing persistent entities added by the application via Session persist Session save and Session update Session saveOrUpdate 11 1 3 Loading read only entities from an HQL query criteria Nota Entities of immutable classes are automatically loaded as read only If Session isDefaultReadOnly returns false the default when an HQL query or criteria executes then entities and proxies of mutable classes loaded by the query will not be read only You can override this behavior so that entities and proxies loaded by an HQL query or criteria are automatically made read only For an HQL query call Query setReadOnly true Query setReadOnly true must be called before Query list Query uniqueResult Query scroll Of Query iterate For an HQL criteria call 179 Capitulo 11
70. N s recomendamos com nfase que voc implemente equals hashCode para comparar as propriedades da chave natural da entidade Este mapeamento n o pretende ser utilizado com entidades com chaves naturais prim rias mutable opcional padr o false Por padr o propriedades naturais identificadoras s o consideradas imut veis constante 91 Capitulo 5 Mapeamento O R Basico 5 1 15 Componente e componente dinamico O elemento lt component gt mapeia propriedades de um objeto filho para colunas da tabela de uma classe pai Os componentes podem um ap s o outro declarar suas pr prias propriedades componentes ou cole es Veja Components abaixo lt component name propertyName class className insert true false update true false access field property ClassName lazy true false optimistic lock true false 0900000006 unique true false node element name lt property gt lt Many to one gt lt component gt Oo 000 9086 name O nome da propriedade class opcional padr o para o tipo de propriedade determinada por reflection O nome da classe filha do componente insert As colunas mapeadas aparecem nos SQL de INSERTs update As colunas mapeadas aparecem nos SQL de UPDATEs access opcional padr o para property A estrat gia que o Hiberante deve utilizar para acessar o valor da propriedade lazy opcional padr
71. a partir de uma sequ ncia de banco de dados fornecida uuid utiliza um algor timo UUID de 128 bits para gerar identificadores do tipo string nicos em uma rede o endere o IP utilizado O UUID codificado como um string de d gitos hexadecimais de tamanho 32 75 Capitulo 5 Mapeamento O R Basico guid utiliza um string GUID gerado pelo banco de dados no Servidor MS SQL e MySQL native seleciona entre identity sequenceOU hilo dependendo das capacidades do banco de dados utilizado assigned deixa a aplica o definir um identificador para o objeto antes que o save seja chamado Esta a estrat gia padr o caso nenhum elemento lt generator gt seja especificado select retorna a chave prim ria recuperada por um trigger do banco de dados selecionando uma linha pela chave nica e recuperando o valor da chave prim ria foreign utiliza o identificador de um outro objeto associado Normalmente utilizado em conjunto com uma associa o de chave prim ria do tipo lt one to one gt sequence identity uma estrat gia de gera o de sequ ncia especializada que use uma sequ ncia de banco de dados para a gera o de valor atual mas combina isto com JDBC3 getGeneratedKeys para de fato retornar o valor do identificador gerado como parte da execu o de instru o de inser o Esta estrat gia somente conhecida para suportar drivers da Oracle 10g focados em JDK 1 4 Note que os coment rios sobre estas instr
72. acima come ando em 3 3 x No entanto eles est o inclu dos nas libera es atuais e podem ser referenciados pelo FQN A primeira destas novas gera es a org hibernate id enhanced SequenceStyleGenerator que primeiramente uma substitui o para o gerador sequence e segundo um melhor gerador de portabilidade que o native Isto devido ao native normalmente escolher entre identity sequence que s o sem nticas extremamente diferentes das quais podem causar problemas s bitos em portabilidade de observa o de aplicativos No entanto o org hibernate id enhanced SequenceStyleGenerator atinge a portabilidade numa maneira diferente Ele escolhe entre uma tabela ou uma sequ ncia no banco de dados para armazenar seus valores de incrementa o dependendo nas capacidades do dialeto sendo usado A diferen a entre isto e O native que o armazenamento baseado na tabela e sequ ncia possuem exatamente a mesma sem ntica Na realidade as sequ ncias s o exatamente o que o Hibernate tenta imitar com os pr prios geradores baseados na tabela Este gerador possui um n mero de par metros de configura o 78 Otimiza o do Gerador de Identifica o e sequence name Opcional valor padr o hibernate sequence o nome da sequ ncia ou tabela a ser usada initial value opcional padr o para 1 O valor inicial a ser restaurado a partir da sequ ncia tabela Em termos da cria o de sequ ncia isto an logo
73. acta ada EAE EEA 331 Prefacio O trabalho com o software objeto relacional e banco de dados relacionais pode ser inc modo e desgastante atualmente num meio empresarial Hibernate um Objeto Relacional de Mapeamento de ferramentas nos meios Java O termo Objeto Relacional de Mapeamento ORM refere se t cnica de mapeamento de dados representada desde o objeto modelo aos dados relacionais modelo com um esquema baseado na SQL O Hibernate n o cuida apenas do mapeamento desde s classes de Java at as mesas de banco de dados e de tipos de dados Java at tipos de dados da SQL mas tamb m proporciona a consulta de dados e facildades de recupera o que pode significativamente reduzir o tempo de desenvolvimento Do contr rio consumido com o manual de dados executados em SQL e JDBC A meta de Hibernate aliviar o desenvolvedor em 95 de dados comuns de persist ncia relacionados as tarefas de programa o O Hibernate talvez n o seja a melhor solu o para as aplica es centradas em dados das quais apenas usam procedimentos armazenados para a implementa o das l gicas comerciais no banco de dados Isto mais utilizado orientando o objeto aos modelos de dom nio e l gicas comerciais na camada intermedi ria baseada em Java No entanto o Hibernate pode certamente ajud lo a remover ou condensar o espec fico c digo fornecedor SQL e ajudar com a tarefa comum de resultado estabelecido pela tradu o desde a represent
74. adicionados a um set n s s teremos um elemento no set Infelizmente n o podemos usar esta abordagem com os identificadores gerados O Hibernate atribuir somente os valores de identificadores aos objetos que forem persistentes uma inst ncia recentemente criada n o ter nenhum valor de identificador Al m disso se uma inst ncia n o for salva e estiver em um set salv la atribuir um valor de identificador ao objeto Se equals hashCode fossem baseados em um valor identificador o c digo hash teria mudado quebrando o contrato do set Consulte o website do Hibernate para acessar uma discuss o completa sobre este problema Note que esta n o uma edi o do Hibernate e sim sem nticas naturais do Java de igualdade e identidade 58 Modelos dinamicos Recomendamos implementar equals hashCode usando Business key equality A chave de neg cios significa que o m todo equals compara somente a propriedade que formar uma chave de neg cios uma chave que identificaria nossa inst ncia na realidade uma chave de candidato natural public class Cat public boolean equals Object other if this other return true if other instanceof Cat return false final Cat cat Cat other if cat getLitterId equals getLitterId return false if cat getMother equals getMother return false return true public int hashCode int result result getMother hashCo
75. atualiza es de entidades todas as dele es de cole es todas as dele es atualiza es e inser es de elementos de cole o todas as inser es de cole o todas as dele es de entidade na mesma ordem que os objetos correspondentes foram deletados usando session delete oon KR WwW PP Uma exce o que o objeto que utiliza a gera o de ID native inserido quando salvo Exceto quando voc explicitamente limpar n o h nenhuma garantia sobre quando a sess o executar as chamadas de JDBC somente se sabe a ordem na qual elas s o executadas No entanto o Hibernate garante que a query list nunca retornar dados antigos nem retornar dados errados It is possible to change the default behavior so that flush occurs less frequently The FlushMode class defines three different modes only flush at commit time when the Hibernate Transaction API is used flush automatically using the explained routine or never flush unless flush is called explicitly The last mode is useful for long running units of work where a Session is kept 172 Persist ncia Transitiva open and disconnected for a long time see Se o 12 3 2 Sess o estendida e versionamento autom tico sess sf openSession Transaction tx sess beginTransaction j sess setFlushMode FlushMode COMMIT allow queries to return stale state Cat izi Cat sess load Cat class id 1z1 setName iznizi
76. com um objeto sem que realmente o carregue do bando de dados Isto tamb m permite que sejam carregadas m ltiplas inst ncias como um grupo se O batch size estiver definido para o mapeamento da classe Se voc n o tiver certeza da exist ncia do registro no banco voc deve usar o m todo get que consulta o banco imediatamente e retorna um null se n o existir o registro Cat cat Cat sess get Cat class id if cat null cat new Cat sess save cat id return cat Tamb m pode se carregar um objeto usando SELECT FOR UPDATE USando uM LockMode Veja a documenta o da API para maiores informa es Cat cat Cat sess get Cat class id LockMode UPGRADE 161 Cap tulo 10 Trabalhando com Note que quaisquer inst ncias associadas ou que contenham cole es n o s o selecionados FOR UPDATE a nao ser que voc decida especificar um lock ou all como um estilo cascata para a associa o poss vel realizar o recarregamento de um objeto e todas as suas cole es a qualquer momento usando o m todo refresh til quando os disparos do banco de dados s o usados para inicializar algumas propriedades do objeto SESS save cat sess flush force the SQL INSERT sess refresh cat re read the state after the trigger executes How much does Hibernate load from the database and how many SQL sELEcTs will it use This depends on the fetching str
77. consultas e tempo m dio que uma consulta precisa Esteja ciente de que o n mero de milisegundos sujeito a aproxima o em Java O Hibernate preso precis o do JVM em algumas plataformas a precis o chega a ser de 10 segundos 286 M tricas Os Getters simples s o usados para acessar m tricas globais ou seja n o presos uma entidade em particular cole o regi o de cache etc Voc pode acessar as m tricas de uma entidade em particular cole o ou regi o de cache atrav s de seu nome e atrav s de sua representa o de HQL ou SQL para consultas Por favor consulte a Javadoc API Statistics EntityStatistics CollectionStatistics SecondLevelCacheStatistics QueryStatistics para maiores informa es O seguinte c digo mostra um exemplo simples Statistics stats HibernateUtil sessionFactory getStatistics double queryCacheHitCount stats getQueryCacheHitCount double queryCacheMissCount stats getQueryCacheMissCount double queryCacheHitRatio queryCacheHitCount queryCacheHitCount queryCacheMissCount log info Query Hit ratio queryCacheHitRatio EntityStatistics entityStats stats getEntityStatistics Cat class getName long changes entityStats getInsertCount entityStats getUpdateCount entityStats getDeleteCount log info Cat class getName changed changes times Para trabalhar em todas as entidades cole es consultas e caches
78. convers o adaptada como voc Todos os tipos internos do hibernate exceto cole es suportam sem nticas nulas com a exce o das cole es 5 2 2 Valores de tipos b sicos Os tipos de mapeamento b sicos fazem parte da categoriza o do seguinte integer long short float double character byte boolean yes no true false Tipos de mapeamentos de classes primitivas ou wrapper Java espec ficos vendor specific para tipos de coluna SQL Boolean boolean yes no s o todas codifica es alternativas para um boolean OU java lang Boolean do Java string Um tipo de mapeamento de java lang String para VARCHAR OU VARCHAR2 no Oracle date time timestamp Tipos de mapeamento de java util Date e suas subclasses para os tipos SQL DATE e TIMESTAMP OU equivalente TIM calendar calendar date Tipo de mapeamento de java util Calendar para os tipos SQL TIMESTAMP DATE OU equivalente big decimal big integer Tipo de mapeamento de java math BigDecimal and java math BigInteger para NUMERIC ou NUMBER no Oracle locale timezone currency Tipos de mapeamentos de java util Locale java util TimeZone e java util Currency para VARCHAR OU VARCHAR2 no Oracle Inst ncias de f Locale e Currency S o mapeados para seus c digos ISO Inst ncias de Timezone s o mapeados para seu ID class Um tipo de mapeamento de java lang Class para VARCHAR OU VARCHAR2 no Oracle Uma Class mapeada
79. conversation O objeto foo sabe que a session j foi carregada Ao come ar uma nova transa o ou uma sess o velha voc obter uma conex o nova e reiniciar a sess o Submeter uma transa o implica em desconectar uma sess o da conex o JDBC e retornar conex o ao pool Ap s a reconex o para for ar uma checagem de vers o em dados que voc n o esteja atualizando voc poder chamar session lock com O LockMode READ em todos os objetos que possam ter sido atualizados por uma outra transa o Voc n o precisa bloquear nenhum dado que voc est atualizando Geralmente voc configuraria rlushMode NEVER em uma session estendida de modo que somente o ltimo ciclo da transa o tenha permiss o de persistir todas as modifica es feitas nesta conversa o Por isso somente esta ltima transa o incluiria a opera o flush e ent o tamb m iria close a sess o para terminar a conversa o Este modelo problem tico se a session for demasiadamente grande para ser armazenada durante o tempo de espera do usu rio por exemplo uma Httpsession deve ser mantida o menor poss vel Como a session tamb m cache de primeiro n vel imperativo e cont m todos os objetos carregados n s podemos provavelmente usar esta estrat gia somente para alguns ciclos de requisi o resposta Voc deve usar a session somente para uma nica conversa o porque ela logo tamb m estar com dados velhos
80. dados n o suportam vis es apropriadamente especialmente com atualiza es Algumas vezes voc quer utilizar uma vis o mas n o pode cri la no banco de dados por exemplo com um esquema legado Neste caso voc pode mapear uma entidade imut vel e de somente leitura para uma dada express o de subsele o SQL lt class name Summary gt lt subselect gt select item name max bid amount count from item join bid on bid item id item id group by item name lt subselect gt lt synchronize table item gt 73 Capitulo 5 Mapeamento O R Basico lt synchronize table bid gt lt id name name gt lt class gt Declare as tabelas para sincronizar com esta entidade garantindo que a auto libera o ocorra corretamente e que as consultas para esta entidade derivada n o retornem dados desatualizados O lt subselect gt est dispon vel tanto como um atributo como um elemento mapeado aninhado 5 1 4 id Classes mapeadas devem declarar a coluna de chave prim ria da tabela do banco de dados Muitas classes ir o tamb m ter uma propriedade ao estilo Java Beans declarando o identificador nico de uma inst ncia O elemento lt id gt define o mapeamento desta propriedade para a chave prim ria name propertyName type typename column column_name unsaved value null any none undefined id value 00000 access field property ClassName gt node element name Gattribute name
81. de disputa se uma inst ncia session for compartilhada Se voc mantiver sua session do Hibernate em seu HttpSession discutido mais tarde voc dever considerar sincronizar o acesso a sua sess o do HTTP Caso contr rio um usu rio que clica em recarga r pido demais pode usar o mesmo Session em duas threads executando simultaneamente Uma exce o lan ada pelo Hibernate significa que voc tem que dar rollback na sua transa o no banco de dados e fechar a session imediatamente discutido mais tarde em maiores detalhes Se sua session limitada pela aplica o voc tem que parar a aplica o Fazer o rollback na transa o no banco de dados n o retorna seus objetos do neg cio ao estado que estavam no in cio da transa o Isto significa que o estado da base de dados e os objetos de neg cio perdem a sincroniza o Geralmente n o um problema porque as exce es n o s o recuper veis e voc tem que iniciar ap s o rollback de qualquer maneira The session caches every object that is in a persistent state watched and checked for dirty state by Hibernate If you keep it open for a long time or simply load too much data it will grow endlessly until you get an OutOfMemoryException One solution is to call clear and evict to manage the session cache but you should consider a Stored Procedure if you need mass data operations Some solutions are shown in Capitulo 14 Batch processing Keeping a Session open for the dur
82. de um identificador gerado mas e os identificadores atribu dos e os identificadores de composi o Isto mais dif cil pois uma vez que o Hibernate n o pode utilizar a propriedade do identificador para distinguir entre um objeto instanciado recentemente com um identificador atribu do pelo usu rio e um objeto carregado em uma sess o anterior Neste caso o Hibernate usar tanto um carimbo de data e hora timestamp ou uma propriedade de vers o ou ir na verdade consultar um cache de segundo n vel ou no pior dos casos o banco de dados para ver se a linha existe 22 5 Conclus o H muito o que digerir aqui e pode parecer confuso na primeira vez No entanto na pr tica funciona muito bem A maioria dos aplicativos do Hibernate utiliza o modelo pai filho em muitos lugares N s mencionamos uma alternativa neste primeiro par grafo Nenhum dos casos acima existem no caso de mapeamentos lt composite element gt que possuem exatamente a sem ntica do relacionamento pai filho Infelizmente existem duas grandes limita es para elementos compostos elementos compostos podem n o possuir cole es e assim sendo podem n o ser filhos de nenhuma outra entidade a n o ser do pai nico 301 302 Exemplo Aplicativo Weblog 23 1 Classes Persistentes As classes persistentes representam um weblog e um item postado em um weblog Eles nao devem ser modelados como um relacionamento padrao pai filho mas usaremos uma
83. do Hibernate 68 Mapeamento do Hibernate Umuser namespace reconhecido quando um solucionador encontra um sistema Id utilizando um protocolo URL de classpath O solucionador tentara solucionar estas entidades atrav s do carregador de classe do contexto de thread atual 1 e o carregador de classe 2 que carregou as classes do Hibernate Um exemplo de utiliza o do espa o de nome do usu rio lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN hibernate sourceforge net hibernate mapping 3 0 dtd lt ENTITY version 3 5 6 Final gt lt ENTITY today September 15 2010 gt lt ENTITY types SYSTEM classpath your domain types xml gt lt hibernate mapping package your domain gt lt class name MyEntity gt lt id name id type my custom id type gt a eds lt class gt amp types lt hibernate mapping gt Tete Onde types xm1 um recurso no pacote your domain e cont m um typedef personalizado 5 1 2 Mapeamento do Hibernate Este elemento possui diversos atributos opcionais Os atributos schema catalog especificam que tabelas referenciadas neste mapeamento pertencem ao esquema e ou ao cat logo nomeado Se especificados os nomes das tabelas ser o qualificados no esquema ou cat logo dado Se n o os nomes das tabelas n o ser o qualificados O atributo default cascade especifica qual estilo de cascata ser
84. efetivos simplesmente habilite o filtro na sess o antes de recuperar os dados dos empregados Session session session enableFilter effectiveDate setParameter asOfDate new Date List results session createQuery from Employee as e where e salary gt targetSalary setLong targetSalary new Long 1000000 epa 258 Filtros do Hibernate No HQL acima mesmo que tenhamos mencionado apenas uma restri o de sal rio nos resultados por causa do filtro habilitado a consulta retornar apenas os funcion rios ativos cujo sal rio maior que um milh o de d lares Nota se voc planeja usar filtros com uni o externa por HQL ou por busca de carga seja cuidadoso quanto dire o da express o de condi o mais seguro configur lo para uma uni o externa esquerda Coloque o par metro primeiro seguido pelo s nome s da coluna ap s o operador Ap s ser definido o filtro deve ser anexado s entidades m ltiplas e ou cole es cada uma com sua pr pria condi o Isto pode ser tedioso quando as condi es se repetem Assim usando o lt filter def gt permite denifir uma condi o padr o tanto como uma fun o quanto CDATA lt filter def name myFilter condition abc gt xyz gt lt filter def gt lt filter def name myOtherFilter gt abc xyz lt filter def Esta condi o padr o ser utilizada todas as vezes que um filtro for anexado a algo sem uma condi o espec
85. es JDK 5 0 e JSR 220 ainda esta em constru o Consulte o m dulo de Anota es do Hibernate para maiores detalhes 5 6 Propriedades geradas Propriedades Geradas s o propriedades que possuem seus valores gerados pelo banco de dados Como sempre os aplicativos do Hibernate precisavam renovar objetos que contenham qualquer propriedade para qual o banco de dados estivesse gerando valores No entanto vamos permitir que o aplicativo delegue esta responsabilidade ao Hibernate Essencialmente quando o Hibernate edita um SQL INSERT ou UPDATE para uma entidade que tem propriedades geradas definidas ele edita imediatamente depois uma sele o para recuperar os valores gerados 109 Capitulo 5 Mapeamento O R Basico As propriedades marcadas como geradas devem ser n o inser veis e n o atualiz veis Somente versions timestamps e simple properties podem ser marcadas como geradas never padr o significa que o valor de propriedade dado n o gerado dentro do banco de dados insert informa que o valor de propriedade dado gerado ao inserir mas n o novamente gerado nas pr ximas atualiza es Propriedades do tipo data criada se encaixam nesta categoria Note que embora as propriedades version e timestamp podem ser marcadas como geradas esta op o n o est dispon vel always informa que o valor da propriedade gerado tanto ao inserir quanto ao atualizar 5 7 Coluna de express es de grava o e leitura
86. estado velho e novo ex se voc usar uma nica Session longa e n o uma sess o por solicita o com objetos desanexados s vezes a modifica o concorrente pode ser permitida desde que as mudan as realizadas n o se sobreponham Se voc configurar optimistic lock dirty ao mapear O lt class gt O Hibernate comparar somente campos modificados durante a libera o Em ambos os casos com as colunas de vers o carimbo de hora dedicados com compara o de campo cheio sujo o Hibernate usa uma nica instru o UPDATE com uma cl usula WHERE apropriada por entidade para executar a checagem da vers o e atualizar a informa o Se voc usar a persist ncia transitiva para cascatear o reatamento das entidades associadas o Hibernate pode executar atualiza es desnecess rias Isso n o geralmente um problema mas os triggers em atualiza es num banco de dados pode ser executado mesmo quando nenhuma mudan a foi feita nas inst ncias desanexadas Voc pode customizar este comportamento configurando selecionar antes de atualizar verdadeiro no mapeamento lt class gt for ando o Hibernate a fazer um SELECT nas inst ncias para assegurar se de que as mudan as realmente aconteceram antes de atualizar a linha 12 4 Bloqueio Pessimista N o ha inten o alguma que usu rios gastem muitas horas se preocupando com suas estrat gias de bloqueio Geralmente o bastante especificar um n vel de
87. executeUpdate x commit session close 214 HQL A Linguagem de Consultas do Hibernate O Hibernate vem com uma poderosa linguagem de consulta HQL que muito parecida com o SQL No entanto comparado com o SQL o HQL totalmente orientado objetos e compreende no es de heran a polimorfismo e associa es 15 1 Diferencia o de mai scula e min scula As Consultas n o diferenciam mai scula de min scula exceto pelo nomes das classes e propriedades Java Portanto seLecT o mesmo que sELEct que o mesmo que SELECT mas org hibernate eg Foo nao org hibernate eg Foo foo barset n o foo BARSET Esse manual usa as palavras chave HQL em letras min sculas Alguns usu rios acreditam que com letras mai sculas as consultas ficam mais leg veis mas n s acreditamos que este formato n o apropriado para o c digo Java 15 2 A cl usula from A consulta mais simples poss vel do Hibernate a seguinte from eg Cat Isto simplesmente retornar todas as inst ncias da classe eg cat Geralmente n o precisamos qualificar o nome da classe uma vez que O auto import o padr o Por exemplo from Cat Com o objetivo de referir se ao cat em outras partes da consulta voc precisar determinar um alias Por exemplo from Cat as cat Essa consulta atribui um alias a cat para as inst ncias de cat portanto poderemos usar esse alias mais tarde na consult
88. filtro de cole o para saber seu tamanho sem inicializ la Integer s createFilter collection select count list get 0 intValue O m todo createrilter usado tamb m para retornar algus dados de uma cole o eficientemente sem precisar inicializar a cole o inteira s createFilter lazyCollection setFirstResult 0 setMaxResults 10 list 20 1 5 Usando busca em lote O Hibernate pode fazer uso eficiente de busca em lote ou seja o Hibernate pode carregar diversos proxies n o inicializados se um proxy for acessado ou cole es A busca em lote uma otimiza o da estrat gia da busca de sele o lazy Existem duas maneiras para voc usar a busca em lote no n vel da classe ou no n vel da cole o A recupera o em lote para classes entidades mais f cil de entender Imagine que voc tem a seguinte situa o em tempo de execu o voc tem 25 inst ncias de cat carregadas em uma Session Cada cat possui uma refer ncia ao seu owner que da classe Person A classe Person mapeada com um proxy lazy true Se voc interar sobre todos os Cat s e chamar getOwner em cada o Hibernate ir por padr o executar 25 comandos sELECT para buscar os proxies de owners Voc pode melhorar esse comportamento especificando um batch size no mapeamento da classe Person lt class name Person batch size 10 Ra ielas s O Hibernate ir executar agora apenas tr s c
89. fun o 1azy no seu mapeamento de propriedade lt class name Document gt lt id name id gt lt generator class native gt lt id gt lt property name name not null true length 50 gt lt property name summary not null true length 200 lazy true gt lt property name text not null true length 2000 lazy true gt lt class A carga de propriedades lazy requer instrumenta o de bytecode Se suas classes persistentes n o forem melhoradas o Hibernate ir ignorar silenciosamente essa configura o e usar a busca imediata Para instrumenta o de bytecode use a seguinte tarefa do Ant lt target name instrument depends compile gt lt taskdef name instrument classname org hibernate tool instrument InstrumentTask gt lt classpath path jar path gt lt classpath path classes dir gt lt classpath refid lib class path gt lt taskdef gt lt instrument verbose true gt lt fileset dir testclasses dir org hibernate auction model gt lt include name class gt lt molecet gt lt instrument gt lt target Uma forma diferente de evitar leitura de coluna desnecess ria ao menos para transa es de somente leitura deve se usar os recursos de proje o do HQL ou consultas por Crit rio Isto evita a necessidade de processamento de bytecode em build time e certamente uma melhor solu o Voc pode for ar a busca antecipada comum de proprie
90. garante o relacionamento entre identidade persistente e identidade Java 2 3 Integra o JMX JMX o padr o do J2EE para manipula o de componentes Java O Hibernate pode ser manipulado por um servi o JMX padr o N s fornecemos uma implementa o do MBean na distribui o org hibernate jmx HibernateService Para um exemplo de como implementar o Hibernate como um servi o JMX em um Servidor de Aplicativo JBoss por favor consulte o Guia do Usu rio do JBoss No JBoss As voc poder ver os benef cios de se fazer a implementa o usando JMX Session Management O ciclo de vida de uma session do Hibernate pode ser automaticamente conectada a um escopo de transa o JTA Isso significa que voc n o precisar mais abrir e fechar manualmente uma session isso se torna uma tarefa para um interceptor EJB do JBoss Voc tamb m n o precisar mais se preocupar com demarca o de transa o em seu c digo caso voc prefira escrever uma camada persistente port vel use a API opcional do Hibernate Transaction Voc deve chamar HibernateContext para acessar uma Session HAR deployment Normalmente voc implementa o servi o JMX do Hibernate usando um servi o descritor de implementa o do JBoss em um EAR e ou arquivo SAR que suporta todas as configura es comuns de uma sessionFactory do Hibernate Entretanto voc ainda precisa nomear todos os seus arquivos de mapeamento no descritor de implementa o Se voc decidir
91. gera o autom tica do esquema EE rowia opcional O Hibernate poder usar as ent o chamadas ROWIDs em bancos de dados que a suportam Por exemplo no Oracle o Hibernate pode utilizar a coluna extra rowid para atualiza es mais r pidas se voc configurar esta op o para rowid Um ROWID uma implementa o que representa de maneira detalhada a localiza o f sica de uma determinada tuple armazenada E subselect opcional Mapeia uma entidade imut vel e somente de leitura para um subconjunto do banco de dados til se voc quiser ter uma vis o ao inv s de uma tabela Veja abaixo para mais informa es E abstract opcional Utilizada para marcar superclasses abstratas em hierarquias lt union E E subclass gt perfeitamente aceit vel uma classe persitente nomeada ser uma interface Voc dever ent o declarar as classes implementadas desta interface utilizando o elemento lt subclass gt Voc pode persistir qualquer classe interna est tica Voc dever especificar o nome da classe usando a forma padr o por exemplo eg Foo Bar Classes imut veis mutable false n o podem ser modificadas ou exclu das pela aplica o Isso permite que o Hibernate aperfei oe o desempenho A fun o opcional proxy habilita a inicializa o lazy das inst ncias persistentes da classe O Hibernate ir retornar CGLIB proxies como implementado na interface nomeada O objeto persistente atual ser carregado quando um m
92. gt lt generator class native gt lt id gt lt set name people inverse true table PersonAddress gt lt key column addressId gt lt many to many column personId class Person gt lt set gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null addressId bigint personiId addressId create table Address addressId bigint not null primary key not mele addressId bigint not null primary key 140 Mapeamento de associa es mais complexas 7 6 Mapeamento de associa es mais complexas Uni es de associa es mais complexas s o extremamente raras O Hibernate possibilita o tratamento de mapeamentos mais complexos usando fragmentos de SQL embutidos no documento de mapeamento Por exemplo se uma tabela com informa es de dados hist ricos de uma conta define as colunas accountNumber effectiveEndDate effectiveStartDate mapeadas assim como segue lt properties name currentAccountKey gt lt property name accountNumber type string not null true gt lt property name currentAccount type boolean gt lt formula gt case when effectiveEndDate is null then 1 else 0 end lt formula gt lt property gt lt properties gt lt property name effectiveEndDate type date gt lt property name effectiveStateDate type date not null true gt Ent o n s podemos mapear uma associa
93. http www w3 0rg 2001 XMLSchema instance xsi schemaLocation http maven apache org POM 4 0 0 http maven apache org xsd maven 4 0 0 xsd gt lt modelVersion gt 4 0 0 lt modelVersion gt lt groupId gt org hibernate tutorials lt groupld gt lt artifactId gt hibernate tutorial lt artifactId gt lt version gt 1 0 0 SNAPSHOT lt version gt lt name gt First Hibernate Tutorial lt name gt lt build gt lt i we dont want the version to be part of the generated war file name gt lt finalName gt artifactId lt finalName gt lt build gt lt dependencies gt lt dependency gt lt groupId gt org hibernate lt groupId gt lt sartitactIra gt hibernate core lt artifactId gt lt dependency gt lt Because this is a web app we also have a dependency on the servlet api gt lt dependency gt lt groupId gt javax servlet lt groupId gt lt artifactId gt servlet api lt artifactId gt lt dependency gt lt l Hibernate mses slf4j for logging for our purposes here use Ene simple backend gt lt dependency gt lt groupId gt org slf4j lt groupId gt Santi fact rd gt slf4j simple lt artifactId gt lt dependency gt lt Hibernate gives you a choice of bytecode providers between cglib and javassist gt lt dependency gt lt groupId gt javassist lt groupId gt lt artiftactrd gt javassist lt artifactId gt A primeira Classe lt depende
94. interceptador no escopo de sessionFactory deve ser thread safe Cetifique se de n o armazenar fun es de estado espec ficos da sess o pois provavelmente m ltiplas sess es ir o utilizar esse interceptador simultaneamente new Configuration setInterceptor new AuditInterceptor 13 2 Sistema de Eventos Se voc precisar executar uma a o em determinados eventos da camada de persist ncia voc tamb m pode usar a arquitetura de eventdo Hibernate3 Um evento do sistema pode ser utilizado como complemento ou em substitui o a um interceptador Essencialmente todos os m todos da interface session possuem um evento correlacionado Se voc tiver um LoadEvent UM LoadEvent etc Consulte o DTD do XML de arquivo deconfigura o ou o pacote org hibernate event para a lista completa dos tipos de eventos Quando uma requisi o feita em um desses m todos a session do hibernate gera um evento apropriado e o envia para o listener de evento correspondente quele tipo de evento Esses listeners implementam a mesma l gica que aqueles m todos trazendo os mesmos resultados Entretanto voc livre para implementar uma customiza o de um desses listeners isto O LoadEvent processado pela implementa o registrada da interface LoadEventListener ent o sua implementa o vai ficar respons vel por processar qualquer requisi o loaa feita pela session Para todos os efeitos esses listeners devem ser c
95. isolamento para as conex es JDBC e ent o deixar simplesmente o banco de dados fazer todo o trabalho Entretanto os usu rios avan ados podem s vezes desejar obter bloqueios pessimistas exclusivos ou re obter bloqueios no in cio de uma nova transa o O Hibernate usar sempre o mecanismo de bloqueio da base de dados nunca bloquiar objetos na mem ria A classe LockMode define os diferentes n veis de bloqueio que o Hibernate pode adquirir Um bloqueio obtido pelos seguintes mecanismos LockMode WRITE adquirido automaticamente quando o Hibernate atualiza ou insere uma linha LockMode UPGRADE pode ser adquirido explicitamente pelo usu rio usando SELECT FOR UPDATE em um banco de dados que suporte essa sint xe LockMode UPGRADE_NOWAIT pode ser adquirido explicitamente pelo usu rio usando SELECT FOR UPDATE NOWAIT no Oracle LockMode READ adquirido automaticamente quando o Hibernate l dados em um n vel de Leitura Repetida ou isolamento Serializ vel Pode ser readquirido explicitamente pelo usu rio 200 Modos para liberar a conex o LockMode NONE representa a aus ncia do bloqueio Todos os objetos mudam para esse estado de bloqueio no final da Transaction Objetos associados com a sess o atrav s do m todo update OU saveorUpdate tamb m s o inicializados com esse modo de bloqueio O bloqueio obtido explicitamente pelo usu rio
96. minAmount order by sum price amount desc Que monstro Na verdade na vida real eu nao sou muito afeigoado a subconsultas entao minha consulta seria mais parecida com isto select order id sum price amount count item from Order as order join order lineItems as item join item product as product Catalog as catalog join catalog prices as price where order paid false and order customer customer and price product product and catalog currentCatalog group by order having sum price amount gt minAmount order by sum price amount desc A pr xima consulta conta o n mero de pagamentos em cada status excluindo todos os pagamentos no status AWAITING_APPROVAL onde a mais recente mudan a de status foi feita pelo usu rio atual Traduz se para uma consulta SQL com duas uni es inteiras e uma subsele o correlacionada nas tabelas PAYMENT PAYMENT STATUS PAYMI select count payment status name from Payment as payment join payment currentStatus as status join payment statusChanges as statusChange where payment status name lt gt PaymentStatus AWNAITING APPROVAL or Fl ENT_STATUS_CHANG 230 Exemplos de HQL statusChange timeStamp select max change timeStamp from PaymentStatusChange change where change payment payment and statusChange user lt iCunrentusemr group by status name status sortOrder order by status sortOrder Se eu tivesse mapeado a cole
97. n s temos de completar a instala o com algum c digo de infraestrutura Voc precisa inicializar o Hibernate pela constru o de um objeto org hibernate SessionFactory global e o armazenamento dele em algum lugar de f cil acesso para o c digo da aplica o O org nibernate SessionFactory usado para obter inst ncias org nibernate Session O org hibernate Session representa uma unidade de single threaded de trabalho O org hibernate SessionFactory um objeto global thread safe instanciado uma vez Criaremos uma classe de ajuda Hibernateutil que cuida da inicializa o e faz acesso a uma org hibernate SessionFactory mais conveniente package org hibernate tutorial util import org hibernate SessionFactory import org hibernate cfg Configuration public class HibernateUtil private static final SessionFactory sessionFactory buildSessionFactory 10 Carregando e salvando objetos private static SessionFactory buildSessionFactory try Create the SessionFactory from hibernate cfg xml return new Configuration configure buildSessionFactory catch Throwable ex Make sure you log the exception as it might be swallowed System err println Initial SessionFactory creation failed ex throw new ExceptionInInitializerError ex public static SessionFactory getSessionFactory return sessionFactory Salve este c digo como src main java org hibernate tutorial util Hibernat
98. name node name gt lt property name firstName node first name gt lt property name initial node initial gt lt property name lastName node last name gt lt component gt lt class gt Nesse caso decidimos incorporar a cole o de ids de contas e n o os dados de contas Segue a abaixo a consulta HQL from Customer c left join fetch c accounts where c lastName like lastName 263 Capitulo 19 Mapeamento XML Retornaria um conjunto de dados como esse lt customer id 123456789 gt lt account short desc Savings gt 987632567 lt account gt lt account short desc Credit Card gt 985612323 lt account gt lt name gt lt first name gt Gavin lt first name gt lt initial gt A lt initial gt lt last name gt King lt last name gt lt name gt lt customer gt Se voc ajustar embed xml true em um pareceriam com o seguinte lt customer id 123456789 gt mapeamento lt account id 987632567 short desc Savings gt lt customer id 123456789 gt lt balance gt 100 29 lt balance gt lt account gt lt account id 985612323 short desc Credit Card gt lt customer id 123456789 gt lt balance gt 2370 34 lt balance gt lt account gt lt name gt lt first name gt Gavin lt first name gt lt ipitial gt A lt initial gt lt last name gt King lt last name gt lt name gt lt customer gt 19 3 Manipul
99. o utilizar estes m todos Geralmente update OU saveorUpdate s o utilizados nos seguintes cen rios a aplica o carrega um objeto na primeira sess o o objeto passado para a camada UI algumas modifica es s o feitas ao objeto o objeto retornado camada l gica de neg cios a aplica o persiste estas modifica es chamando update em uma segunda sess o saveorUpdate faz o seguinte se o objeto j estiver persistente nesta sess o n o fa a nada se outro objeto associado com a sess o possuir o mesmo identificador jogue uma exce o se o objeto n o tiver uma propriedade de identificador salve o e se o identificador do objeto possuir o valor atribu do ao objeto recentemente instanciado salve o e se o objeto for versionado por um lt version gt OU lt timestamp gt e o valor da propriedade da vers o for o mesmo valor atribu do ao objeto recentemente instanciado salve O mesmo 170 Apagando objetos persistentes e do contr rio atualize o objeto e amesclagem bastante diferente se existir uma inst ncia persistente com um mesmo identificador associado atualmente com a sess o copie o estado do objeto dado para a inst ncia persistente se n o existir uma inst ncia persistente atualmente associada com a sess o tente carreg la a partir do banco de dados ou crie uma nova inst ncia persistente a inst ncia persistente retornada a in
100. o Hibernate ir chamar os m todos get set da propriedades Se voc especificar access field o Hibernate ir bipassar os metodos get set acessando o campo diretamente usando reflex o Voc pode especificar sua pr pria estrat gia para acesso da propriedade criando uma classe que implemente a interface org hibernate property PropertyAccessor Um recurso especialmente poderoso o de propriedades derivadas Estas propriedades s o por defini o somente leitura e o valor da propriedade calculado em tempo de execu o Voc declara este c lculo como uma express o SQL que traduz para cl usula seLECT de uma subconsulta da consulta SQL que carrega a inst ncia lt property name totalPrice formula SELECT SUM li quantity p price FROM LineItem li Product p WHERE li productId p productId AND li customerId customerId AND li orderNumber orderNumber gt Observe que voc pode referenciar as entidades da pr pria tabela atrav s da n o declara o de um alias para uma coluna particular Isto seria O customer Ta no exemplo dado Observe tamb m que voc pode usar o mapeamento de elemento aninhado lt formula gt se voc n o gostar de usar o atributo 5 1 12 Muitos para um Uma associa o ordin ria para outra classe persistente declarada usando o elemento many to one O modelo relacional uma associa o muitos para um uma chave exterior de uma tabela referenciando as colunas da chave p
101. o ir carregar o arquivo DTD da web e sim da classpath da aplica o O arquivo DTD est inclu do no hibernate core jar como tamb m no hibernate3 jar caso usando a vincula o de distribui o Ss Importante N s omitiremos a declara o do DTD nos exemplos futuros para encurtar o c digo Isto claro n o opcional Entre as duas tags hibernate mapping inclua um elemento class Todas as classes persistentes da entidade novamente poder haver mais tarde depend ncias sobre as classes que n o s o classes prim rias de entidades necessitam do tal mapeamento para uma tabela na base de dados SQL lt hibernate mapping package org hibernate tutorial domain gt lt class name Event table EVENTS gt lt class gt lt hibernate mapping gt At agora informamos o Hibernate sobre como fazer para persistir e carregar objetos da classe Event da tabela EVENTS cada instancia representada por uma coluna na tabela Agora continuaremos com o mapeamento de uma nica propriedade identificadora para as chaves prim rias da tabela Al m disso como n o precisamos nos preocupar em manipular este identificador iremos configurar uma estrat gia de gera o de id s do Hibernate para uma coluna de chave prim ria substituta lt hibernate mapping package org hibernate tutorial domain gt lt class name Event table EVENTS gt lt id name id column EVENT_ID gt lt generator class native
102. o para false Especifica que este componente deve ter uma busca lazy quando a fun o for acessada pela primeira vez Isto requer instrumenta o bytecode de tempo de constru o optimistic lock opcional padr o para true Especifica que atualiza es para este componente requerem ou n o aquisi o de um bloqueio otimista Em outras palavras determina se uma vers o de incremento deve ocorrer quando esta propriedade estiver suja unique opcional valor padr o false Especifica que existe uma unique restri o em todas as colunas mapeadas do componente A tag filha lt property gt acrescenta a propriedade de mapeamento da classe filha para colunas de uma tabela O elemento lt component gt permite um sub elemento lt parent gt mapeie uma propriedade da classe do componente como uma referencia de volta para a entidade que o cont m 92 Propriedades The lt dynamic component gt element allows a Map to be mapped as a component where the property names refer to keys of the map See Se o 8 5 Componentes Din micos for more information 5 1 16 Propriedades O elemento lt properties gt permite a defini o de um grupo com nome l gico de propriedades de uma classe A fun o mais importante do construtor que ele permite que a combina o de propriedades seja o objetivo de uma property re tamb m um modo conveninente para definir uma restri o nica de m ltiplas colunas Por exemplo
103. objeto Transaction do Hibernate Session sess factory openSession try set transaction timeout to 3 seconds sess getTransaction setTimeout 3 sess getTransaction begin do some work sess getTransaction commit catch RuntimeException e sess getTransaction rollback throw e or display error message finally sess close 196 Controle de concorr ncia otimista Veja que set Timeout n o pode ser chamado em um bean CMT onde o tempo de espera das transa es deve ser definido declaradamente 12 3 Controle de concorr ncia otimista O nico caminho que consistente com a elevada concorr ncia e escalabilidade o controle de concorr ncia otimista com versionamento A checagem de vers o usa n mero de vers o ou carimbo de hora timestamp para detectar conflitos de atualiza es e para impedir atualiza es perdidas O Hibernate fornece tr s caminhos poss veis para escrever aplica es que usam concorr ncia otimista Os casos de uso que n s mostramos est o no contexto de conversa es longas mas a checagem de vers o tamb m tem o benef cio de impedir atualiza es perdidas em nicas transa es 12 3 1 Checagem de vers o da aplica o Em uma implementa o sem muita ajuda do Hibernate cada intera o com o banco de dados ocorre em uma nova session e o desenvolvedor respons vel por recarregar todas as inst ncias persistentes da base de dados an
104. para maiores detalhes 33 Capitulo 2 Arquitetura org hibernate context ManagedSessionContext As sess es atuais sao rastreadas por uma thread de execu o Entretanto voc respons vel por vincular e desvincular uma inst ncia session com m todos est ticos nesta classe que nunca abre libera ou fecha uma Session The first two implementations provide a one session one database transaction programming model This is also known and used as session per request The beginning and end of a Hibernate session is defined by the duration of a database transaction If you use programmatic transaction demarcation in plain JSE without JTA you are advised to use the Hibernate Transaction API to hide the underlying transaction system from your code If you use JTA you can utilize the JTA interfaces to demarcate transactions If you execute in an EJB container that supports CMT transaction boundaries are defined declaratively and you do not need any transaction or session demarcation operations in your code Refer to Cap tulo 12 Transa es e Concorr ncia for more information and code examples O par metro de configura o hibernate current session context class define qual implementa o org nibernate context CurrentSessionContext deve ser usada Note que para compatibilidade anterior se este par metro de configura o n o for determinado mas um org hibernate transaction TransactionManagerLookup for configurado Hibern
105. preservando o valor da sem ntica de tipos para todas as propriedades lt cla ss name Person table PERSON gt lt id name id column PERSON ID e gt lt join table ADDRESS gt lt key column ADDRESS ID gt lt property name address gt lt property name zip gt lt property name country gt SON Esta caracter stica til apenas para modelos de dados legados N s recomendamos menos tabelas do que classes e um modelo de dom nio fine grained Por m til para ficar trocando entre estrat gias de mapeamento de heran a numa hierarquia simples como explicaremos mais a frente 5 1 21 Key Vimos que o elemento lt key gt chave surgiu algumas vezes at agora Ele aparece em qualquer lugar que o elemento pai define uma jun o para a nova tabela e define a chave exterior para a tabela associada Ele tamb m referencia a chave prim ria da tabela original lt key column columnname on delete noaction cascade property ref propertyName not null true false 00000 update true false 98 Elementos coluna e f rmula unique true false 6 column opcional O nome da coluna da chave exterior Isto pode tamb m ser especificado atrav s de elementos aninhados lt column gt on delete opcional padr o para noact ion Especifica se a restri o da chave exterior no banco de dados est habilitada para o deletar cascade property ref opcional Espec
106. recuperada quando o propriet rio for carregado Lazy collection fetching a cole o recuperada quando a aplica o invoca uma opera o sobre aquela cole o Esse o padr o para cole es Extra lazy collection fetching elementos individuais de uma cole o s o acessados a partir do banco de dados quando necess rio O Hibernate tenta n o buscar a cole o inteira dentro da mem ria a menos que seja absolutamente necess rio Isto indicado para cole es muito grandes Proxy fetching uma associa o de um valor carregada quando um m todo diferente do getter do identificador invocado sobre o objeto associado No proxy fetching uma associa o de um nico valor recuperada quando a vari vel da inst ncia acessada Comparada busca proxy esse m todo menos pregui oso 267 Capitulo 20 Aumentando o des lazy a associa o buscada at mesmo quando somente o identificador acessado Ela mais transparente j que n o h proxies vis veis para a aplica o Esse m todo requer instrumenta o de bytecodes em build time e raramente necess rio Lazy attribute fetching um atributo ou associa o de um valor buscado quanto a var avel da inst ncia acessada Esse m todo requer instrumenta o de bytecodes em build time e raramente necess rio N s temos aqui duas no es ortogonais quando a associa o buscada e como ela buscada importa
107. regionais voc poder recuperar os nomes de lista de entidades cole es consultas e caches regionais com os seguintes m todos getQueries getEntityNames getCollectionRoleNames getSecondLevelCacheRegionNames 287 288 Guia de Toolset poss vel realizar uma engenharia de roundtrip com o Hibernate usando um conjunto de plug ins de Eclipse ferramentas de linha de comando assim como tarefas Ant As Ferramentas do Hibernate atualmente incluem os plug ins para o IDE de Eclipse assim como as tarefas para reverter a engenharia dos bancos de dados existentes Editor de Mapeamento um editor para mapeamento de arquivos XML do Hibernate suportando a auto complex o e destaque de sint xe Ele tamb m suporta a auto complex o da sem ntica para nomes de classes e nomes de propriedade campo fazendo com que ele seja mais vers til do que um editor XML normal Console o console uma nova vis o em Eclipse Al m disso para uma vis o geral de rvore de suas configura es de console voc tamb m pode obter uma vis o interativa de suas classes persistentes e seus relacionamentos O console permite que voc execute as consultas HQL junto ao banco de dados e navegue o resultado diretamente em Eclipse Assistentes de Desenvolvimento s o oferecidos diversos assistentes com as ferramentas de Eclipse do Hibernate Voc pode usar o assistente para gerar rapidamente arquivos de configura o
108. sem ntica de persist ncia ainda s o diferentes Um mapeamento de elemento composto n o suporta propriedades capazes de serem null se voc estiver usando um lt set gt N o existe coluna chave prim ria separada na tabela de elemento composto O Hibernate tem que usar cada valor das colunas para identificar um registro quando estiver deletando objetos que n o poss vel com valores null Voc tem que usar um dos dois ou apenas propriedades n o null em um elemento composto ou escolher uma lt list gt lt map gt lt bag gt OU lt idbag gt 145 Capitulo 8 Mapeamento de Com Um caso especial de elemento composto um elemento composto com um elemento lt many to one gt aninhado Um mapeamento como este permite que voc mapeie colunas extras de uma tabela de associa o de muitos para muitos para a classe de elemento composto A seguinte associa o de muitos para muitos de order para um Item onde purchaseDate price e quantity s o propriedades da associa o selassiname Cca Orden nen gt lt set name purchasedItems table purchase_items lazy true gt lt key column order_id gt lt composite element class eg Purchase gt lt property name purchaseDate gt lt property name price gt lt property name quantity gt lt many to one name item class eg Item gt lt class attribute is optional gt lt composite element gt lt set gt lt class gt N o pode haver uma r
109. tabela de uni o algo bastante incomum mas poss vel lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt join table PersonAddress optional true gt lt key column personId unique true gt lt many to one name address column addressId not null true unique true gt lt join gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt join table PersonAddress optional t rue 139 Capitulo 7 Mapeamento de ass inverse true gt lt key column addressId unique true gt lt many to one name person column personId not null true unique true gt lt join gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null primary key unique create table Address addressId bigint not null primary key 7 5 3 Muitos para muitos Finalmente n s temos uma associa o bidirecional de muitos para muitos lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt set name addresses table PersonAddress gt lt key column personId gt lt many to many column addressId class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressId
110. type long column ID gt lt generator class sequence gt lt id gt ll islaisue joeiejveicieskes gt lt class gt lt hibernate mapping gt public class CustomMapTuplizerImpl extends org hibernate tuple entity DynamicMapEntityTuplizer override the buildInstantiator method to plug in our custom map protected final Instantiator buildInstantiator org hibernate mapping PersistentClass mappingInfo return new CustomMapInstantiator mappingInfo private static final class CustomMapInstantiator extends org hibernate tuple DynamicMapInstantitor override the generateMap method to return our custom map protected final Map generateMap return new CustomMap 62 EntityNameResolvers 4 6 EntityNameResolvers A interface org hibernate EntityNameResolver um contrato para resolver o nome da entidade de uma instancia de entidade dada A interface define um resolveEntityName de m todo nico que passado inst ncia de entidade e esperado a retornar ao nome de entidade apropriado nulo permitido e indicaria que o solucionador n o saiba como resolver o nome de entidade da inst ncia de entidade dada Normalmente um org hibernate EntityNameResolver ser mais til no caso de modelos din micos Um exemplo poder ser usado nas interfaces com proxie no caso dos modelos din micos O hibernate test suite possui um exemplo deste estilo exato de uso sob o org hibernate test dynami
111. unique_key unique_key_id length L precision P scale g name O nome da propriedade iniciando com letra min scula column opcional padr o para o nome da propriedade O nome da coluna mapeada do banco de dados Isto pode tamb m ser especificado pelo s elemento s lt column gt aninhados type opcional um nome que indica o tipo de Hibernate update insert opcional padr o para true especifica que as colunas mapeadas devem ser inclu das nas instru es SQL de UPDATE e ou INSERT Ajustar ambas para false permite uma propridade derivada pura cujo valor inicializado de outra propriedade que mapeie a mesma coluna s ou por uma disparo ou outra aplica o formula opcional uma instru o SQL que definie o valor para uma propriedade calculada Propriedades calculadas n o possuem uma coluna de mapeamento para elas access Opcional padr o para property estrat gia que o Hiberante deve utilizar para acessar o valor da propriedade lazy opcional padr o para false Especifica que esta propriedade deve ser atingida de forma lenta quando a inst ncia da vari vel acessada pela primeira vez Isto requer instrumenta o bytecode em tempo de cria o unique opcional Habilita a gera o de DDL de uma nica restri o para as colunas Da mesma forma permita que isto seja o alvo de uma property ref not null1 opcional Habilita a gera o de DDL de uma restri o de nulidade para as colun
112. update false a public char getSex return sex void setSex char sex this sex sex Veja o web site do Hibernate para maiores detalhes sobre um XDoclet e Hibernate 5 5 2 Usando as anota es JDK 5 0 O JDK 5 0 introduziu as anota es estilo XDoclet em n vel de linguagem tipo seguro e checado em tempo de compila o Este mecanismo mais potente do que as anota es XDoclet e melhor 108 Propriedades geradas suportado pelas ferramentas e IDEs O IntelliJ IDEA por exemplo suporta a auto complex o e destaque da sintaxe das anota es JDK 5 0 A nova revis o da especifica o EJB JSR 220 usa as anota es JDK 5 0 como mecanismos de metadados para beans de entidade O Hibernate3 implementa O EntityManager do JSR 220 o API de persist ncia O suporte para mapear metadados est dispon vel atrav s do pacote Anota es do Hibernate como um download separado Ambos os EJB3 JSR 220 e o metadado Hibernate3 s o suportados Este um exemplo de uma classe POJO anotado como um bean de entidade EJB Entity access AccessType FIELD public class Customer implements Serializable GId Long id String firstName String lastName Date birthday Transient Integer age Embedded private Address homeAddress OneToMany cascade CascadeType ALL JoinColumn name CUSTOMER_ID Set lt Order gt orders Getter setter and business methods Nota Note que o suporte para Anota
113. usar a implementa ao opcional HAR o JBoss ir automaticamente detectar todos os seus arquivos de mapeamento no seu arquivo HAR 32 Suporte JCA Consulte o manual do usu rio do JBoss AS para obter maiores informa es sobre essas op es Another feature available as a JMX service is runtime Hibernate statistics See Se o 3 4 6 Estat sticas do Hibernate for more information 2 4 Suporte JCA O Hibernate pode tamb m ser configurado como um conector JCA Por favor visite o website para maiores detalhes Observe tamb m que o suporte do JCA do Hibernate ainda considerado experimental 2 5 Sess es Contextuais A maioria das aplica es que usa o Hibernate necessita de algum tipo de sess o contextual onde uma sess o dada na verdade um escopo de um contexto Entretanto atrav s de aplica es a defini o sobre um contexto geralmente diferente e contextos diferentes definem escopos diferentes Aplica es usando vers es anteriores ao Hibernate 3 0 tendem a utilizar tanto sess es contextuais baseadas em ThreadLocal classes utilitarias como Hibernateutil ou utilizar frameworks de terceiros como Spring ou Pico que prov sess es contextuais baseadas em proxy A partir da vers o 3 0 1 o Hibernate adicionou o m todo SessionFactory getCurrentSession Inicialmente este considerou o uso de transa es JTA onde a transa o JTA definia tanto o escopo quanto o contexto de uma sess o atual
114. use identifier rollback hibernate use sql comments Prop sito eg valores recomendados 4 8 16 Determina um modo padr o para representa o de entidade para todas as sess es abertas desta sessionFactory dynamic map dom4j pojo For a o Hibernate a ordenar os updates SQL pelo valor da chave prim ria dos tens a serem atualizados Isto resultar em menos deadlocks nas transa es em sistemas altamente concorrente e g true false Se habilitado o Hibernate coletar estat sticas teis para o ajuste do desempenho e g true false Se habilitado propriedades identificadoras geradas ser o zeradas para os valores padr o quando os objetos forem apagados e g true false Se ligado o Hibernate ir gerar coment rios dentro do SQL para facilitar a depura o o valor padr o false e g true false Tabela 3 4 JDBC Hibernate e Propriedades de Conex o Nome da Propriedade hibernate jdbc fetch_size hibernate jdbc batch_size hibernate jdbc batch versioned data Prop sito Um valor maior que zero determina o tamanho da buscado JDBC chamadas Statement setFetchSize Um valor maior que zero habilita o uso das atualiza es em lotes JDBC2 pelo Hibernate ex valores recomentados entre 5 e 30 Set this property to true if your JDBC driver returns correct row counts from executeBatch It is usually safe to turn this option on Hibernate will then use batched DML
115. usu rio com estados persistentes s o entidades Um componente uma classe de usu rio definida com valores sem nticos Uma propriedade de Java de tipo java lang String tamb m tem um valor sem ntico Dada esta defini o n s podemos dizer que todos os tipos classes fornecidos pelo JDK t m tipo de valor sem ntico em Java enquanto que tipos definidos pelo usu rio podem ser mapeados com entidade ou valor de tipo sem ntico Esta decis o pertence ao desenvolvedor da aplica o Uma boa dica para uma classe de entidade em um modelo de dom nio s o refer ncias comuns para uma inst ncia simples daquela classe enquanto a composi o ou agrega o geralmente se traduz para um tipo de valor Iremos rever ambos os conceitos durante todo o guia de refer ncia O desafio mapear o sistema de tipo de Java e a defini o do desenvolvedor de entidades e tipos de valor para o sistema de tipo SQL banco de dados A ponte entre ambos os sistemas fornecida pelo Hibernate Para entidades que usam lt class gt lt subclass gt e assim por diante Para tipos de valores n s usamos lt property gt lt component gt etc geralmente com uma fun o type O valor desta fun o o nome de um tipo de mapeamento do Hibernate O Hibernate fornece muitos mapeamentos imediatos para tipos de valores do JDK padr o Voc pode escrever 102 Valores de tipos basicos os seus pr prios tipos de mapeamentos e implementar sua estrat gia de
116. 1 1 7 Carregando e salvando objetos We are now ready to start doing some real work with Hibernate Let s start by writing an EventManager class with a main method package org hibernate tutorial import org hibernate Session 11 Capitulo 1 Tutorial import ama uti import org hibernate tutorial domain Event import org hibernate tutorial util HibernateUtil public class EventManager public static void main String args EventManager mgr new EventManager if args 0 equals store mgr createAndStoreEvent My Event new Date HibernateUtil getSessionFactory close private void createAndStoreEvent String title Date theDate Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction Event theEvent new Event theEvent setTitle title theEvent setDate theDate session save theEvent session getTransaction commit Em createAndStoreEvent Criamos um novo objeto de Event e passamos para o Hibernate O Hibernate sabe como tomar conta do SQL e executa INSERTS no banco de dados A org hibernate Session is designed to represent a single unit of work a single atomic piece of work to be performed For now we will keep things simple and assume a one to one granularity between a Hibernate org hibernate Session and a database transaction To shield our code from the actual underlying transaction system we use the H
117. 112 Mukos para UM arinrin E a 86 S113 UMPA AUM soene nE E EER EREE ERAKO ERER EEEE 89 Sk a Naa ea E E AN 91 5 1 15 Componente e componente din mico 92 9 1 16 Propriedades usas lusa cacteca dexcteudecdetctis dra pien ras aa deucdewaeedetenu EEA EREE ES 93 5172 SUDCIASS aaien itanna aaa Eaa a aaa AGE ADIA heat ES nanda 94 5 1 18 Subclasses Unidas deriou iaa aa na aa a E Aa aAA 95 5 1 19 Subclasse de Uni o ee ceaeaeaaeeeeeeeeseceaaaaaaeeeeeeeeaeaae 96 51 20 WMA oionn euiet Si lie Gellaca a haiede elena ee et 97 B 1 2 KOY ssc cases E E EE E Tdi und e 98 5 1 22 Elementos coluna e f rmula serraria 99 D 1 295 IMPpOMAR coset goes cuaihno lodo states bh ASAA nn Cage URSS thks peaeina A E 100 D N24 Any sierainten pegue aaa aaa Shien al abiasiea deb na sb n Oaa Ae 100 5 2 Tipos do Hib rnaie sorar i sims paisalabufso cimapafas rapa as mapa dis cdsdyie ated nae eis 102 5 2 1 Entidades VAlOroS essri ER EEEREN 102 5 2 2 Valores de tipos b sicos ee eeeeeeeeeeeeeeeaeaaeaneeeeeeeeeeeaaeaaenees 103 5 2 3 Tipos de valores personalizados ccceceeeeeeeeeeeeeeeeeeeeeeeeaeaaeeeeeeeeeees 104 5 3 Mapeando uma classe mais de uma vez 105 5 4 Identificadores quotados do SQL ii eeeearerraraa ana 106 5 5 Alternativas de Metadados eee ee ee centres cena eee ee aaeeeeeeaaeeeeeeaaeeeeeeaa 106 5 5 1 Usando a marca o XDocl
118. 2 Especificando somente um mapeamento XML eee 262 19 2 Mapeando metadados com XML errar 262 19 3 Manipulando dados em XML eee rraraa ara 264 20 Aumentando o desempenho eeee cece tee ee ee cate ee senda eeee aaa eeeeaaaeeeeeaaeeeees 267 20 1 Estrat gias de Busca ce eeeaeeeeeeeeeeeeaeaaeeeeeeeeeeeeaeaaeaneeeeeeeeeasaaeaees 267 20 1 1 Trabalhando com associa es pregui osas lazy 268 20 1 2 Personalizando as estrat gias de busca i 269 20 1 3 Proxies de associa o final nico cece eeeeeeeeeeeeeeeeaaeaeeeees 270 20 1 4 Inicializando cole es e proxies erra 272 20 1 5 Usando busca em lote cent eect cette sete ae ee seen aa i Eai 273 20 1 6 Usando busca de subsele o seem 274 20 1 7 Perfis d BUSCA saeccseiewotsadeaeercadustocteswaaacitesaacnsdaesbaccsbuuaest Uaueaudeastabensdets 274 20 1 8 Usando busca pregui osa de propriedade i rrn 276 20 2 O Cach de Segundo N vel ee ae eeeeeeeeeeeeeeaeaaeeeeeeeeeeeeaeaaeaneeeeeees 277 viii 20 2 1 Mapeamento de Cache ee ae ea eeeeeeeeeeeeaeaaaaeeeeeeeeeeeeaaa 278 20 2 2 Estrat gia somente leitura cece ee aeeeeeeeeeeeeeeeaaeaeeeeeseeeeeeaaa 278 20 2 3 Estrat gia leitura escrita ce eeeeeeeeeee
119. 2 Executando a ferramenta errar eraa anna 293 21 1 3 Propriedades serrr kerene EENE EOR eK GERERE RARES 293 21 1 4 Usando O ANE 22 ivesciveeediuliaseccaevetidincuaaeeselvgvedsnicagescalvctddyadtadschannevedeniuadae 294 21 1 5 Atualiza es de esquema incremental ccceeeeeeeeeeeeeeeeeeeeeaeeeeeenees 294 21 1 6 Utilizando Ant para atualiza es de esquema incremental 295 21 1 7 Valida o de esquema ir iiir era aerarranaranaaa 295 21 1 8 Utilizando Ant para valida o de esquema 296 22 Exemplo Pai Filho eec i REKKE EEEE R 297 22 1 Uma nota sobre as cole es sessi kek ennn nn nRa EANAN ARRANA 297 22 2 Bidirecional um para muitos tees aeaaeeeeeeeeeeeeaeaaeaneeeeeeeeeaeaae 297 22 3 Ciclo de vida em Cascata rias e eae rranaa ana 299 22 4 Cascatas e unsaved value ic reraeraraaananaa aaa aranarananaa 301 22 5 CONCIUS O J avieccssaivoctedauvedccadsweccevacwacendivoces vuave deni svocenvadvoccds eveccnvaavedensd Entes 301 23 Exemplo Aplicativo Weblog eae 303 23 1 Classes Persistentes cece ee eeeeeeeeee tees aa eae eeeeeeeeeeaaaaeeeeseeeeeeaaaaeeeees 303 23 2 Mapeamentos Hibernate raras aeee aerea S 304 293 93 C digo Hibernate aspoisngusiasasana promo LEE uda nanda nana a na pede ERG ada abr edees Saa 306 24 Exemplo V rios Mapeamentos
120. 3 1 Cole es escolhidas O Hibernate suporta a implementa o de cole es java util SortedMap java util Sortedset Voc deve especificar um comparador no arquivo de mapeamento lt set name aliases table person_aliases sort natural gt lt key column person gt lt element column name type string gt lt set gt lt map name holidays sort my custom HolidayComparator gt lt key column year_id gt lt map key column hol_name type string gt lt element column hol_date type date gt lt map e Valores permitidos da fun osort S Ounsorted natural e o nome de uma classe implementando java util Comparator Cole es escolhidas na verdade se comportam como java util Treeset java util TreeMap ou 121 Capitulo 6 Mapeamento de col Se voc quiser que o pr prio banco de dados ordene os elementos da cole o use a fun o order by do set bag OU mapeamentos map Esta solu o est dispon vel somente sob JDK 1 4 ou vers es posteriores e implementada usando LinkedHashset OU LinkedHashMap Este desempenha a ordena o na consulta SQL n o em mem ria lt set name aliases table person aliases order by lower name asc gt lt key column person gt lt element column name type string gt lt set gt lt map name holidays order by hol date hol name gt lt key column year id gt lt map key column hol name type string gt lt elemen
121. 312 Autor Trabalho alter table employment_periods add constraint employment_periodsFKO foreign key employer_id references employers alter table employment_periods add constraint employment_periodsFK1 foreign key employee_id references employees create sequence employee_id_seq create sequence employment_id_seq create sequence employer_id_seq 24 2 Autor Trabalho Considere o seguinte modelo de relacionamento entre work Author e Person N s representamos o relacionamento entre Work Author como uma associa o muitos para muitos N s escolhemos representar o relacionamento entre Author Person como uma associa o um para um Outra possibilidade seria ter author estendendo Person id id long id long title String alias String name String getidd long q getidd long getidd long setldtid long setldtid long setldtid long getAuthorsd Set getWorksd Set getNamed String setAuthorstemployees Set setWorkslemployers Set setName name String getTitled String getPersond Person setTitlettitle String setPersoniperson Person getAliasd String set liast alias String tempo float getGenred String setGenrel genre String getTempod float setTempol tempo float getText int setTextitext int O mapeamento do c digo seguinte representa corretamente estes relacionamentos lt hibernate mapping gt lt class name Wor
122. 5 Associa es em chaves alternativas 321 Capitulo 24 Exemplo Varios cascade al1 fetch join gt lt set name accounts inverse true gt lt key column userId property ref userId gt lt one to many class Account gt lt set gt lt property name userId length 8 gt lt class gt lt class name Address gt lt id name id gt lt generator class hilo gt lt id gt lt property name address length 300 gt lt property name zip length 5 gt lt property name country length 25 gt lt many to one name person unique true not null true gt lt class gt lt class name Account gt lt id name accountId length 32 gt lt generator class uuid gt lt id gt lt many to one name user column userId property ref userId gt lt property name type not null true gt otans gt 322 Melhores praticas Escreva classes compactas e mapeie as usando lt component gt Use uma classe Endereco para encapsular rua bairro estado CEP Isto promove a reutiliza o de c digo e simplifica o refactoring Declare propriedades identificadoras em classes persistentes O Hibernate constr i propriedades identificadoras opcionais Existem in meras raz es para utiliz las N s recomendamos que os identificadores sejam sint ticos quer dizer gerados sem significado para neg cios Identifique chaves naturais Identi
123. 6 optional true false gt key sus gt lt property e gt 2 7610 amp table O nome da tabela associada amp schema opcional Sobrep e o nome do esquema especificado pelo elemento ra z lt hibernate mapping gt catalog opcional Sobrep e o nome do cat logo especificado pelo elemento ra z lt hibernate mapping gt 97 Cap itulo 5 Mapeamento O R Basico 4 Por fetch opcional valor padr o join Se ajustado para join o padr o o Hibernate ir usar uma uni o interna para restaurar um join definido por uma classe ou suas subclasses e uma uni o externa para um join definido por uma subclasse Se ajustado para select ent o o Hibernate ir usar uma sele o sequencial para um lt join gt definida numa subclasse que ser emitido apenas se uma linha representar uma inst ncia da subclasse Uni es internas ainda ser o utilizadas para restaurar um lt join gt definido pela classe e suas superclasses inverse opcional padr o para false Se habilitado o Hibernate n o tentar inserir ou atualizar as propriedades definidas por esta uni o optional opcional padr o para false Se habilitado o Hibernate ir inserir uma linha apenas se as propriedades definidas por esta jun o n o forem nulas Isto ir sempre usar uma uni o externa para recuperar as propriedades exemplo a informa o de endere o para uma pessoa pode ser mapeada para uma tabela separada enquanto
124. 65 266 Aumentando o desempenho 20 1 Estrategias de Busca Uma estrat gia de busca a estrat gia que o Hibernate ir usar para recuperar objetos associados se a aplica o precisar navegar pela associa o Estrat gias de Busca podem ser declaradas nos metadados de mapeamento O R ou sobrescritos por uma consulta HQL ou consulta com criteria Hibernate3 define as seguintes estrat gias de busca Join fetching o Hibernate busca o objeto ou cole o associada no mesmo SELECT usando UM OUTER JOIN Select fetching um segundo SELECT usado para buscar a entidade ou cole o associada A menos que voc desabilite a busca lazy especificando 1azy false esse segundo SELECT ser executado apenas quando voc acessar a associa o Subselect fetching um segundo seLECT sera usado para recuperar as cole es associadas de todas as entidades recuperadas em uma consulta ou busca anterior A menos que voc desabilite a busca lazy especificando 1azy false esse segundo SELECT ser executado apenas quando voc acessar a associa o Batch fetching uma op o de otimiza o para selecionar a busca O Hibernate recupera um lote de inst ncias ou entidades usando um nico SELECT especificando uma lista de chaves prim rias ou chaves externas O Hibernate distingue tamb m entre Immediate fetching uma associa o cole o ou fun o imediatamente
125. CacheRegion frontpages abisi hye Se voc quiser for ar um cache de consulta para uma atualiza o de sua regi o independente de quaisquer resultados com cache encontrados nesta regi o voc poder 282 Entendendo o desempenho da Cole o usar org hibernate Query setCacheMode CacheMode REFRESH Juntamente com a regi o que voc definiu para o cache gerado o Hibernate seletivamente for ar os resultados com cache naquela regi o particular a ser atualizada Isto particularmente til em casos onde dados adjacentes podem ter sido atualizados atrav s de um processo em separado al m de ser uma alternativa mais eficiente se aplicada ao despejo de uma regi o de cache atrav s de SessionFactory evictQueries 20 5 Entendendo o desempenho da Cole o Nas se es anteriores n s descrevemos as cole es e seus aplicativos Nesta se o n s exploraremos mais problemas em rela o s cole es no per odo de execu o 20 5 1 Taxonomia O Hibernate define tr s tipos b sicos de cole es Cole es de valores e Associa es um para muitos Associa es muitos para muitos A classifica o distingue as diversas tabelas e relacionamento de chave externa mas n o nos diz tudo que precisamos saber sobre o modelo relacional Para entender completamente a estrutura relacional e as caracter sticas de desempenho devemos tamb m considerar a estrutura da chave prim ria que u
126. ENTO as consultas acima ir o devolver uma Lista onde cada elemento uma entidade de Cat Se a entidade estiver mapeada com um muitos para um para outra entidade requer se que devolva tamb m este ao desempenhar a consulta nativa sen o ocorrer um erro de banco de dados espec fico coluna n o encontrada As colunas adicionais ser o automaticamente retornadas ao usar a anota o mas preferimos ser expl citos como no seguinte exemplo para UMamuitos para um para UM Dog sess createSQLQuery SELECT ID NAME BIRTHDATE DOG ID FROM CATS addEntity Cat class 244 Manuseio de associa es e cole es Isto ir permitir que o cat getDog funcione de forma apropriada 17 1 3 Manuseio de associa es e cole es poss vel realizar a recupera o adiantada no Dog para evitar uma viagem extra por inicializar o proxy Isto feito atrav s do m todo addJoin que permite que voc se una associa o ou cole o sess createSQLQuery SELECT c ID NAME BIRTHDATE DOG ID D ID D NAME FROM CATS c DOGS d WHERE e DOG ID d D ID addEntity cat Cat class addJoin cat dog Neste exemplo a devolu o do cat ter sua propriedade dog totalmente inicializada sem nenhuma viagem extra ao banco de dados Note que adicionamos um nome alias cat para poder especificar o caminho da propriedade alvo na uni o poss vel fazer a mesma uni o para cole es ex se ao inv s disso 0 cat tivesse um pa
127. Estrat gia somente leitura Se sua aplica o precisar ler mas nunca modificar inst ncias de uma classe persistente pode se utilizar um cache de read only Esta a estrat gia de desempenho mais simples e melhor tamb m perfeitamente seguro para uso em um cluster lt class name eg Immutable mutable false gt lt cache usage read only gt lt class gt 20 2 3 Estrat gia leitura escrita Se a aplica o precisar atualizar dados um cache de read write pode ser mais apropriado Esta estrat gia de cache nunca deve ser usada se solicitado um n vel de isola o de transa o serializ vel Se o cache for usado em um ambiente JTA voc deve especificar a propriedade hibernate transaction manager_lookup_class nomeando uma estrat gia por obter O TransactionManager JTA Em outros ambientes voc deve assegurar que a transa o esta completa quando a Session close OU Session disconnect for chamada Se desejar utilizar esta estrat gia em um cluster voc deve assegurar que a implementa o de cache adjacente suporta o bloqueio Os provedores de cache built in n o suportam o bloqueamento 278 Estrat gia leitura escrita nao estrita lt class name eg Cat gt lt cache usage read write gt lt set name kittens gt lt cache usage read write gt lt set gt lt class 20 2 4 Estrat gia leitura escrita n o estrita Se a aplica o somente precisa atualizar
128. Generator gt lt param name table gt uid_table lt param gt lt param name column gt next_hi_value_column lt param gt lt generator gt lt id gt Todos os geradores implementam a interface org hibernate id IdentifierGenerator Esta uma interface bem simples Algumas aplica es podem prover suas pr prias implementa es especializadas entretanto o Hibernate disponibiliza um conjunto de implementa es internamente H nomes de atalhos para estes geradores internos conforme segue abaixo increment gera identificadores dos tipos long short OU int que s o nicos apenas quando nenhum outro processo est inserindo dados na mesma tabela N o utilize em ambientes de cluster identity suporta colunas de identidade em DB2 MySQL Servidor MS SQL Sybase e HypersonicSQL O identificador retornado do tipo long short OU int sequence utiliza uma sequ ncia em DB2 PostgreSQL Oracle SAP DB McKoi ou um gerador no Interbase O identificador de retorno do tipo long short OU int hilo utiliza um algoritmo hi lo para gerar de forma eficiente identificadores do tipo long short ou int a partir de uma tabela e coluna fornecida por padr o hibernate unique key next hi como fonte para os valores hi O algoritmo hi lo gera identificadores que s o nicos apenas para um banco de dados espec fico seghilo utiliza um algoritmo hi lo para gerar de forma eficiente identificadores do tipo long short ou int
129. HIBERNATE Persist ncia Relacional para Java Idiom tico Documentacao de Refer ncia Hibernate 3 5 6 Final por Gavin King Christian Bauer Max Rydahl Andersen Emmanuel Bernard e Steve Ebersole and thanks to James Cobb Graphic Design Cheyenne Weaver Graphic Design Alvaro Netto Anderson Braulio Daniel Vieira Costa Francisco gamarra Gamarra Luiz Carlos Rodrigues Marcel Castelo Paulo C sar Pablo L de Miranda Renato Deggau Rog rio Ara jo e Wanderson Siqueira dit ts 0 o PARREIRA esos E RAE PRE PAR RR DR RARA RS RARO RR ORE PRADO RAR A xi T TUTOM Al PRDC ENADE PRO ERROR EO PARDO ERRO PODE DRE RODO RARO RR 1 1 1 Parte 1 A primeira aplica o Hibernate ra 1 TAA Configura o erior Goleta elisha Gee ee 1 1 1 2 A primeira Classe e teeeeeeeeeseaaaaaaeeeeeeeeeaeaaaaees 3 1 1 3 O mapeamento do arquivo ee ae ea eeteeeeeeeeeaeaaeaneeeeeeeeeaeaae 4 1 1 4 Configura o do Hibernate cece ee eeeeeeeeeeeeeeaaeaeeeeeeeeeeeaeaaaeaes 7 1 1 5 Construindo com o Maven iene rranaa ana 10 1 1 6 Inicializa o e Auxiliares serraria aeee raaraaa 10 1 1 7 Carregando e salvando objetos serraria 11 1 2 Parte 2 Mapeando associa es neeeee cena ee eeee ane eeeeaaeeeeeeaaeeeeeeaaeeees 14 1 2 1 Mapeando a classe Person erraram 14 1 2 2 Uma associa o unidirecional b
130. HibernateException a qual envolve a maioria dos erros que podem ocorrer em uma camada de persist ncia do Hibernate uma exce o n o verificada Ela n o constava em vers es mais antigas de Hibernate Em nossa opini o n s n o devemos for ar o desenvolvedor a tratar uma exce o irrecuper vel em uma camada mais baixa Na maioria dos sistemas as exce es n o verificadas e fatais s o tratadas em um dos primeiros frames da pilha da cnamada do m todo isto em umas camadas mais elevadas e uma mensagem de erro apresentada ao usu rio da aplica o ou alguma outra a o apropriada feita Note que Hibernate pode tamb m lan ar outras exce es n o verificadas que n o sejam um HibernateExcept ion Estas tamb m s o irrecuper veis e uma a o apropriada deve ser tomada 195 Cap tulo 12 Transa es e Con O Hibernate envolve soLExceptions lan adas ao interagir com a base de dados em um JDBCException Na realidade o Hibernate tentar converter a exce o em uma subclasse mais significativa da JDBCException A SQLException subjacente est sempre dispon vel atrav s de JDBCException getCause O Hibernate converte a SQLException em uma subclasse JDBCException apropriada usando soLExceptionConverter associado ao sessionFactory Por padr o O soLExceptionConverter definido pelo dialeto configurado Entretanto tamb m poss vel conectar em uma implementa o customizada Veja o javadoc para mai
131. ID gt lt generator class native gt lt id gt lt joined subclass name CashPayment table CASH PAYMENT gt lt key column PAYMENT_ID gt lt property name amount column CASH_AMOUNT gt lt joined subclass gt lt joined subclass name ChequePayment table CHEQUE PAYMENT gt lt key column PAYMENT_ID gt lt property name amount column CHEQUE AMOUNT gt lt joined subclass gt lt class 156 Limita es Mais uma vez n s n o mencionamos payment explicitamente Se n s executarmos uma pesquisa em cima da interface payment por exemplo from Payment O Hibernate retorna automaticamente inst ncias de creditcardPayment e suas subclasses desde que elas tamb m implementem payment CashPayment ChequePayment mas n o as inst ncias de NonelectronicTransaction 9 2 Limita es Existem certas limita es para a abordagem do polimorfismo impl cito comparada com a estrat gia de mapeamento da tabela por classe concreta Existe uma limita o um tanto menos restritiva para mapeamentos lt union subclass gt A seguinte tabela demonstra as limita es do mapeamento de tabela por classe concreta e do polimorfismo impl cito no Hibernate Tabela 9 1 Recurso dos Mapeamentos de Heran a Estrat gi muitos um um muitos Polim rfi Consulta Jun es Busca de para para para para load Polim rfi Polim rfi por Heran a um um muitos um get uni o Polim
132. L dentro de chaves 167 Cap tulo 10 Trabalhando com List cats session createSQLQuery SELECT cat FROM CAT cat WHERE ROWNUM lt 10 FACGE NE Ley eat Cat class LES Etr List cats session createSQLQuery SELECT cat ID AS cat 1d cat SEX AS car sexl Teat y MATE AS cat mate cat SUBCLASS AS featlclassi s T FROM CAT cat WHERE ROWNUM lt 10 addEntity cat Cat class ES Ei SQL queries can contain named and positional parameters just like Hibernate queries More information about native SQL queries in Hibernate can be found in Cap tulo 17 SQL Nativo 10 5 Modificando objetos persistentes Inst ncias persistentes transacionais ou seja objetos carregados salvos criados ou consultados pela session podem ser manipuladas pela aplica o e qualquer mudan a para estado persistente ser persistida quando a sess o for limpa Isto ser discutido mais adiante neste cap tulo N o h necessidade de chamar um m todo em particular como update que possui um prop sito diferente para fazer modifica es persistentes Portanto a forma mais direta de atualizar o estado de um objeto carreg 1o e depois manipul lo diretamente enquanto a sess o estiver aberta DomesticCat cat DomesticCat sess load Cat class new Long 69 cat setName PK sess flush changes to cat are automatically detected and persisted Algumas vezes este modelo de programa o ine
133. Metadata CollectionMetadata pela hierarquia Type Inst ncias das interfaces de metadados podem ser obtidas a partir do SessionFactory Cate 7 ClassMetadata catMeta sessionfactory getClassMetadata Cat class Object propertyValues catMeta getPropertyValues fritz String propertyNames catMeta getPropertyNames Type propertyTypes catMeta getPropertyTypes get a Map of all properties which are not collections or associations Map namedValues new HashMap for int i 0 i lt propertyNames length i if propertyTypes i isEntityType amp amp propertyTypes i isCollectionType namedValues put propertyNames i propertyValues i 175 176 Read only entities gt Importante Hibernate s treatment of read only entities may differ from what you may have encountered elsewhere Incorrect usage may cause unexpected results When an entity is read only Hibernate does not dirty check the entity s simple properties or single ended associations Hibernate will not update simple properties or updatable single ended associations Hibernate will not update the version of the read only entity if only simple properties or single ended updatable associations are changed In some ways Hibernate treats read only entities the same as entities that are not read only Hibernate cascades operations to associations as defined in the entity mapping Hibernate update
134. Name gt java hibernate SessionFactory lt attribute gt lt i Datasource settings gt lt attribute name Datasource gt java HsqlDS lt attribute gt lt attribute name Dialect gt org hibernate dialect HSQLDialect lt attribute gt Sli lransaction integration gt 53 Capitulo 3 Configuration lt attribute name TransactionStrategy gt org hibernate transaction JTATransactionFactory lt attribute gt lt attribute name TransactionManagerLookupStrategy gt org hibernate transaction JBossTransactionManagerLookup lt attribute gt lt attribute name FlushBeforeCompletionEnabled gt true lt attribute gt lt attribute name AutoCloseSessionEnabled gt true lt attribute gt Si Teteng OPCIONS lt attribute name MaximumFetchDepth gt 5 lt attribute gt lt Second level caching gt lt attribute name SecondLevelCacheEnabled gt true lt attribute gt lt attribute name CacheProviderClass gt org hibernate cache EhCacheProvider lt attribute gt lt attribute name QueryCacheEnabled gt true lt attribute gt Si Logging gt lt attribute name ShowSqlEnabled gt true lt attribute gt Sila iMeyejoubisve E ileg e lt attribute name MapResources gt auction Item hbm xml auction Category hbm xml lt attribute gt lt mbean gt lt server gt Este arquivo implementado em um diret rio chamado META INF e envolto em um arquivo JAR com a ex
135. OJOs onde a nica coisa especial sobre eles que s o associados a exatamente uma session Quando a session fechada eles s o separados e liberados para serem usados dentro de qualquer camada da aplica o Ex diretamente como objetos de transfer ncia de dados de e para a camada de apresenta o Objetos e cole es desanexados e transientes Inst ncias de classes persistentes que ainda n o est o associadas a uma session Eles podem ter sido instanciados pela aplica o e n o persistidos ainda ou eles foram instanciados por uma session encerrada Transaction org nibernate Transaction Opcional Objeto de vida curta single threaded usado pela aplica o para especificar unidades at micas de trabalho Abstrai o aplicativo das transa es JDBC JTA ou CORBA adjacentes Uma session pode em alguns casos iniciar v rias Transactions Entretanto a demarca o da transa o mesmo utilizando API ou Transaction subjacentes nunca opcional Connection Provider org nibernate connection ConnectionProvider Opcional Uma f brica de e pool de conex es JDBC Abstrai a aplica o dos Datasource OU DriverManager adjacentes N o exposto para a aplica o mas pode ser implementado ou estendido pelo programador Transaction Factory org hibernate TransactionFactory Opcional Uma f brica para inst ncias de Transact ion N o exposta a aplica o mas pode ser estendida implementada pelo programador Extension Inte
136. Projections avg weight Projections groupProperty color alesis N o ha necessidade de um agrupamento por expl cito em uma consulta por crit rio Certos tipos de proje o s o definidos para serem proje es de agrupamento que tamb m aparecem em uma cl usula agrupamento porSQL Um alias pode ser atribu do de forma opcional uma proje o assim o valor projetado pode ser referenciado em restri es ou ordena es Aqui seguem duas formas diferentes para fazer isto 239 Capitulo 16 Consultas por cr List results session createCriteria Cat class setProjection Projections alias Projections groupProperty color colr jacdOrder Order asic colr i alise e List results session createCriteria Cat class setProjection Projections groupProperty color as colr addOrder Order asc colr Pol Gs aaa ee Os m todos alias as simplesmente envolvem uma inst ncia de proje o outra inst ncia de Proje o em alias Como um atalho voc poder atribuir um alias quando adicionar a proje o uma lista de proje o List results session createCriteria Cat class setProjection Projections projectionList Projections rowCount catCountByColor Projections avg weight avgWeight Projections max weight maxWeight Projections groupEroeperty color color add rder Order desc catCountByColor addOrder Order desc a
137. SERT INTO EntityName properties list select statement Alguns pontos a observar Apenas a forma INSERT INTO SELECT suportada INSERT INTO VALUES n o suportada A lista de propriedade an loga ao column specification do comando SQL INSERT Para entidades envolvidas em mapeamentos apenas as propriedades definidas diretamente em n vel da classe podem ser usadas na properties list Propriedades da superclasse n o s o permitidas e as propriedades da subclasse n o fazem sentido Em outras palavras os comandos INSERT n o s o polim rficos selecionar instru es pode ser qualquer consulta de sele o HQL v lida desde que os tipos de retorno sejam compat veis com os tipos esperados pela inser o Atualmente isto verificado durante a compila o da consulta ao inv s de permitir que a verifica o chegue ao banco de dados Entretanto perceba que isso pode causar problemas entre os Tipos de Hibernate que s o equivalentes e n o iguais Isso pode causar problemas nas combina es entre a propriedade definida como org hibernate type DateTypee uma propriedade definida como org hibernate type TimestampType embora o banco de dados n o possa fazer uma distin o ou possa ser capaz de manusear a convers o Para a propriedade id a instru o insert oferece duas op es Voc pode especificar qualquer propriedade id explicitamente no properties list em alguns casos esse valor obtido diretam
138. TER TRANSACTION Raramente uma boa id ia alterar padr o pois ao se fazer isso temos falhas que parecem bugs e ou suposi es inv lidas no c digo do usu rio on close indica o uso da ConnectionReleaseMode ON CLOSE Essa op o foi deixada para manter a compatibilidade mas seu uso fortemente desencorajado after transaction indica o uso da ConnectionReleaseMode AFTER TRANSACTION Essa op o n o deve ser usada com ambientes JTA Tamb m note que no caso da ConnectionReleaseMode AFTER TRANSACTION se a sess o foi colocada no modo auto commit a conex o vai ser liberada de forma similar ao modo AFTER STATEMENT after statement indica o uso ConnectionReleaseMode AFTER STATEMENT Al m disso O ConnectionProvider configurado consultado para verificar se suporta essa configura o supportsAggressiveRelease Se n o suportar o modo de libera o redefinido como ConnectionRelease Mode AFTER TRANSACTION Essa configura o s segura em ambientes onde podemos tanto readquirir a mesma conex o JDBC adjacente todas as vezes que chamarmos connectionProvider getConnection quanto em um ambiente auto commit onde n o importa se voltamos para a mesma conex o 202 Interceptadores e Eventos muito til quando a aplica o precisa reagir a certos eventos que ocorrem dentro do Hibernate Isso permite a implementa o de certas fun es gen ricas assim como permite estender as funcionalidades do Hibernat
139. _ID gt lt generator class native gt lt id gt lt discriminator column PAYMENT TYPE type string gt lt property name amount column AMOUNT gt lt subclass name CreditCardPayment discriminator value CREDIT gt lt property name creditCardType column CCTYPE gt lt subclass gt lt subclass name CashPayment discriminator value CASH gt lt subclass gt lt subclass name ChequePayment discriminator value CHEQUE gt lt subclass gt lt class requisitado exatamente uma tabela Existe uma grande limita o desta estrat gia de mapeamento colunas declaradas por subclasses tais como ccTYPE podem n o ter restri es NOT NULL 9 1 2 Tabela por subclasse Um mapeamento de tabela por subclasse seria parecido com lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT_ID gt lt generator class native gt lt id gt lt property name amount column AMOUNT gt lt joined subclass name CreditCardPayment table CREDIT PAYMENT gt lt key column PAYMENT ID gt lt property name creditCardType column CCTYPE gt lt joined subclass gt lt joined subclass name CashPayment table CASH PAYMENT gt lt key column PAYMENT_ID gt lt joined subclass gt lt joined subclass name ChequePayment table CHEQUE PAYMENT gt lt key column PAYMENT ID gt lt joined subclass gt lt class gt
140. a es bidirecionais Agora iremos mapear uma associa o bidirecional Voc far uma associa o entre o trabalho person e event de ambos os lados em Java O esquema do banco de dados acima n o muda de forma que voc continua possuir a multiplicidade muitos para muitos Nota Um banco de dados relacional mais flex vel que um linguagem de programa o da rede de maneira que ele n o precisa de uma dire o de navega o os dados podem ser visualizados e restaurados de qualquer maneira Primeiramente adicione uma cole o de participantes classe Event private Set participants new HashSet public Set getParticipants return participants public void setParticipants Set participants tbis participants participants Agora mapeie este lado da associa o em Event hbm xml 20 Trabalhando com links bidirecionais lt set name participants table PERSON_EVENT inverse true gt lt key column EVENT_ID gt lt many to many column PERSON_ID class events Person gt lt set Como voc pode ver esses sao mapeamentos set normais em ambos documentos de mapeamento Observe que os nomes das colunas em key many to many est o trocados em ambos os documentos de mapeamento A adi o mais importante feita est na fun o inverse true no elemento set da cole o da classe Event Isso significa que o Hibernate deve pegar o outro lado a classe Person quando precisa
141. a o tabular at um gr fico de objetos Por favor siga os seguintes passos caso voc seja inexperiente com o Hibernate Mapeamento Objeto Relacional ou mesmo Java 1 Read Cap tulo 1 Tutorial for a tutorial with step by step instructions The source code for the tutorial is included in the distribution in the doc reference tutorial directory 2 Read Cap tulo 2 Arquitetura to understand the environments where Hibernate can be used 3 Verifique no diret rio eg em sua distribui o de Hibernate do qual possui uma simples aplica o aut noma Copie seu driver JDBC para o diret rio 1ib e edite eg hibernate properties especificando valores corretos para o seu banco de dados No diret rio de distribui o sob o comando aviso digite ant eg usando Ant ou sob Windows digite build eg 4 Use this reference documentation as your primary source of information Consider reading JPwH if you need more help with application design or if you prefer a step by step tutorial Also visit Attp caveatemptor hibernate org and download the example application from JPwH 5 As respostas das perguntas mais frequentes podem ser encontradas no website Hibernate 6 A terceira parte de demonstra o exemplos e tutoriais est o vinculadas no website Hibernate 7 A rea de Comunidade no website Hibernate um bom recurso para parceiros de design e v rias solu es integradas Tomcat JBoss AS Struts EJB etc Em caso de d vi
142. a A palavra chave as opcional Voc tamb m pode escrever assim fromndiCat cat 215 Capitulo 15 HQL A Linguagem Classes m ltiplas podem ser envolvidas resultando em um produto cartesiano ou uni o cruzada from Formula Parameter from Formula as form Parameter as param considerada uma boa pr tica nomear alias de consulta utilizando uma letra min scula inicial consistente com os padr es de nomea o Java para vari veis locais ex domesticCat 15 3 Associa es e uni es Podemos tamb m atribuir aliases em uma entidade associada ou mesmo em elementos de uma cole o de valores usando uma join Por exemplo from Cat as cat inner join cat mate as mate left outer join cat kittens as kitten from Cat as cat left join cat mate kittens as kittens from Formula form full join form parameter param Os tipos de uni es suportados foram inspirados no ANSI SQL e inner join e left outer join e right outer join uni o completa geralmente n o til As constru es inteiro uni o esquerda externa uni o direita externa podem ser abreviadas from Cat as cat join cat mate as mate left join cat kittens as kitten Voc pode fornecer condi es extras de uni o usando a palavra chave do HQL with 216 Associa es e uni es from Cat as Cat left join cat kittens as kitten with kitten bodyWeight gt ORO A fetch join allows associations or collections of val
143. a eine diego Fada ano gas enra dada iaieas sa 232 15 17 Componentes scssi iarainn aa dan H nevi AMA Ad a NEN tda ssa ninfas 233 15 18 Sintaxe do construtor de valores de linha 234 16 Consultas por crit rios aeee aerea rena nana nana rena nana 235 vii HIBERNATE Persist ncia Rela 16 1 Criando uma inst ncia Criteria cece eeeceeeeeeee tees ae aaeeeeeeeeeeeeaeaaeeeeeeeees 235 16 2 Limitando o conjunto de resultados cece cece erra 235 16 3 Ordenando resultados ii eae eeeeeeeeeeaeaaeaneeeeeeeeeaeaae 236 16 4 ASSOCIA ES izazusistascaasesadesiatuocasiascadas nie lan decr afasta idea nadie vient eden 237 16 5 Busca de associa o din mica ee eeeceeeeeeeeeeeeaaaaeeeeeeeeeeeeaeaaeaees 238 16 6 Exemplos de consultas e ee eeeeseaaeeeessaaeeeessaeees 238 16 7 Proje es agrega es e agrupamento errar 239 16 8 Consultas e subconsultas desanexadas iria 241 16 9 Consultas por um identificador natural cece ee aeeeeeeeeeeeeeeeaaaaeenees 242 17 SQL Nativ O oisg aaao anaana aa n aaa de manda nana aaa eed aaa aaa a 243 17 1 Usando um SQLQuery ssssessssesssssssnssssessssssrrsssessesrsnnssstssesssnnsntroresssnnsnereserss 243 17 1 1 Consultas Escalares ieina niani iaiia derai 243 17 1 2 Consultas de Entidade cece ceeeeeeeeeeeeeaeaaeee
144. a uma cole o com valores utilizamos a tag lt element gt Por exemplo lt element column column name 117 Capitulo 6 Mapeamento de col formula any SQL expression o type typename length L precision P scale 5 not null true false unique true false node element name Hes column optional the name of the column holding the collection element values formula optional an SQL formula used to evaluate the element type required the type of the collection element A many to many association is specified using the lt many to many gt element lt many to many column column name formula any SQL expression class ClassName fetch select join unique true false not found ignore exception entity name EntityName 0900000006 property ref propertyNameFromAssociatedClass node element name embed xml true false gt column optional the name of the element foreign key column formula optional an SQL formula used to evaluate the element foreign key value class required the name of the associated class S000 fetch optional defaults to join enables outer join or sequential select fetching for this association This is a special case for full eager fetching in a single SELECT of an entity and its many to many relationships to other entities you would enable join fetching not only of the collection itself but also with this attribu
145. abases For example the org hibernate id enhanced SequenceStyleGenerator mimics the behavior of a sequence on databases which do not support sequences by using a table 26 5 Fun es do banco de dados Aten o Esta uma rea do Hibernate com necessidade de melhoramentos Este manuseio de fun o funciona atualmente muito bem com o HQL quando falamos das preocupa es de portabilidade No entanto bastante prec ria em outros aspectos As fun es SQL podem ser referenciadas em diversas maneiras pelos usu rios No entanto nem todos os bancos de dados suportam o mesmo conjunto de fun o O Hibernate fornece um significado de mapeamento do nome da fun o l gica para uma delega o que sabe como manusear aquela fun o em particular mesmo quando usando uma chamada de fun o f sica totalmente diferente Importante Technically this function registration is handled through the org hibernate dialect function SQLFunctionRegistry class which is intended to allow users to provide custom function definitions without having to provide a custom dialect This specific behavior is not fully completed as of yet It is sort of implemented such that users can programatically register functions with the org hibernate cfg Configuration and those functions will be recognized for HQL 26 6 Tipos de mapeamentos A se o est esquematizada para finaliza o numa data posterior 329 330 Refer n
146. able PERSON gt lt id name id column PERSON_ID gt lt generator class foreign gt lt param name property 90 ld Natural gt employee lt param gt lt generator gt lt id gt lt one to one name employee class Employee constrained true gt lt class gt Uma nova inst ncia de Person atribu da com o mesmo valor da chave prim ria da inst ncia de Employee referenciada com a propriedade employee daquela Person Alternativamente uma chave exterior com uma restri o nica de Employee para Person pode ser expressada como lt many to one name person class Person column PERSON ID unique true gt Esta associa o pode ser feita de forma bi direcional adicionando o seguinte no mapeamento de Person lt one to one name employee class Employee property ref person gt 5 1 14 Id Natural lt natural id mutable true false gt lt property gt lt many to one gt lt natural id gt Embora recomendemos o uso das chaves substitutas como chaves prim rias voc deve ainda identificar chaves naturais para todas as entidades Uma chave natural uma propriedade ou combina o de propriedades que exclusiva e n o nula Mapeie as propriedades da chave natural dentro do elemento lt natural id gt O Hibernate ir gerar a chave exclusiva necess ria e as restri es de anulabilidade e seu mapeamento ser apropriadamente auto documentado
147. account type sortOrder account accountNumber payment dueDate 231 Capitulo 15 HQL A Linguagem 15 15 Atualiza o e corre o em lote HQL now supports update delete and insert select statements See Se o 14 4 Opera es no estilo DML for more information 15 16 Dicas amp Truques Pode se contar o n mero de resultados da consulta sem realmente retorn los Integer session createQuery select count from iterate next intValue Para ordenar um resultado pelo tamanho de uma cole o use a consulta a seguir select usr id usr name from User as usr left join usr messages as msg group by usr id usr name order by count msg Se seu banco de dados suporta subsele es pode se colocar uma condi o sobre tamanho de sele o na cl usula where da sua consulta from User usr where size usr messages gt 1 Se seu banco de dados n o suporta subsele es use a consulta a seguir select usr id usr name from User usr join usr messages msg group by usr id usr name having count msg gt 1 Com essa solu o n o se pode retornar um User sem nenhuma menssagem por causa da uni o inteira a forma a seguir tamb m til select usr id usr name from User as usr left join usr messages as msg group by usr id usr name having count msg 0 232 Componentes As propriedades de um JavaBean podem ser limitadas a parametros nomeados da
148. ad only and its changes can be flushed seus E 11 2 Read only affect on property type The following table summarizes how different property types are affected by making an entity read only Tabela 11 1 Affect of read only entity on property types Property Association Type Changes flushed to DB Simple no 181 Capitulo 11 Read only entities Property Association Type Changes flushed to DB Se o 11 2 1 Simple properties Unidirectional one to one no Unidirectional many to one no Se o 11 2 2 1 Unidirectional one to one and many to one Unidirectional one to many yes Unidirectional many to many yes Se o 11 2 2 2 Unidirectional one to many and many to many Bidirectional one to one only if the owning entity is not read only Se o 11 2 3 1 Bidirectional one to one Bidirectional one to many many to one only added removed entities that are not read only inverse collection yes non inverse collection Se o 11 2 3 2 Bidirectional one to many many to one Bidirectional many to many yes Se o 11 2 3 3 Bidirectional many to many Behavior is different when the entity having the property association is read only compared to when it is not read only 11 2 1 Simple properties When a persistent object is read only Hibernate does not dirty check simple properties Hibernate will not synchronize simple property state
149. ad only so that entities loaded when the query or criteria executes scrolls or iterates are automatically made read only see Se o 11 1 3 Loading read only entities from an HQL query criteria for details you can make a persistent entity that is already in the in the session read only see Se o 11 1 4 Making a persistent entity read only for details 11 1 1 Entities of immutable classes When an entity instance of an immutable class is made persistent Hibernate automatically makes it read only An entity of an immutable class can created and deleted the same as an entity of a mutable class Hibernate treats a persistent entity of an immutable class the same way as a read only persistent entity of a mutable class The only exception is that Hibernate will not allow an entity of an immutable class to be changed so it is not read only 11 1 2 Loading persistent entities as read only Nota Entities of immutable classes are automatically loaded as read only To change the default behavior so Hibernate loads entity instances of mutable classes into the session and automatically makes them read only call Session setDefaultReadOnly true To change the default back so entities loaded by Hibernate are not made read only call Session setDefaultReadOnly false You can determine the current setting by calling 178 Loading read only entities from an HQL query criteria Session isDefaultReadOnly
150. ado do pacote nas consultas do Hibernate As Classes dever o ser importadas explicitamente de prefer ncia contando com auto import true Voc pode at importar classes e interfaces que n o est o explicitamente mapeadas lt import class java lang Object rename Universe gt p J g J lt import class ClassName oe rename ShortName amp class O nome qualificado do pacote de qualquer classe Java amp rename opcional padr o para o nome da classe n o qualificada Um nome que pode ser usado numa linguagem de consulta 5 1 24 Any Existe mais um tipo de propriedade de mapeamento O elemento de mapeamento lt any gt define uma associa o polim rfica para classes de m ltiplas tabelas Este tipo de mapeamento sempre 100 Any requer mais de uma coluna A primeira coluna possui o tipo da entidade associada A outra coluna restante possui o identificador imposs vel especificar uma restri o de chave exterior para este tipo de associa o portanto isto certamente n o visto como um caminho usual para associa es polim rficas de mapeamento Voc deve usar este mapeamento apenas em casos muito especiais Por exemplo audit logs dados de sess o do usu rio etc A fun o met a t ype permite que a aplica o especifique um tipo adaptado que mapeia valores de colunas de banco de dados para classes persistentes que possuem propriedades identificadoras do tipo especificado atrav
151. ager lt url pattern gt lt servlet mapping gt lt web app gt Para construir e implementar chame seu diret rio de projeto ant war e copie o arquivo hibernate tutorial war para seu diret rio Tomcat webapp Uma vez implementado e com o Tomcat rodando acesse o aplicativo em http localhost 8080 hibernate tutorial eventmanager Tenha a certeza de observar o log do Tomcat para ver o Hibernate inicializar quando a primeira solicita o chegar em seu servlet o 26 Sumario inicializador est tico no HibernateUtil chamado e para obter o resultado detalhado caso exce es aconte am 1 4 Sum rio Este tutorial cobriu itens b sicos de como escrever um aplicativo Hibernate aut nomo simples e um aplicativo da web pequeno A partir do Hibernate website http hibernate org voc poder encontrar mais tutoriais dispon veis 27 28 Arquitetura 2 1 Visao Geral O diagrama abaixo fornece uma vis o de alt ssimo nivel da arquitetura do Hibernate Application Persistent Objects HIBERNATE hibernate i properties AMIL MEDINE Database N s n o temos o escopo neste documento para mostrar uma vis o mais detalhada da arquitetura em execu o O Hibernate muito flex vel e suporta v rias abordagens Mostraremos os dois extremos No entanto n s apresentaremos os dois extremos arquitetura m nima e arquitetura compreensiva Este diagrama mostra o Hibernat
152. ais tarde neste cap tulo N s come amos a discuss o do controle de concorr ncia no Hibernate com a granularidade do configuration SessionFactory Session al m de transa es de base de dados e conversa es longas 12 1 Sess o e escopos de transa es Um sessionFactory objeto threadsafe com um custo alto de cria o compartilhado por todas as threads da aplica o criado uma nica vez no in cio da execu o da aplica o a partir da inst ncia de uma configuration Uma session um objeto de baixo custo de cria o n o threadsafe deve ser usado uma vez para uma nica requisi o uma conversa o uma nica unidade do trabalho e ent o deve ser descartado Um session n o obter um JDBC connection ou um Datasource a menos que necessite Isto n o consome nenhum recurso at ser usado Uma transa o precisa ser o mais curta poss vel para reduzir a disputa pelo bloqueio na base de dados Transa es longas impedir o que sua aplica o escale a carga altamente concorrente Por isso n o bom manter uma transa o de base de dados aberta durante o tempo que o usu rio pensa at que a unidade do trabalho esteja completa Qual o escopo de uma unidade de trabalho Pode uma nica session do Hibernate gerenciar diversas transa es ou este um o relacionamento um para um dos escopos Quando voc deve abrir e fechar uma session e como voc demarca os limites da transa o
153. alue constructor syntax See Se o 15 18 Sint xe do construtor de valores de linha for more information 15 14 Exemplos de HQL As consultas do Hibernate podem ser muito poderosas e complexas De fato o poder da linguagem de consulta um dos pontos principais na distribui o do Hibernate Aqui temos algumas consultas de exemplo muito similares a consultas usadas em um projeto recente Note que a maioria das consultas que voc ir escrever s o mais simples que estas A consulta a seguir retorna o id de ordenar n mero de tens e o valor total do ordenar para todos os ordenar n o pagos para um cliente particular e valor total m nimo dado ordenando os resultados por valor total Para determinar os pre os utiliza se o cat logo atual A consulta SQL resultante usando tabelas ORDER ORDER LINE PRODUCT CATALOG PRICE t m quatro uni es inteiras e uma subsele o n o correlacionada 229 Capitulo 15 HQL A Linguagem select order id sum price amount count item from Order as order join order lineItems as item join item product as product Catalog as catalog join catalog prices as price where order paid false and order customer customer and price product product and catalog effectiveDate lt sysdate and catalog effectiveDate gt all select cat effectiveDate from Catalog as cat where cat effectiveDate lt sysdate group by order having sum price amount gt
154. amente O author work uma tabela de associa o que liga autores trabalhos Abaixo segue o esquema das tabelas gerados pelo SchemaExport create table works id BIGINT not null generated by default as identity tempo FLOAT genre VARCHAR 255 text INTEGER title VARCHAR 255 type CHAR 1 not null primary key id create table author work author id BIGINT not null work id BIGINT not null 314 Cliente Ordem Produto primary key work_id author_id create table authors id BIGINT not null generated by default as identity alias VARCHAR 255 primary key id create table persons id BIGINT not null generated by default as identity name VARCHAR 255 primary key id alter table authors add constraint authorsFKO foreign key id references persons alter table author_work add constraint author_workFKO foreign key author_id references authors alter table author_work add constraint author_workFK1 foreign key work id references works 24 3 Cliente Ordem Produto Agora considere um modelo de relacionamento entre customer Order LineItem Product Existe uma associa o um para muitos entre customer Order mas como devemos representar Order LineItem Product Neste exemplo o Lineltem mapeado como uma classe de associa o representando a associa o muitos para muitos entre order e Product No Hibernate isto conhecido como um elemento composto name String date
155. amento que aceita uma fun o column ir aceitar alternativamente um sub elemento lt column gt Da mesma forma lt formula gt uma alternativa para a fun o formula lt column name column_name length N precision N scale N not null true false unique true false unique key multicolumn unique key name index index name sql type sql type name check SOL expression default SOL expression read SOL expression write SOL expression gt 99 Capitulo 5 Mapeamento O R Basico lt formula gt SQL expression lt formula gt A maioria das fun es no column fornecem um significado de jun o do DDL durante a gera o autom tica do esquema As fun es read e write permitem que voc especifique o SQL personalizado do qual o Hibernate usar para acessar o valor da coluna Consulte a discuss o da column read and write expressions para maiores informa es Os elementos column e formula podem at ser combinados dentro da mesma propriedade ou associa o mapeando para expressar por exemplo condi es de associa es ex ticas lt many to one name homeAddress class Address insert false update false gt lt column name person_id not null true length 10 gt lt formula gt MAILING lt formula gt lt many to one gt 5 1 23 Importar Vamos supor que a sua aplica o tenha duas classes persistentes com o mesmo nome e voc n o quer especificar o nome qualific
156. an object See Se o 15 5 Refer ncia propriedade do identificador for more information from Cat as cat where cat id 123 from Cat as cat where cat mate id 69 A segunda consulta eficiente e n o requer nenhuma uni o de tabelas As propriedades de identificadores compostas tamb m podem ser usadas Considere o seguinte exemplo onde Person possui identificadores compostos que consistem de country e medicareNumber 222 Express es from bank Person person where person id country AU and person id medicareNumber 123456 from bank Account account where account owner id country AU and account owner id medicareNumber 123456 Mais uma vez a segunda consulta n o precisa de nenhuma uni o de tabela See Se o 15 5 Refer ncia propriedade do identificador for more information regarding referencing identifier properties Da mesma forma a propriedade especial class acessa o valor discriminador da inst ncia no caso de persist ncia polim rfica O nome de uma classe Java inclusa em uma cl usula where ser traduzida para seu valor discriminante from Cat cat where cat class DomesticCat You can also use components or composite user types or properties of said component types See Se o 15 17 Componentes for more information Um tipo any possui as propriedades ide class especiais nos permitindo expressar uma uni o da seguinte forma onde AuditLog item uma pro
157. ando dados em XML lt one to many gt os dados se Vamos reler e atualizar documentos em XML em nossa aplica o N s fazemos isso obtendo uma sess o do dom4j Document doc 264 Manipulando dados em XML Session session factory openSession Session dom4jSession session getSession EntityMode DOM4J Transaction tx session beginTransaction List results dom4jSession createQuery from Customer c left join fetch c accounts where c lastName like lastName Rue do for ant i 0 asresults size it add the customer data to the XML document Element customer Element results get i doc add customer Ex commit session close Session session factory openSession Session dom4jSession session getSession EntityMode DOM4J Transaction tx session beginTransaction Element cust Element dom4jSession get Customer customerId for int 11 07 i lt results size it J Element customer Element results get i change the customer name in the XML and database Element name customer element name name element first name setText firstName name element initial setText initial name element last name setText lastName tx commit session close extremamente til combinar essa funcionalidade com a opera o replicate do Hibernate para implementar importa o exporta o de dados baseados em XML 2
158. ap tulo 129 130 Mapeamento de associa es 7 1 Introdu o Os mapeamentos de associa es s o geralmente os mais dif ceis de se acertar Nesta se o n s examinaremos pelos casos can nicos um por um come ando com mapeamentos unidirecionais e considerando os casos bidirecionais Usaremos Person Address em todos os exemplos Classificaremos as associa es pela sua multiplicidade e se elas mapeiam ou n o uma interven o na tabela associativa O uso de chaves externas anul veis n o considerado uma boa pr tica na modelagem de dados tradicional assim todos os nossos exemplos usam chaves externas anul veis Esta n o uma exig ncia do Hibernate e todos os mapeamentos funcionar o se voc remover as restri es de anulabilidade 7 2 Associa es Unidirecionais 7 2 1 Muitos para um Uma associa o unidirecional muitos para um o tipo mais comum de associa o unidirecional lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt many to one name address column addressId not null true gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key addressId bigint not null create table Address addressId bigint not null primary key 131 Capitulo
159. apeada usando lt many to one gt lt many to one name payment column PAYMENT ID class Payment gt 9 1 5 Tabela por classe concreta Existem duas formas que poder amos usar a respeito da estrat gia de mapeamento de tabela por classe concreta A primeira usar lt union subclass gt lt class name Payment gt lt id name id type long column PAYMENT ID gt lt generator class sequence gt lt a gt lt property name amount column AMOUNT gt lt union subclass name CreditCardPayment table CREDIT_PAYMENT gt lt property name creditCardType column CCTYPE gt lt union subclass gt lt union subclass name CashPayment table CASH_PAYMENT gt lt union subclass gt lt union subclass name ChequePayment table CHEQUE_PAYMENT gt lt union subclass gt edad gt 154 Tabela por classe concreta usando polimorfismo implicito Tr s tabelas est o envolvidas para as subclasses Cada tabela define colunas para todas as propriedades da classe incluindo propriedades herdadas A limita o dessa abordagem que se uma propriedade mapeada na superclasse o nome da coluna deve ser o mesmo em todas as tabelas das subclasses A estrat gia do gerador identidade n o permitida na uni o da heran a de sub classe A fonte de chave prim ria deve ser compartilhada atrav s de todas subclasses unidas da hierarquia Se sua superclasse abstrata mapeie a com abstract true Cl
160. ar de forma precisa o estado persistente Como este um caso especial n o utilize a Session load para determinar se uma inst ncia com dado identificador existe em um banco de dados use session get ou ent o uma consulta Prefira a busca lazy para associa es Use a busca antecipada de forma moderada Use as cole es proxy e lazy para a maioria das associa es para classes que possam n o ser completamente mantidas em cache de segundo n vel Para associa es de classes em cache onde existe uma enorme probabilidade de coincidir caches desabilite explicitamente a busca antecipada usando lazy false Quando uma busca de uni o apropriada para um caso espec fico use a consulta com left join fetch 324 Use o modelo sess o aberta na visualiza o ou uma fase de constru o para evitar problemas com dados n o encontrados O Hibernate libera o desenvolvedor de escrever Objetos de Transfer ncia de Dados DTO Em uma arquitetura tradicional EJB os DTOs servem dois prop sitos primeiro eles se deparam com o problema de que os beans de entidade n o s o serializ veis depois eles implicitamente definem uma fase de constru o onde todos os dados a serem utilizados pelo view s o buscados e conduzidos aos DTOs antes mesmo de retornar o controle camada de apresenta o O Hibernate elimina o primeiro prop sito No entanto voc ainda precisar de uma fase de constru o pense em seus m todos de neg c
161. ar os elementos compostos que n s discutiremos mais tarde 6 3 5 Using an lt idbag gt A maioria das associa es e cole es muitos para muitos de valores apresentados anteriormente mapeiam s tabelas com as chaves de composi o mesmo que foi sugerido que as entidades 125 Capitulo 6 Mapeamento de col devem ser identificadores sint ticos chaves substitutas Uma tabela de associa o pura n o parece tirar muito proveito de uma chave substituta mesmo que uma cole o de valores compostos usufruam disto por este motivo que o Hibernate prov uma maneira de mapear uma associa o muitos para muitos com uma cole o de valores para uma tabela com uma chave substituta O elemento lt idbag gt permite mapear um List ou uma Collection com uma sem ntica de bag Por exemplo lt idbag name lovers table LOVERS gt lt collection id column ID type long gt lt generator class sequence gt lt collection id gt lt key column PERSON1 gt lt many to many column PERSON2 class Person fetch join gt lt idbag gt O lt idbag gt possui um gerador de id sint tico igual a uma classe de entidade Uma chave substituta diferente associada para cada elemento de cole o Por m o Hibernate n o prov de nenhum mecanismo para descobrir qual a chave substituta de uma linha em particular Note que o desempenho de atualiza o de um lt idbag gt melhor do que um lt bag gt normal O
162. ar sua pr pria no o da 190 Edi es comuns igualdade do objeto Advert ncia nunca use o identificador da base de dados para implementar a igualdade use atributos de neg cio uma combina o nica geralmente imut vel O identificador da base de dados mudar se um objeto transiente passar para o estado persistente Se a inst ncia transiente geralmente junto com inst ncias desacopladas for inserida em um set a mudan a do hashcode quebrar o contrato do set As fun es para chaves de neg cio n o t m que ser t o est vel quanto s chaves prim rias da base de dados voc somente tem que garantir a estabilidade durante o tempo que os objetos estiverem no mesmo set Veja o website do Hibernate para uma discuss o mais completa sobre o assunto Note tamb m que esta n o uma caracter stica do Hibernate mas simplesmente a maneira como a identidade e a igualdade do objeto de Java t m que ser implementadas 12 1 4 Edi es comuns Nunca use o anti patterns sess o por usu rio sess o ou sess o por aplica o naturalmente existem exce es raras para essa regra Note que algumas das seguintes edi es podem tamb m aparecer com modelos recomendados certifique se que tenha compreendido as implica es antes de fazer uma decis o de projeto Uma session n o threadsafe As coisas que s o supostas para trabalhar concorrentemente como requisi es HTTP beans de sess o ou Swing causar o condi es
163. ara definir objetos de banco de dados auxiliares 110 Objetos de Banco de Dados Auxiliares O primeiro m dulo para listar explicitamente os comandos CREATE e DROP no arquivo de mapeamento lt hibernate mapping gt lt database object gt Sereate gt CREATE TRIGGER my trigger lt create gt lt drop gt DROP TRIGGER my trigger lt drop gt lt database object gt lt hibernate mapping gt O segundo m dulo para fornecer uma classe padr o que sabe como construir os comandos CREATE e DROP Esta classe padr o deve implementar a interface org hibernate mapping AuxiliaryDatabaseObject lt hibernate mapping gt lt database object gt lt definition class MyTriggerDefinition gt lt database object gt lt hibernate mapping gt Al m disso estes objetos de banco de dados podem ter um escopo opcional que s ser aplicado quando certos dialetos forem utilizados lt hibernate mapping gt lt database object gt lt definition class MyTriggerDefinition gt lt dialect scope name org hibernate dialect Oracle9iDialect gt lt dialect scope name org hibernate dialect Oraclel0gDialect gt lt database object gt lt hibernate mapping gt 111 112 Mapeamento de colecao 6 1 Cole es persistentes O Hibernate requer que os campos de cole es de valor persistente sejam declarados como um tipo de interface Por exemplo public class Product private String ser
164. ara usos mais especializados Voc mesmo pode fornecer par metros a um UserType no arquivo de mapeamento Para isto seu UserType deve implementar a interface org hibernate usertype ParameterizedType 104 Mapeando uma classe mais de uma vez Para fornecer par metros a seu tipo personalizado voc pode usar o elemento lt t ype gt em seus arquivos de mapeamento lt property name priority gt lt type name com mycompany usertypes DefaultValueIntegerType gt lt param name default gt 0 lt param gt lt type gt lt property gt O UserType pode agora recuperar o valor para o par metro chamado padr o da Propriedade do passado a ele Se voc usar frequentemente um determinado UserType pode ser til definir um nome mais curto para ele Voc pode fazer isto usando o elemento lt typedef gt Typedefs atribui um nome a um tipo personalizado e pode tamb m conter uma lista de valores de par metro padr o se o tipo for parametrizado lt typedef class com mycompany usertypes DefaultValueIntegerType name default zero gt lt param name default gt 0 lt param gt lt typedef gt lt property name priority type default zero gt Tamb m poss vel substituir os par metros fornecidos em um tipo de defini o em situa es de caso a caso utilizando tipos de par metros no mapeamento da propriedade Apesar da rica variedade os tipos constru dos do Hibernate e suporte para componentes r
165. aramente ir o utilizar um tipo de padr o no entanto considerado uma boa id ia utilizar tipos customizados para classes n o entidade que ocorrem com frequ ncia em seu aplicativo Por exemplo uma classe MonetaryAmount um bom candidato para um compositeUserType apesar de poder ter sido mapeado facilmente como um componente Uma motiva o para isto a abstra o Com um tipo padronizado seus documentos de mapeamento seriam colocados prova contra mudan as poss veis na forma de representa o de valores monet rios 5 3 Mapeando uma classe mais de uma vez poss vel fornecer mais de um mapeamento para uma classe persistente em espec fico Neste caso voc deve especificar um nome de entidade para as inst ncias das duas entidades mapeadas n o se tornarem amb guas Por padr o o nome da entidade o mesmo do nome da classe O Hibernate o deixa especificar o nome de entidade quando estiver trabalhando com 105 Capitulo 5 Mapeamento O R Basico objetos persistentes quando escrever consultas ou ao mapear associa es para a entidade nomeada lt eclass name Contract table 1Contracts entity name CurrentContract gt lt set name history inverse true order by effectiveEndDate desc gt lt key column currentContractId gt lt one to many entity name HistoricalContract gt lt set gt lt class gt lt class name Contract table ContractHistory entity name HistoricalContract gt
166. aro que se ela n o for abstrata uma tabela adicional padr o para PAYMENT no exemplo acima ser necess ria para segurar as inst ncias da superclasse 9 1 6 Tabela por classe concreta usando polimorfismo impl cito Uma abordagem alternativa fazer uso de polimorfismo impl cito lt class name CreditCardPayment table CREDIT PAYMENT gt lt id name id type long column CREDIT PAYMENT ID gt lt generator class native gt lt id gt lt property name amount column CREDIT AMOUNT gt lt class gt lt class name CashPayment table CASH PAYMENT gt lt id name id type long column CASH PAYMENT ID gt lt generator class native gt lt id gt lt property name amount column CASH_AMOUNT gt lt class gt lt class name ChequePayment table CHEQUE_PAYMENT gt lt id name id type long column CHEQUE_PAYMENT_ID gt lt generator class native gt STE lt property name amount column CHEQUE AMOUNT gt lt class gt Veja que em nenhum lugar mencionamos a interface Payment explicitamente Note tamb m que propriedades de payment s o mapeadas em cada uma das subclasses Se voc quiser evitar duplica o considere usar entidades de XML ex lt ENTITY allproperties SYSTEM allproperties xml gt na declara o do DOCTYPE amp allproperties no mapeamento A desvantagem dessa abordagem que o Hibernate n o gera untons de SQL quando executa pesquis
167. as optimistic lock opcional padr o para true Especifica se mudan as para esta propriedade requerem ou n o bloqueio otimista Em outras palavras determina se um incremento de vers o deve ocorrer quando esta propriedade est suja generated opcional padr o para never Especifica que o valor da propriedade na verdade gerado pelo banco de dados Veja a discuss o do generated properties para maiores informa es typename pode ser 85 Capitulo 5 Mapeamento O R Basico 1 Onome de um tipo basico de Hibernate integer string character date timestamp float binary serializable object blob etc 2 O nome da classe Java com um tipo b sico padr o int float char java lang String java util Date java lang Integer java sql Clob etc 3 O nome da classe Java serializ vel 4 O nome da classe de um tipo customizado com illflow type MyCustomType etc Se voc n o especificar um tipo o Hibernate ir utilizar reflex o sobre a propriedade nomeada para ter uma id ia do tipo de Hibernate correto O Hibernate tentar interpretar o nome da classe retornada usando as regras 2 3 e 4 nesta ordem Em certos casos voc ainda precisar do atributo type Por exemplo para distinguir entre Hibernate DATE Hibernate TIMESTAMP OU para especificar um tipo customizado A fun o access permite que voc controle como o Hibernate ir acessar a propriedade em tempo de execu o Por padr o
168. as polim rficas 155 Capitulo 9 Mapeamento de Her Para essa estrat gia uma associa o polim rfica para Payment geralmente mapeada usando lt any gt lt any name payment meta type string id type long gt lt meta value value CREDIT class CreditCardPayment gt lt meta value value CASH class CashPayment gt lt meta value value CHEQUE class ChequePayment gt lt column name PAYMENT_CLASS gt lt column name PAYMENT_ID gt lt any gt 9 1 7 Mesclando polimorfismo impl cito com outros mapeamentos de heran a Existe ainda um item a ser observado sobre este mapeamento Como as subclasses s o mapeadas em seu pr prio elemento lt class gt e como O Payment apenas uma interface cada uma das subclasses pode ser facilmente parte de uma outra hierarquia de heran a E voc ainda pode usar pesquisas polim rficas em cima da interface Payment lt class name CreditCardPayment table CREDIT PAYMENT gt lt id name id type long column CREDIT PAYMENT ID gt lt generator class native gt lt id gt lt discriminator column CREDIT_CARD type string gt lt property name amount column CREDIT_AMOUNT gt lt subclass name MasterCardPayment discriminator value MDC gt lt subclass name VisaPayment discriminator value VISA gt lt class gt lt class name NonelectronicTransaction table NONELECTRONIC_TXN gt lt id name id type long column TXN_
169. aseada em Configura o 15 1 2 3 Trabalhando a associa o E EEEE aaa 17 1 2 4 Cole o de Valores aspas secrasiussasafuiseanaanagelsa aia Lada Ras a S 19 1 2 5 Associa es bidirecionais serrana 20 1 2 6 Trabalhando com links bidirecionais i ii 21 1 3 EventManager um aplicativo da web erraram 22 1 3 1 Criando um servlet b sico ii eeeearrraraaarananaa 22 1 3 2 Processando e renderizando ee ceeeee ee ee eee ee eeeaeeeeeeaaeeeeenaaes 23 1 3 3 Implementando e testando rear 26 4 SUM RIO eerie aa pio pb T a e renee te reer rere 27 2 AFQUIOLUIA E casas caso sasasi E T A La edesnueeeeenans E E E E 29 2 12 Vis o Geral aistien iaae aaa aa aaa a aa adia regada 29 2 2 Estados de inst ncia i iicie ieiteieciisavivie siafastoiste Gelade eed eee 32 2 3 Integra o JMA essien gedetas E eu sta nan ode lute anna lada 32 24 SUPOMO JE A srianan van a a E E a ET A T AEA 33 2 5 Sess es ConleXtUAIS sauna ssppisibivaea tee cuualecoteges ec daia aia aa a na 33 3 Configuration ionian aei e e oaie ee aaa a A a ki a eean 35 3 1 Configura o program tica cece aaa eeeeeeeeeeeeaeaaeeseeeeeeeeeaeaaeaneeeeeees 35 3 2 Obtendo uma SessionFactory ce eeeeeeeeeeeeee ee ae eae eeeeeeeeeeaeaaaeneeeeeeeeeaeaaea 36 3 9 Conex es JDBC erreren ccccccevdeteaveceh ac ass vine dad
170. aso voc tentar ajustar duas classes para o mesmo nome importado isto resultar numa exce o Observe que o elemento hibernate mapping permite que voc aninhe diversos mapeamentos de lt class gt persistentes como mostrado abaixo Entretanto uma boa pr tica e esperado por algumas ferramentas o mapeamento de apenas uma classe persistente simples ou uma hierarquia de classes simples em um arquivo de mapeamento e nome la ap s a superclasse persistente por exemplo cat nbm xml Dog hbm xml OU se estiver usando heran a Animal hbm xml 5 1 3 Classe Voc pode declarar uma classe persistente utilizando o elemento class Por exemplo lt class name ClassName table tableName discriminator value discriminator value mutable true false schema owner catalog catalog proxy ProxyInterface dynamic update true false dynamic insert true false select before update true false polymorphism implicit explicit 90000900000006 where arbitrary sql where condition 70 Classe o 0 8 6 persister PersisterClass batch size N D optimistic lock none version dirty all B lazy true false entity name EntityName check arbitrary sql check condition rowid rowid subselect SQL expression abstract true false node element name name opcional O nome da classe Java inteiramente qualificado da classe persistente ou interface Se a fun o
171. association can contain entities that are read only as well as entities that are not read only Entities are added and removed from both sides of the collection changes are flushed to the database If automatic versioning is used Hibernate will update the version due to changes in both sides of the collection if they dirty the entity owning the respective collections 186 Transacoes e Concorr ncia O fator mais importante sobre o Hibernate e o controle de concorr ncia que muito f cil de ser compreendido O Hibernate usa diretamente conex es de JDBC e recursos de JTA sem adicionar nenhum comportamento de bloqueio a mais Recomendamos que voc gaste algum tempo com o JDBC o ANSI e a especifica o de isolamento de transa o de seu sistema de ger ncia da base de dados O Hibernate n o bloqueia objetos na mem ria Sua aplica o pode esperar o comportamento tal qual definido de acordo com o n vel de isolamento de suas transa es de banco de dados Note que gra as ao session que tamb m um cache de escopo de transa o o Hibernate procura repetidamente por identificadores e consultas de entidade n o consultas de relat rios que retornam valores escalares Al m do versionamento para o controle autom tico de concorr ncia otimista o Hibernate oferece tamb m uma API menor para bloqueio pessimista de linhas usando a sint xe SELECT FOR UPDATE O controle de concorr ncia otimista e esta API s o discutidos m
172. ate Date date this date date public String getTitle return title public void setTitle String title this title title Voc pode ver que esta classe usa o padr o JavaBean para o nome convencional dos m todos de propriedade getter e setter como tamb m a visibilidade privada dos campos Este um padr o de projeto recomendado mas n o requerido O Hibernate pode tamb m acessar campos diretamente o benef cio para os m todos de acesso a robustez para o refactoring A propriedade id mant m um nico valor de identifica o para um evento particular Todas as classes persistentes da entidade bem como aquelas classes dependentes de menos import ncia precisam de uma propriedade de identifica o caso n s queiramos usar o conjunto completo de caracter sticas do Hibernate De fato a maioria das aplica es especialmente aplica es web precisam distinguir os objetos pelo identificador Portanto voc dever considerar esta uma caracter stica ao inv s de uma limita o Por m n s normalmente n o manipulamos a identidade de um objeto consequentemente o m todo setter dever ser privado O Hibernate somente nomear os identificadores quando um objeto for salvo O Hibernate pode acessar m todos p blicos privados e protegidos como tamb m campos p blicos privados protegidos diretamente A escolha sua e voc pode adaptar seu projeto de aplica o O construtor sem argumentos um requerimen
173. ate usar o org hibernate context JTASessionContext Tipicamente o valor deste par metro nomearia apenas a classe de implementa o para usar para as tr s implementa es fora da caixa entretanto h dois pequenos nomes correspondentes jta thread e managed 34 Configuration Devido ao fato do Hibernate ser projetado para operar em varios ambientes diferentes ha um grande n mero de par metros de configura o Felizmente a maioria possui valores padr o consider veis e o Hibernate distribu do com um arquivo hibernate properties de exemplo no etc que mostra v rias op es Apenas coloque o arquivo de exemplo no seu classpath e personalize o 3 1 Configura o program tica Uma inst ncia de org hibernate cfg Configuration representa um conjunto inteiro de mapeamentos de tipos Java de aplica o para um banco de dados SQL O org hibernate cfg Configuration usado para construir uma sessionFactory imut vel Os mapeamentos s o compilados a partir de diversos arquivos de mapeamento XML Voc pode obter uma inst ncia org hibernate cfg Configuration intanciando a diretamente e especificando os documentos de mapeamento XML Se os arquivos de mapeamento estiverem no classpath use addResource Por exemplo Configuration cfg new Configuration addResource Item hbm xm1 addResource Bid hbm xml Uma alternativa especificar a classe mapeada e permitir que o Hibernate encontre o docu
174. ategy This is explained in Se o 20 1 Estrat gias de Busca 10 4 Consultando Se o identificador do objeto que se est buscando n o for conhecido ser necess rio realizar uma consulta O Hibernate suporta uma linguagem de consulta HQL orientada a objetos f ceis de usar por m poderosos Para cria o via programa o de consultas o Hibernate suporta caracter sticas sofisticadas de consulta por Crit rio e Exemplo QBCe QBE Pode se tamb m expressar a consulta por meio de SQL nativa do banco de dados com suporte opcional do Hibernate para convers o do conjunto de resultados em objetos 10 4 1 Executando consultas Consultas HQL e SQL nativas s o representadas por uma inst ncia de org hibernate query Esta interface oferece m todos para associa o de par metros tratamento de conjunto de resultados e para a execu o de consultas reais Voc pode obter uma query usando a session atual List cats session createQuery from Cat as cat where cat birthdate lt setDate 0 date als List mothers session createQuery select mother from Cat as cat join cat mother as mother where cat name setString 0 name a Lists List kittens session createQuery from Cat as cat where cat mother setEntity 0 pk o dit Cat mother Cat session createQuery select cat mother from Cat as cat where cat T 162 Executando consultas setEntity 0 izi uniqueResult Que
175. ation instead of runtime reflection This is a System level property and cannot be set in hibernate cfg xml Reflection can sometimes be useful when troubleshooting Hibernate always requires either CGLIB or javassist even if you turn off the optimizer e g true false hibernate bytecode provider Both javassist or cglib can be used as byte manipulation engines the default is javassist e g javassist cglib 45 Capitulo 3 Configuration 3 4 1 Dialetos SQL Voc deve sempre determinar a propriedade hibernate dialect para a subclasse de org hibernate dialect Dialect correta de seu banco de dados Se voc especificar um dialeto o Hibernate usar padr es l gicos para qualquer um das outras propriedades listadas abaixo reduzindo o esfor o de especific los manualmente Tabela 3 8 Dialetos SQL do Hibernate hibernate dialect RDBMS Dialeto DB2 org hibernate dialect DB2Dialect DB2 AS 400 org hibernate dialect DB2400Dialect DB2 OS390 org hibernate dialect DB2390Dialect PostgreSQL org hibernate dialect PostgreSQLDialect Meu SQL org hibernate dialect MySQLDialect MeuSQL com InnoDB org hibernate dialect MySQLInnoDBDialect Meu SQL com MeulSAM org hibernate dialect MySQLMyISAMDialect Oracle qualquer vers o org hibernate dialect OracleDialect Oracle 9i org hibernate dialect Oracle9iDialect Oracle 10g org hibernate dialect Oraclel0gDialect Sybase org hibernate dialec
176. ation of a user session also means a higher probability of stale data 12 2 Demarca o de transa es de bancos de dados Os limites de uma transa o de banco de dados ou sistema s o sempre necess rios Nenhuma comunica o com o banco de dados pode ocorrer fora de uma transa o de banco de dados isto parece confundir muitos desenvolvedores que est o acostumados ao modo auto commit Sempre use os limites desobstru dos da transa o at mesmo para opera es 191 Cap tulo 12 Transa es e Con somente leitura Dependendo de seu n vel de isolamento e capacidade da base de dados isto pode n o ser requerido mas n o h nenhum aspecto negativo se voc sempre demarcar transa es explicitamente Certamente uma nica transa o ser melhor executada do que muitas transa es pequenas at mesmo para dados de leitura Uma aplica o do Hibernate pode funcionar em ambientes n o gerenciados isto aplica es standalone Web simples ou Swing e ambientes gerenciados J2EE Em um ambiente n o gerenciado o Hibernate geralmente respons vel pelo seu pr prio pool de conex es O desenvolvedor precisa ajustar manualmente os limites das transa os ou seja come ar submeter ou efetar rollback nas transa es ele mesmo Um ambiente gerenciado fornece transa es gerenciadas por recipiente CMT com um conjunto da transa es definido declarativamente em descritores de implementa o de beans de sess
177. bjeto continua v lida claro e a inst ncia desanexada pode ser acoplada a uma nova session no futuro tornando o novamente persistente e todas as modifica es sofridas Essa caracter stica habilita um modelo de programa o para unidades de trabalho de longa execu o que requeira um tempo de espera do usu rio Podemos cham las de transa es da aplica o ou seja uma unidade de trabalho do ponto de vista do usu rio Agora iremos discutir os estados e suas transi es e os m todos do Hibernate que disparam uma transi o em mais detalhes 10 2 Tornando os objetos persistentes As inst ncias recentemente instanciadas de uma classe persistente s o consideradas transientes pelo Hibernate Podemos transformar uma inst ncia transiente em persistente associando a a uma sess o 159 Capitulo 10 Trabalhando com DomesticCat fritz new DomesticCat fritz setColor Color GINGER fritz setSex M fritz setName Fritz Long generatedId Long sess save fritz Se cat possui um identificador gerado o identificador gerado e atribu do cat quando save for chamado Se cat possuir um identificador Associado ou uma chave composta o identificador dever ser atribu do inst ncia de cat antes que save seja chamado Pode se usar tamb m persist ao inv s de save com a sem ntica definida no novo esbo o do EJBS persist faz uma inst ncia transciente persistente No entan
178. bleCriteria session setMaxResults 100 list taxm commit 0 E session close Um DetachedCriteria tamb m pode ser usado para expressar uma subconsulta As inst ncias de crit rios que envolvem subconsultas podem ser obtidas atrav s das subqueries OU Property DetachedCriteria avgWeight DetachedCriteria forClass Cat class setProjection Property forName weight avg session createCriteria Cat class add Property forName weight gt avgWeight List DetachedCriteria weights DetachedCriteria forClass Cat class setProjection Property forName weight session createCriteria Cat class add Subqueries geAll weight weights alist At mesmo as subconsultas correlacionadas sao possiveis DetachedCriteria avgWeightForSex DetachedCriteria forClass Cat class cat2 setProjection Property forName weight avg add Property forName cat2 sex eqProperty cat sex session createCriteria Cat class cat add Property forName weight gt avgWeightForSex ISS EAO 241 Capitulo 16 Consultas por cr 16 9 Consultas por um identificador natural Para a maioria das consultas incluindo consultas de crit rios o cache de consulta n o muito eficiente pois a invalida o do cache de consulta ocorre com muita frequ ncia No entanto n o h um tipo de consulta especial onde possamos otimizar um algoritmo de invalida o de cache consultas realizada
179. bolsa ordenada ao inv s de um conjunto package eg import java util List public class Blog private Long _id private String _name private List _items public Long getId return _id public List getitems return _items public String getName return _name public void setId Long longl 10 longl public void setitems List list _items list public void setName String string _name string package eg import java text DateFormat import java util Calendar public class BlogItem private Long _id private Calendar _datetime private String _text private String title private Blog _blog public Blog getBlog return _blog 303 Cap tulo 23 Exemplo Aplicat 23 2 Mapeamentos Hibernate Os mapeamentos XML devem agora ser um tanto diretos Por exemplo public Calendar getDatetime return _datetime public Long getId return _id public String getText return _text public String getTitle return _title public void setBlog Blog blog blog blog J public void setDatetime Calendar calendar _datetime calendar public void setId Long longl id longa public void setText String string text string public void setTitle String string title string lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN http
180. bserve que os filtros n o requerem uma cl usula from embora possam ter um se requerido Os filtros n o s o limitados a retornar aos elementos de cole o Collection blackKittenMates session createFilter pk getKittens select this mate where this color eg Color BLACK intValue SEO At mesmo um filtro vazio til ex para carregar um subconjunto em uma cole o enorme Collection tenKittens session createFilter mother getKittens setFirstResult 0 setMaxResults 10 a Lee 10 4 3 Consulta por crit rio O HQL extremamente potente mas alguns desenvolvedores preferem construir consultas de forma din mica utilizando um API de objeto ao inv s de construir faixas de consultas O Hibernate oferece uma API de consulta de crit rio intuitiva para estes casos Criteria crit session createCriteria Cat class crit add Restrictions eq color eg Color BLACK crit setMaxResults 10 List cats erit ist The Criteria and the associated Example API are discussed in more detail in Cap tulo 16 Consultas por crit rios 10 4 4 Consultas em SQL nativa Voc pode expressar uma consulta em SQL utilizando createSQLQuery e deixar o Hibernate tomar conta do mapeamento desde conjuntos de resultados at objetos Note que voc pode chamar uma session connection a qualquer momento e usar a connection JDBC diretamente Se voc escolher utilizar a API Hibernate voc deve incluir as aliases SQ
181. ca extra lazy onde a maioria das opera es n o inicializa a cole o apropriado para cole es bem grandes inverse opcional padr o para false marque esta cole o como o lado inverso de uma associa o bidirecional cascade opcional padr o para none habilita opera es para cascata para entidades filho sort opcional especifica uma cole o escolhida com ordem de escolhanatural ou uma dada classe comparat ria order by opcional somente JDK1 4 especifica uma coluna da tabela ou colunas que define a ordem de itera o do map set ou bag juntos com um asc OU desc opcional where opcional especifica uma condi o SQL arbitr ria WHERE a ser usada quando recuperar ou remover a cole o Isto til se a cole o tiver somente um subconjunto dos dados dispon veis fetch opcional padr o para select escolha entre busca de uni o externa busca por sele o sequencial e busca por subsele o sequencial batch size Opcional padr o para 1 especifica um tamanho de lote para inst ncias de busca lazy desta cole o access opcional padr o para property A estrat gia que o Hibernate deve usar para acessar a cole o de valor de propriedade optimistic lock opcional padr o para true especifica que altera es para o estado da cole o resulta no incremento da vers o da pr pria entidade Para associa es um para muitos sempre bom desabilitar esta configura o mutable op
182. cece cere e eee e reece ne eres aa aa eres aa aa ee eeaaaaeeeeaaaaeeesaaaeees 177 11 1 Making persistent entities read only errar 177 11 1 1 Entities of immutable classes 0 cccccececeeeeeee arara 178 11 1 2 Loading persistent entities as read only 178 11 1 3 Loading read only entities from an HQL query criteria 179 11 1 4 Making a persistent entity read only 180 11 2 Read only affect on property type errar 181 1152 12 Simple properties sienose ainiin esn aaa dese cd ees LDA nina Sr teased 182 11 2 2 Unidirectional ASSOCIATIONS een 183 11 2 3 Bidirectional ASSOCIATIONS serasa 185 12 Transa es e Concorr ncia 20 0 0 ee eect teeta ete ee teen eeeeneeeeeeeeeeees 187 12 1 Sess o e escopos de transa es cece cece cece eee teeter eeeeeeaaaaeeeeeeeeeeeaaa 187 12 1 1 Unidade de trabalho siri aa arara 187 vi 12 1 2 Longas conversa es ieres eee cece rena AERAN PENEAN EEANN 189 12 1 3 Considerando a identidade do objeto 190 12 L4 EdI ES COMUNS assasonlis saias T saia Tag radia adia 191 12 2 Demarca o de transa es de bancos de dados 191 12 2 1 Ambiente n o gerenciado rar ereraa aaa 192 12 22 Usando JTA aussi ces etete can tad oncectined E T a E 193 12 2 3 Tratamento de Exce o
183. ceforge net projects c3p0 e proxoo http proxool sourceforge net No entanto n s usaremos o pool de conex o interna do Hibernate para este tutorial Para as configura es do Hibernate n s podemos usar um arquivo simples hibernate properties UM arquivo mais sofisticado hibernate cfg xml ou at mesmo uma instala o program tica completa A maioria dos usu rios prefere utilizar o arquivo de configura o XML lt xml version 1 0 encoding utf 8 gt lt DOCTYPE hibernate configuration PUBLIC Hibernate Hibernate Configuration DTD 3 0 EN http hibernate sourceforge net hibernate configuration 3 0 dtd gt lt hibernate configuration gt lt session factory gt lt Database connection settings gt lt property name connection driver class gt org hsqldb jdbcDriver lt property gt lt property name connection url gt jdbc hsqldb hsql localhost lt property gt lt property name connection username gt sa lt property gt lt property name connection password gt lt property gt lt l JDBC connection pool use the built in gt lt property name connection pool_size gt 1 lt property gt lt SQL dialect gt lt property name dialect gt org hibernate dialect HSQLDialect lt property gt Configura o do Hibernate lt Enable Hibernate s automatic session context management gt lt property name current_session_context_class gt t
184. centity tuplizer2 Segue abaixo parte do c digo a partir daquele pacote para ilustra o A very trivial JDK Proxy InvocationHandler implementation where we proxy an interface as the domain model and simply store persistent state in an internal Map This is an extremely trivial example meant only for illustration ay public final class DataProxyHandler implements InvocationHandler private String entityName private HashMap data new HashMap public DataProxyHandler String entityName Serializable id this entityName entityName data ue id Rod public Object invoke Object proxy Method method Object args throws Throwable String methodName method getName if methodName startsWith set String propertyName methodName substring 3 data put propertyName args 0 else if methodName startsWith get String propertyName methodName substring 3 return data get propertyName else if toString equals methodName return entityName data get Id else if hashCode equals methodName return new Integer this hashCode return null public String getEntityName return entityName public HashMap getData return data 63 Capitulo 4 Classes Persistentes a ERA public class ProxyHelper public static String extractEntityName Object object Our custom java lang reflect Proxy instances actuall
185. cessando os m todos mas evita que qualquer outra 21 Capitulo 1 Tutorial classe que n o esteja no mesmo pacote acesse a cole o diretamente Repita os passos para a cole o do outro lado E sobre o mapeamento da fun o inverse Para voc e para o Java um link bidirecional simplesmente uma quest o de configurar corretamente as refer ncias de ambos os lados O Hibernate entretanto n o possui informa o necess ria para ajustar corretamente as instru es INSERT UPDATE do SQL para evitar viola es de restri o e precisa de ajuda para manipular as associa es bidirecionais de forma apropriada Ao fazer um lado da associa o com a fun o inverse voc instrui o Hibernate para basicamente ignor lo considerando o uma c pia do outro lado Isso o necess rio para o Hibernate compreender todas as possibilidades quando transformar um modelo de navega o bidirecional em esquema de banco de dados do SQL As regras que voc precisa lembrar s o diretas todas as associa es bidirecionais necessitam que um lado possua a fun o inverse Em uma associa o de um para muitos precisar ser o lado de muitos j em uma associa o de muitos para muitos voc poder selecionar qualquer lado 1 3 EventManager um aplicativo da web Um aplicativo de web do Hibernate utiliza uma session e uma Transaction quase do mesmo modo que um aplicativo aut nomo Entretanto alguns modelos comuns s o teis
186. cesso ao campo para certas propriedades caso seja necess rio As propriedades precisam not ser declaradas como p blicas O Hibernate pode persistir uma propriedade com um par get set padr o protegido OU privado 4 2 Implementando heran a Uma subclasse tamb m deve observar as primeiras e segundas regras Ela herda sua propriedade de identificador a partir das superclasses cat Por exemplo package eg public class DomesticCat extends Cat private String name public String getName return name protected void setName String name this name name 4 3 Implementando equais nashcode Voc precisa substituir os m todos equals hashCode se voc pretender inserir inst ncias de classes persistentes em um set a forma mais recomendada representar associa es de muitos valores e pretender usar reconex o de inst ncias desanexadas O Hibernate garante a equival ncia de identidades persistentes linha de base de dados e identidade Java somente dentro de um certo escopo de sess o Dessa forma assim que misturarmos inst ncias recuperadas em sess es diferentes devemos implementar equals hashCode se quisermos ter sem nticas significativas para OS sets A forma mais bvia implementar equals nashcode comparando o valor do identificador de ambos objetos Caso o valor seja o mesmo ambos devem ter a mesma linha de base de dados assim eles ser o iguais se ambos forem
187. changes to the database If you have automatic versioning Hibernate will not increment the version if any simple properties change Session session factory openSession Transaction tx session beginTransaction get a contract and make it read only Contract contract Contract session get Contract class contractId Y session setReadOnly contract true contract getCustomerName is Sherman contract setCustomerName Yogi 182 Unidirectional associations tx commit tx session beginTransaction contract Contract session get Contract class contractId contract getCustomerName is still Sherman tx commit session close 11 2 2 Unidirectional associations 11 2 2 1 Unidirectional one to one and many to one Hibernate treats unidirectional one to one and many to one associations in the same way when the owning entity is read only We use the term unidirectional single ended association when referring to functionality that is common to unidirectional one to one and many to one associations Hibernate does not dirty check unidirectional single ended associations when the owning entity is read only If you change a read only entity s reference to a unidirectional single ended association to null or to refer to a different entity that change will not be flushed to the database Nota If an entity is of an immutable class then its references to unidire
188. cias PoEAA Padr es da Arquitetura do Aplicativo Enterprise 0 321 12742 0 por Martin Fowler Copyright O 2003 Pearson Education Inc Addison Wesley Publishing Company JPwH Persit ncia Java com Hibernate Segunda Edi o do Hibernate em A o 1 932394 88 5 http www manning com bauer2 por Christian Bauer e Gavin King Copyright O 2007 Manning Publications Co Manning Publications Co 331 332
189. cie uma propriedade de identificador opcional 57 4 1 3 Prefira classes n o finais opcional a 57 4 1 4 Declare acessores e mutadores para campos persistentes opcional 57 4 2 implementando heran a sessies iae aAa NAERA AERE AANA 58 4 3 Implementando equals e hashCode raras 58 4 4 Modelos din micos ii seca aaa aiae i aisa es 59 4 5 TUplizadores 2 2 size anta sareraisasavaaiGra iaae gera nada a raca dba a dadaa aaen Ka acces 61 4 6 EntityNameResolvers nn E 63 5 Mapeamento O R B sico eae ae nene aenaaraaae 67 5 1 Declara o de mapeamento errar aaa area aa acena 67 Delile DOC PG sunita atos Cassio inves TEA E dava Les nee 68 5 1 2 Mapeamento do Hibernate ease 69 DIS ASSO Sra Eai so Pera aree tea van a a a RR Da a 70 VAS 1 E RR TEN PENNE ERREI PE RR ERES ede ec ee a 74 5 1 5 Aprimora o dos geradores de identificador eeen ee reenen 78 5 1 6 Otimiza o do Gerador de Identifica o eener nenene 79 521 72 COMPOSI O IO isto zeassisasas siena s so aA E AAE Ea andas paro AAE eens needa pad 80 5 1 8 DISCHMINA OR cerere eneren inneren EKETE REER edt Saes an alisa sanada KE REE 81 5 1 9 Vers o opcional asse innana aaia ees 82 5 10 Timestamp OPCIONAl ssrds saasina a TREE 83 Dalle lle ado 0 516 AGC core aT E T T 84 5
190. cional padr o para true um valor de false especifica que os elementos da cole o nunca mudam Isto permite uma otimiza o m nima do desempenho em alguns casos 115 Capitulo 6 Mapeamento de col 6 2 1 Chaves Externas de Colecao Inst ncias de cole o s o distinguidas no banco de dados pela chave exterior da entidade que possui a cole o Esta chave exterior referida como a coluna de chave de cole o ou colunas da tabela de cole o A coluna de chave de cole o mapeada pelo elemento lt key gt Pode existir uma restri o de nulabilidade na coluna da chave exterior Para a maioria das cole es isto est impl cito Para associa es unidirecionais um para muitos a coluna de chave estrangeira anulavel por padr o portanto voc pode precisar especificar not null true lt key column productSerialNumber not null true gt yi H T CASCADE A restri o da chave exterior pode usar ON DELE lt key column productSerialNumber on delete cascade gt Veja nos cap tulos anteriores para uma completa defini o do elemento lt key gt 6 2 2 Elementos de colecao As cole es podem conter quase qualquer outro tipo de Hibernate incluindo todos os tipos b sicos tipos padronizados e claro refer ncias a outras entidades Isto uma distin o importante um objeto em uma cole o pode ser manipulada com as sem nticas valor seu ciclo de v
191. ckMode READ do a version check using SELECT FOR UPDATE then reassociate sess lock pk LockMode UPGRADE 169 Cap tulo 10 Trabalhando com Note que lock pode ser usado com diversos LockModes veja a documenta o API e o cap tulo sobre manuseio de transa es para maiores informa es Re acoplamento n o o nico caso de uso para lock Other models for long units of work are discussed in Se o 12 3 Controle de concorr ncia otimista 10 7 Detec o autom tica de estado Os usu rios de Hibernate solicitaram um m todo geral tanto para salvar uma inst ncia transiente gerando um novo identificador quanto para atualizar re acoplar as inst ncias desanexadas associadas ao seu identificador atual O m todo saveOrUpdate implementa esta funcionalidade fi in the first session Cat cat Cat firstSession load Cat class catID in a higher tier of the application Cat mate new Cat cat setMate mate later in a new session secondSession saveOrUpdate cat update existing state cat has a non null id secondSession saveOrUpdate mate save the new instance mate has a null id O uso e sem ntica do saveorUpdate parecem ser confusos para novos usu rios A principio enquanto voc n o tentar usar inst ncias de uma sess o em outra nova sess o n o precisar utilizar update saveorUpdate OU merge Algumas aplica es inteiras nunca precisar
192. class e faDle 1CATST RA public class Cat private Long id identifier private Date birthdate private Cat mother private Set kittens private Color color private char sex private float weight hibernate id generator class native column CAT ID Ey public Long getId return id private void setId Long id this id id Qhibernate many to one column PARENT ID S public Cat getMother return mother void setMother Cat mother this mother mother J Ek hibernate property colum BIRTH DATE EA public Date getBirthdate return birthdate void setBirthdate Date date birthdate date hibernate property column WEIGHT wie 107 Capitulo 5 Mapeamento O R Basico public float getWeight return weight void setWeight float weight this weight weight hibernate property column COLOR not null true A public Color getColor return color void setColor Color color this color color hibernate set inverse true order by BIRTH DATE hibernate collection key column PARENT ID Qhibernate collection one to many A public Set getKittens return kittens void setKittens Set kittens this kittens kittens i addKitten not needed by Hibernate public void addKitten Cat kitten kittens add kitten hibernate property column SEX not null true
193. class MyEntityTuplizer extends PojoEntityTuplizer public MyEntityTuplizer EntityMetamodel entityMetamodel PersistentClass mappedEntity super entityMetamodel mappedEntity public EntityNameResolver getEntityNameResolvers return new EntityNameResolver MyEntityNameResolver INSTANCE public String determineConcreteSubclassEntityName Object entityInstance SessionFactoryImplementor factory String entityName ProxyHelper extractEntityName entityInstance 64 EntityNameResolvers if entityName null entityName super determineConcreteSubclassEntityName entityInstance factory return entityName Com o objetivo de registrar um org hibernate EntityNameResolver OS usu rios devem tanto 1 Implementar um Tuplizer personalizado implementando o m todo get Ent ityNameResolvers 2 Registra lo com o org hibernate impl SessionFactoryImpl que a classe de implementa o para org hibernate SessionFactory usando o m todo registerEntityNameResolver 65 66 Mapeamento O R Basico 5 1 Declara o de mapeamento O mapeamento de objeto relacional geralmente definido em um documento XML O documento de mapeamento criado para ser de leitura e edit vel manualmente A linguagem do mapeamento Java centric ou seja os mapeamentos s o constru dos em torno de declara es de classe persistente e n o de declara es de tabelas Note que embora muitos us
194. commit session close Note que os tipos de vers es padronizadas org hibernate usertype UserVersionType Nao s o permitidos junto as instru es update versioned Para executar um HQL DELETE use o mesmo m todo query executeUpdate Session session sessionFactory openSession Transaction tx session beginTransaction String hqlDelete delete Customer c where c name oldName or String hqlDelete delete Customer where name oldName int deletedEntities s createQuery hqlDelete setString oldName oldName 212 Opera es no estilo DML executeUpdate tx commit session close O valor int retornado pelo m todo Query executeUpdate indica o n mero de entidade afetadas pela opera o Lembre se que isso pode estar ou n o relacionado ao n mero de linhas alteradas no banco de dados Uma opera o de volume HQL pode resultar em v rias instru es SQL atuais a serem executadas por exemplo no caso de subclasses unidas O n mero retornado indica a quantidade real de entidades afetadas pela instru o Voltando ao exemplo da subclasse unida a exclus o de uma das subclasses pode resultar numa exclus o em outra tabelas n o apenas na tabela para qual a subclasses est mapeada mas tamb m tabela root e possivelmente nas tabelas de subclasses unidas num n vel hier rquico imediatamente abaixo A pseudo sint xe para o comando INSERT IN
195. consulta Query q s createQuery from foo Foo as foo where foo name name and foo size size q setProperties fooBean fooBean has getName and getSize List toos ca ais As cole es s o pagin veis usando a interface Query com um filtro Query q s createFilter collection the trivial filter q setMaxResults PAGE_SIZE q setFirstResult PAGE_SIZE pageNumber List page q list Os elementos da cole o podem ser ordenados ou agrupados usando um filtro de consulta Collection orderedCollection s filter collection order by this amount Collection counts s filter collection select this type count this group by this type Pode se achar o tamanho de uma cole o sem inicializ la Integer session createQuery select count from iterate next intValue 15 17 Componentes Os componentes podem ser usados de quase todas as formas que os tipos de valores simples s o usados nas consultas HQL Eles podem aparecer na cl usula select select p name from Person p select p name first from Person p onde a propriedade do nome da Person um componente Os componentes tamb m podem ser utilizados na cl usula where from Person p where p name name from Person p where p name first firstName 233 Capitulo 15 HQL A Linguagem Os componentes tamb m podem ser usados na clausula order by from Person p order by p name from Person p or
196. corretamente todo o resultado Isso tamb m significa que voc n o pode chamar essas consultas usando consulta scroll 15 9 A cl usula where A cl usula where permite estreitar a lista de inst ncias retornadas Se n o houver refer ncia alguma pode se referir propriedades pelo nome from Cat where name Fritz Se houver uma refer ncia use o nome da propriedade qualificada from Cat as cat where cat name Fritz Isto retorna inst ncias de cat com nome Fritz 221 Capitulo 15 HQL A Linguagem A seguinte consulta select 00 from Foo foo Bar bar where foo startDate bar date retornara todas as instancias de Foo para cada um que tiver uma instancia de bar com a propriedade date igual a propriedade startDate de Foo Express es de caminho compostas fazem da clausula where extremamente poderosa Consideremos from Cat cat where cat mate name is not null Esta consulta traduz para uma consulta SQL com uma tabela inner uni o Por exemplo from Foo foo where foo bar baz customer address city is not null resultaria numa consulta que necessitasse de uni o de quatro tabelas no SQL O operador pode ser usado para comparar n o apenas propriedades mas tamb m inst ncias from Cat cat Cat rival where cat mate rival mate select cat mate from Cat cat Cat mate where cat mate mate The special property lowercase id can be used to reference the unique identifier of
197. createCriteria Cat class add Restrictions like name F createCriteria kittens add Restrictions like name F ASEO Note que o segundo createCriteria retorna uma nova inst ncia de criteria que refere aos elementos da cole o kittens A seguinte forma alternada til em certas circunst ncias List cats sess createCriteria Cat class createAlias kittens kt createAlias mate mt add Restrictions eqProperty kt name mt name ASE createAlias n o cria uma nova inst ncia de Criteria Note que as cole es de kittens mantidas pelas inst ncias cat retornadas pelas duas consultas anteriores n o s o pr filtradas pelo crit rio Se voc desejar recuperar somente os kittens que se encaixarem ao crit rios voc dever usar uM ResultTransformer List cats sess createCriteria Cat class createCriteria kittens kt add Restrictions eq name F setResultTransformer Criteria ALIAS TO ENTITY MAP nS AOE Iterator iter cats iterator while iter hasNext Map map Map iter next Cat cat Cat map get Criteria ROOT ALIAS Cat kitten Cat map get kt Voc pode ainda manipular o conjunto do resultado usando a jun o exterior restante List cats session createCriteria Cat class createAlias mate mt Criteria LEFT JOIN Restrictions like mt name good addOrder Order asc mt age 237 Capitu
198. ctional single ended associations must be assigned when that entity is first created Because the entity is automatically made read only these references can not be updated If automatic versioning is used Hibernate will not increment the version due to local changes to unidirectional single ended associations In the following examples Contract has a unidirectional many to one association with Plan Contract cascades save and update operations to the association The following shows that changing a read only entity s many to one association reference to null has no effect on the entity s database representation get a contract with an existing plan make the contract read only and set its plan to null tx session beginTransaction Contract contract Contract session get Contract class contractia session setReadOnly contract true 183 Capitulo 11 Read only entities contract setPlan null tx commit get the same contract tx session beginTransaction contract Contract session get Contract class contractId contract getPlan still refers to the original plan Ex commit session close The following shows that even though an update to a read only entity s many to one association has no affect on the entity s database representation flush still cascades the save update operation to the locally changed association get a contract with an existing plan
199. d gt lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId not null addressId bigint not null primary key create table Address addressId bigint not null primary key 7 3 2 Muitos para um Uma associa o unidirecional muitos para um em uma tabela associativa bastante comum quando a associa o for opcional lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt join table PersonAddress optional true gt lt key column personId unique true gt lt many to one name address column addressId not null true gt lt join gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt eia gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null primary key addressId bigint not null create table Address addressId bigint not null primary key 134 Um para um 7 3 3 Um para um Uma associa o unidirecional um para um em uma tabela associativa extremamente incomum mas poss vel lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt join table PersonAddress optional true gt lt key column personId unique tru
200. dades usando buscar todas as propriedades no HQL 276 O Cach de Segundo Nivel 20 2 O Cach de Segundo Nivel Uma session do Hibernate um cache de nivel transacional de dados persistentes E possivel configurar um cluster ou um cache de nivel JVM nivel SessionFactory em uma estrutura classe por classe e cole o por cole o Voc pode at mesmo plugar em um cache em cluster Tenha cuidado pois os caches nunca sabem das mudan as feitas em armazenamento persistente por um outro aplicativo No entanto eles podem ser configurados para dados em cache vencido regularmente Voc tem a op o de informar o Hibernate sobre qual implementa o de cache utilizar especificando o nome de uma classe que implementa org nibernate cache CacheProvider usando a propriedade hibernate cache provider class O Hibernate vem envolvido com um n mero de integra es constru das com provedores de cache de fonte aberta listados abaixo Al m disso voc pode implementar seu pr prio e plug lo como mencionado acima Note que as vers es anteriores ao padr o 3 2 utilizam EhCache como provedor de cache padr o Tabela 20 1 Provedores de Cache Cache Classe de provedor Tipo Seguran a Cache de de Cluster Consulta Suportado Hashtable org hibernate cache HashtableCachemem riar yes n o recomendado para uso de produ o EHCache org hibernate cache EhCacheProvidemem ria yes disco OSCache o
201. dados ocasionalmente ou seja se for extremamente improv vel que as duas transa es tentem atualizar o mesmo tem simultaneamente e n o for requerido uma isola o de transa o estrita o uso deum cache de nonstrict read write pode ser mais apropriado Se um cache usado em ambiente JTA voc dever especificar o hibernate transaction manager lookup class Em outros ambientes voc deve assegurar que a transa o esta completa quando a session close OU Session disconnect for chamada 20 2 5 Estrat gia transacional A estrat gia de cache transactional prov suporte para provedores de cache transacional completo como o JBoss TreeCache Tal cache deve ser usado somente em um ambiente JTA e voc dever especificar O hibernate transaction manager lookup class 20 2 6 Compatibilidade de Estrat gia de Concorr ncia de Cache Provedor Ss Importante Nenhum provedor de cache suporta todas as estrat gias de concorr ncia de cache A seguinte tabela mostra qual provedor compat vel com qual estrat gia de concorr ncia Tabela 20 2 Suporte de Estrat gia de Concorr ncia de Cache Cache somente leitura leitura escrita leitura escrita transacional n o estrita Hashtable n o yes yes yes recomendado para uso de produ o EHCache yes yes yes 219 Capitulo 20 Aumentando o des Cache somente leitura leitura escrita leitura escrita transacional n o estrita OSCache yes yes yes
202. das utilize o f rum do usu rio encontrado no website Hibernate N s tamb m provemos o JIRA sistema de quest o de rastreamento para os relat rios de erros de programa o xi Prefacio e recursos solicitados Se voc tem interesse no desenvolvimento do Hibernate participe da lista de correio eletr nico do desenvolvedor Caso voc tenha interesse em traduzir este documento na sua pr pria l ngua por favor entre em contato conosco atrav s da lista de correio eletr nico do desenvolvedor O suporte do desenvolvimento comercial suporte de produ o e treinamento de Hibernate est dispon vel atrav s do JBoss Inc see http Awww hibernate org SupportTraining Hibernate um projeto de Fonte Aberta Profissional e componente cr tico do Sistema Jboss de Empreendimento e Middleware JEMS su te de produtos xii Tutorial Intencionado para novos usu rios este capitulo fornece uma introdu o detalhada do Hibernate come ando com um aplicativo simples usando um banco de dados em mem ria O tutorial baseado num tutorial anterior desenvolvido por Michael Gloegl Todo o c digo est contido no diret rio tutorials web da fonte do projeto Importante Este tutorial espera que o usu rio tenha conhecimento de ambos Java e SQL Caso voc tenha um conhecimento limitado do JAVA ou SQL recomendado que voc inicie com uma boa introdu o quela tecnologia antes de tentar entender o Hibernate Nota
203. date foo Use merge if foo might have been loaded already Er comme session close Outra vez o Hibernate verificar vers es da inst ncia durante a libera o lan ando uma exce o se ocorrer conflitos de atualiza es Voc pode tamb m chamar o lock em vez de update e usar LockMode READ executando uma checagem de vers o ignorando todos os caches se voc estiver certo de que o objeto n o foi modificado 12 3 4 Versionamento autom tico customizado Voc pode desabilitar o incremento da vers o autom tica de Hibernate para propriedades e cole es particulares configurando a fun o de mapeamento optimistic lock para false O Hibernate ent o n o incrementar mais vers es se a propriedade estiver modificada Os esquemas da base de dados legado s o frequentemente est ticos e n o podem ser modificados Ou ent o outras aplica es puderam tamb m acessar a mesma base de dados 199 Cap tulo 12 Transa es e Con e n o sabem tratar a vers o dos n meros ou carimbos de hora Em ambos os casos o versionamento n o pode confiar em uma coluna particular em uma tabela Para for ar uma checagem de vers o sem uma vers o ou mapeamento da propriedade do carimbo de hora com uma compara o do estado de todos os campos em uma linha configure optimistic lock all no mapeamento lt class gt Note que isto conceitualmente somente feito em trabalhos se o Hibernate puder comparar o
204. de result 29 result getLitterId return result A business key does not have to be as solid as a database primary key candidate see Se o 12 1 3 Considerando a identidade do objeto Immutable or unique properties are usually good candidates for a business key 4 4 Modelos dinamicos Nota The following features are currently considered experimental and may change in the near future Entidades persistentes nao precisam ser representadas como classes POJO ou como objetos JavaBeans em tempo de espera O Hibernate tamb m suporta modelos dinamicos usando Maps de maps em tempo de execu o e a representa o de entidades como rvores DOM4J Com esta abordagem voc n o escreve classes persistes somente arquivos de mapeamentos By default Hibernate works in normal POJO mode You can set a default entity representation mode for a particular SessionFactory using the default entity mode configuration option see Tabela 3 3 Propriedades de Configura o do Hibernate 59 Capitulo 4 Classes Persistentes Os seguintes exemplos demonstram a representa o usando maps Primeiro no arquivo de mapeamento um entity name precisa ser declarado ao inv s de ou al m de um nome de classe lt hibernate mapping gt lt class entity name Customer gt lt id name id type long column ID gt lt generator class sequence gt lt id gt lt property name name column NAME type s
205. de em que as subconsultas podem conter uni es A clausula onde tamb m opcional Como exemplo para executar um HQL UPDATE use o m todo query executeUpdate O m todo ganhou o nome devido sua familiaridade com o do JDBC PreparedStatement executeUpdate Session session sessionFactory openSession Transaction tx session beginTransaction String hqlUpdate update Customer c set c name newName where c name oldName or String hqlUpdate update Customer set name newName where name oldName int updatedEntities s createQuery hqlUpdate setString newName newName setString oldName oldName executeUpdate tz commit Iz session close As instru es do HQL upDATE por padr o n o afetam o version ou os valores de propriedade timestamp para as entidades afetadas de acordo com a especifica o EJB3 No entanto voc poder for ar o Hibernate a redefinir corretamente os valores de propriedade version ou timestamp Usando um versioned update Para tal adicione uma palavra chave VERSIONED ap s a palavra chave UPDATE Session session sessionFactory openSession Transaction tx session beginTransaction String hqlVersionedUpdate update versioned Customer set name newName where name oldName int updatedEntities s createQuery hqlUpdate setString newName newName setString oldName oldName executeUpdate tz
206. de uni o em mais do que uma cole o em uma consulta ent o tome cuidado nesses casos Uma busca de uni o em v rias cole es pode trazer resultados inesperados para mapeamentos do tipo bag tome cuidado na hora de formular consultas como essas Finalmente observe o seguinte a busca de uni o completa busca de uni o direita nao s o importantes Se estiver usando o n vel de propriedade busca lazy com instrumenta o de bytecode poss vel for ar o Hibernate a buscar as propriedades lazy imediatamente na primeira consulta usando buscar todas as propriedades from Document fetch all properties order by name 217 Capitulo 15 HQL A Linguagem from Document doc fetch all properties where lower doc name like Scats 15 4 Formas de sintaxe de uni es O HQL suporta duas formas de associa o para uni o impl cita expl cita As consultas apresentadas na se o anterior usam a forma expl cita onde a palavra chave uni o explicitamente usada na cl usula from Essa a forma recomendada A forma impl cita n o usa a palavra chave uni o Entretanto as associa es s o diferenciadas usando pontua o dot notation Unidesimplicitas podem aparecer em qualquer uma das cl usulas HQL A uni o impl cita resulta em declara es SQL que cont m uni es inteiras from Cat as cat where cat mate name like s 15 5 Refer ncia a propriedade do identificador Geralmente existem duas
207. der by p name first Outro uso comum dos componentes nos row value constructors 15 18 Sintaxe do construtor de valores de linha O HQL suporta o uso da sintaxe ANSI SQL row value constructor algumas vezes chamado de sint xe tupla embora o banco de dados adjacente possa n o suportar esta no o Aqui n s geralmente nos referimos s compara es de valores m ltiplos tipicamente associada aos componentes Considere uma entidade Person que define um componente de nome from Person p where p name first John and p name last Jingleheimer Schmidt Esta uma sint xe v lida embora um pouco verbosa Seria timo tornar essa sint xe um pouco mais concisa e utilizar a sint xe row value constructor from Person p where p name John Jingleheimer Schmidt Pode tamb m ser util especificar isto na clausula select select p name from Person p Com o uso da sintaxe row value constructor e que pode ser de ben fico seria quando utilizar as subconsultas que precisem comparar com os valores multiplos from Cak as cat where not cat name cat color in select cat name cat color from DomesticCat cat Ao decidir se voc quer usar esta sintaxe ou nao deve se considerar o fato de que a consulta sera dependente da ordena o das sub propriedades do componente no metadados 234 Consultas por criterios O Hibernate prov uma API de consulta por crit rio intuitiva e extensivel 16 1 Criando uma inst ncia cri
208. deve ser recuperada de forma pregui osa quando a vari vel da inst ncia for acessada pela primeira vez Isto requer instrumenta o de bytecode de tempo de constru o lazy false especifica que a associa o ter sempre uma busca antecipada eager fetched Note que se constrained false ser imposs vel efetuar o proxing e o Hibernate ir realizar uma busca antecipada na associa o entity name opcional O nome da entidade da classe associada Existem duas variedades de associa es um pra um Associa es de chave prim ria Associa es de chave exterior exclusiva Associa es de chave prim ria n o necessitam de uma coluna extra de tabela Se duas linhas forem relacionadas pela associa o ent o as duas linhas da tabela dividem o mesmo valor da chave prim ria Assim se voc quiser que dois objetos sejam relacionados por uma associa o de chave prim ria voc deve ter certeza que foram atribu dos com o mesmo valor identificador Para uma associa o de chave prim ria adicione os seguintes mapeamentos em Employee Person respectivamente lt one to one name person class Person gt lt one to one name employee class Employee constrained true gt Agora devemos assegurar que as chaves prim rias de linhas relacionadas nas tabelas PERSON e EMPLOYEE s o iguais N s usamos uma estrat gia especial de gera o de identificador do Hibernate chamada foreign lt class name person t
209. dex que se aplicam s refer ncias de cole es associadas e indexadas As fun es HQL que retornam express es de cole es de valores size minelement maxelement minindex maxindex junto com o elemento especial elements e fun es de indices que podem ser quantificadas usando some all exists any in Qualquer fun o escalar suportada pelo banco de dados como sign trunc rtrim sin Par metros posicionais ao estilo JDBC Par metros nomeados name start date O x1 e Literais SQL foo 69 6 66E 2 1970 01 01 10 00 01 0 e Constantes Java final est tico p blicoex Color TABBY in between podem ser usadas da seguinte maneira from DomesticCat cat where cat name between A and B from DomesticCat cat where cat name in Foo Bar Baz As formas negativas podem ser escritas conforme segue abaixo from DomesticCat cat where cat name not between A and B from DomesticCat cat where cat name not in Foo Bar Baz Da mesma forma is null is not null podem ser usados para testar valores nulos Booleanos podem ser facilmente usados em express es declarando as substitui es da consulta HQL na configura o do Hibernate lt property name hibernate query substitutions gt true 1 false 0 lt property gt 224 Express es Isso ir substituir as palavras chave true e falsepelos literais 1 e 0 na tradu o do HQL para SQL fro
210. do Hibernate cfg xml ou voc pode tamb m reverter completamente o engenheiro um esquema de banco de dados existente para arquivos de fonte POJO e arquivos de mapeamento do Hibernate O assistente de engenharia reversa suporta modelos padroniz veis Por favor consulte o pacote Ferramentas do Hibernate e suas documenta es para maiores informa es No entanto o pacote principal do Hibernate vem em lote com uma ferramenta integrada SchemaExport aka hbm2dd1 Ele pode tamb m ser usado dentro do Hibernate 21 1 Gera o de esquema autom tico O DDL pode ser gerado a partir dos arquivos de mapeamento atrav s dos utilit rios do Hibernate O esquema gerado inclui as restri es de integridade referencial prim ria e chave estrangeira para entidade e tabela de cole o Tabelas e sequ ncia s o tamb m criadas por geradores de identificador mapeado Voc deve especificar um SQL Dialect atrav s da propriedade hibernate dialect ao usar esta ferramenta uma vez que o DDL um fabricante bastante espec fico Primeiro padronize seus arquivos de mapeamento para melhorar o esquema gerado A pr xima se o cobrir a personaliza o do esquema 289 Capitulo 21 Guia de Toolset 21 1 1 Padronizando o esquema Muitos elementos de mapeamento do Hibernate definem fun es opcionais nomeadas length precision e scale Voc deve ajustar o length precision e scale de uma coluna com esta fun o lt property name
211. do Hibernate o esquema do banco de dados pode ser facilmente normalizado e seguro permitindo adicionar uma implementa o modelo de dom nio apropriado na camada do topo num futuro pr ximo Modos de representa o de entidade podem ser tamb m ajustados para base por Session Session dynamicSession pojoSession getSession EntityMode MAP Create a customer Map david new HashMap david put name David dynamicSession save Customer david dynamicSession flush dynamicSession close Continue on pojoSession Por favor note que a chamada para a getSession usando um EntityMode est na API de session e n o na SessionFactory Dessa forma a nova Session compartilha a conex o transa o e outra informa o de contexto JDBC adjacente Isto significa que voc n o precisar chamar flush close na Session secund ria e tamb m deixar a transa o e o manuseio da conex o para a unidade prim ria do trabalho More information about the XML representation capabilities can be found in Cap tulo 19 Mapeamento XML 4 5 Tuplizadores org hibernate tuple Tuplizer suas sub interfaces s o respons veis por gerenciar uma certa representa o de uma parte de dado dada a org hibernate EntityMode da representa o Se uma parte de dado tida como uma estrutura de dado ent o o tuplizador se encarrega de criar tal estrutura de dado e como extrair e injetar valores de e em tal estrutura
212. do chamado perfil de busca que uma associa o de configura o de nomeada com O org hibernate SessionFactory por m ativado pelo nome no org hibernate Session Uma vez ativado no org hibernate Session O perfil de busca ser afetado pelo org hibernate Session at que o mesmo seja completamente desativado O que isto significa A explica o ser atrav s de um exemplo Vamos dizer que n s temos os seguintes mapeamentos lt hibernate mapping gt lt class name Customer gt lt set name orders inverse true gt lt key column cust_id gt lt one to many class Order gt lt set gt lt class gt lt class name Order gt lt class gt 274 Perfis de Busca lt hibernate mapping gt Normalmente quando voc recebe uma refer ncia para um cliente em particular o conjunto do cliente de pedidos ser lento significando que n s ainda n o baixamos estes pedidos a partir do banco de dados Na maioria das vezes isto bom Agora vamos imaginar que voc possui um determinado caso de uso onde mais eficiente carregar o cliente e outros pedidos juntos Uma maneira correta utilizar as estrat gias de busca din mica atrav s de um HQL ou consultas de crit rio Entretanto outra op o usar um perfil de busca para atingir o mesmo objeto Apenas adicione o seguinte a seu mapeamento lt hibernate mapping gt lt fetch profile name customer with orders gt lt fetch entity Customer a
213. dos casos necessita se da inje o de alias acima Para consultas relatadas aos mapeamentos mais complexos como as propriedades compostas discriminadores de heran a cole es etc voc pode usar aliases espec ficos que permitem o Hibernate injetar os aliases apropriados As seguintes tabelas mostram as diferentes formas de usar uma inje o de alias Por favor note que os nomes de alias no resultado s o exemplos cada alias ter um nome nico e provavelmente diferente quando usado Tabela 17 1 Nomes de inje o de alias Descri o Sint xe Exemplo Uma propriedade aliasname A NAME as item name simples propertyname 246 Retorno de entidades nao gerenciadas Descri o Sint xe Exemplo Uma propriedade aliasname CURRENCY as item amount currency VALUE composta componentname as item amount value propertyname Discriminador de aliasname clas9ISC as item class uma entidade Todas as aliasname item propriedades de uma entidade Uma chave de aliasname key ORGID as coll key cole o O id de uma aliasname id EMPID as coll id cole o O elemento de uma cole o propriedade elemento cole o Todas propriedades elemento cole o Todas propriedades cole o de na as de na as da propertyname aliasname aliasname el aliasname el em em iD as coll element NAME as coll
214. duplicar valores de elementos e nao possui coluna de indice n o se deve definir nenhuma chave prim ria O Hibernate n o tem como distinguir entre linhas duplicadas O Hibernate resolve este problema removendo completamente em um nico DELETE e recria a cole o quando mudar Isto pode ser bastante ineficiente H Note que para uma associa o um para muitos a chave prim ria pode n o ser a chave prim ria f sica da tabela do banco de dados mas mesmo neste caso a classifica o acima ainda til Isto reflete como o Hibernate localiza linhas individuais da cole o 20 5 2 Listas mapas bags de id e conjuntos s o cole es mais eficientes para atualizar A partir da discuss o acima deve ficar claro que as cole es indexadas e conjuntos geralmente permitem uma opera o mais eficente em termos de adi o remo o e atualiza o de elementos Existe ainda mais uma vantagem das cole es indexadas sob conjuntos para associa es muitos para muitos Por causa da estrutura de um set o Hibernate nunca utiliza o comando UPDATE em uma linha quando um elemento modificado As mudan as para o Conjunto funcionam sempre atrav s do comando INSERT DELETE de linhas individuais Novamente esta considera o n o se aplica s associa es um para muitos H Ap s observar que as matrizes n o podem ser pregui osas n s concluimos que as listas mapas e bags de id s o ti
215. e 13 1 Interceptadores A interface Interceptor permite fornecer informa es da sess o para o aplicativo permitindo que o aplicativo inspecione e ou manipule as propriedades de um objeto persistente antes de ser salvo atualizado exclu do ou salvo Pode ser usado para gerar informa es de auditoria Por exemplo o seguinte Interceptor ajusta a fun o automaticamente createTimestamp quando um Auditable criado e atualiza a fun o lastUpdateTimestamp quando um Auditable atualizado Voc pode implementar Interceptor diretamente ou pode estender empty Interceptor package org hibernate test import java io Serializable import java util Date import java util Iterator import org hibernate EmptyInterceptor import org hibernate Transaction import org hibernate type Type public class AuditInterceptor extends EmptyInterceptor private int updates private int creates private int loads public void onDelete Object entity Serializable id Object state String propertyNames Type types do nothing public boolean onFlushDirty Object entity Serializable id Object currentState Object previousState String propertyNames Type types if entity instanceof Auditable updates for int i 0 i lt propertyNames length i if lastUpdateTimestamp equals propertyNames i 203 Capitulo 13 Interceptadores currentState i new Date return
216. e todos os filhos passar o para saveOrUpdate Se um filho transiente ou desanexado se tornar referenciado pelo pai persistente ele ser passado para saveorUpdate Se um pai for deletado todos os filhos ser o passados para delete Se um filho for diferenciado pelo pai persistente nada de especial acontece a aplica o deve explicitamente deletar o filho se necess rio a n o ser que casca de delete orphan nos quais casos o filho rf o deletado 174 Usando metadados Finalmente note que o cascateamento das opera es podem ser aplicados a um grafo de objeto em tempo de chamada ou em tempo de limpeza Todas as opera es se habilitadas s o colocadas em cascata para entidades associadas ating veis quando a opera o for executada No entanto save upate delete orphan sao transitivas para todas as entidades associadas ating veis durante a limpeza da sess o 10 12 Usando metadados O Hibernate requer um modelo muito rico em n vel de metadados de todas as entidades e tipos de valores De tempos em tempos este modelo muito til pr pria aplica o Por exemplo a aplica o pode usar os metadados do Hibernate que executa um algoritmo inteligente que compreende quais objetos podem ser copiados por exemplo tipos de valores mut veis ou n o por exemplo tipos de valores imut veis e possivelmente entidades associadas O Hibernate exp e os metadados via interfaces class
217. e o para logo antes da transa o ser submetida Alternativamente n s podemos usar uma cole o ou associa o n o pregui osa especificando lazy false para o mapeamento da associa o Por m pretendido que a inicializa o pregui osa seja usada por quase todas as cole es e associa es Se voc definir muitas associa es n o pregui osas em seu modelo de objetos o Hibernate ir precisar buscar no banco de dados inteiro da mem ria em cada transa o 268 Personalizando as estrat gias de busca Por outro lado n s geralmente escolhemos a busca de uni o que nao pregui osa por natureza ao inv s do selecionar busca em uma transa o particular N s agora veremos como customizar a estrat gia de busca No Hibernate3 os mecanismos para escolher a estrat gia de busca s o id nticos para as associa es de valor nico e para cole es 20 1 2 Personalizando as estrat gias de busca O padr o selecionar busca extremamente vuner vel aos problemas de sele o N 1 ent o habilitaremos a busca de uni o no documento de mapeamento lt set name permissions fetch join gt lt key column userId gt lt one to many class Permission gt lt set lt many to one name mother class Cat fetch join gt yi A estrat gia de fetch definida no documento de mapeamento afeta recupera via get OU load e Recupera es que acontecem implicitamente quando navegamos por uma a
218. e gt lt component name hourlyRate class MonetaryAmount gt lt property name amount gt 311 Capitulo 24 Exemplo Varios lt column name hourly rate sql type NUMERIC 12 2 gt lt property gt lt property name currency length 12 gt lt component gt lt many to one name employer column employer_id not null true gt lt many to one name employee column employee_id not null true gt lt class gt lt class name Employee table employees gt lt id name id gt lt generator class sequence gt lt param name sequence gt employee_id_seq lt param gt lt generator gt lt td gt lt property name taxfileNumber gt lt component name name class Name gt lt property name firstName gt lt property name initial gt lt property name lastName gt lt component gt lt class gt lt hibernate mapping gt E abaixo segue o esquema da tabela gerado pelo SchemaExport create table employers id BIGINT not null name VARCHAR 255 primary key id create table employment periods id BIGINT not null hourly rate NUMERIC 12 2 currency VARCHAR 12 employee id BIGINT not null employer id BIGINT not null end date TIMESTAMP start date TIMESTAMP primary key id create table employees id BIGINT not null firstName VARCHAR 255 initial CHAR 1 lastName VARCHAR 255 taxfileNumber VARCHAR 255 primary key id
219. e gt lt many to one name address column addressId not null true unique true gt joan gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null primary key addressId bigint not null unique create table Address addressId bigint not null primary key 7 3 4 Muitos para muitos Finalmente n s temos a associa o unidirecional muitos para muitos lt class name Person gt lt id name id column personId gt lt generator class native gt lt i gt lt set name addresses table PersonAddress gt lt key column personId gt lt many to many column addressId class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressId gt 135 Capitulo 7 Mapeamento de ass lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null addressId bigint not null primary key personiId addressId create table Address addressId bigint not null primary key 7 4 Associa es Bidirecionais 7 4 1 Um para muitos muitos para um Uma associa o bidirecional muitos para um o tipo mais comum de assoc
220. e gt Slot lt property name date type timestamp column EVENT DATE gt lt property name title gt lt class gt lt hibernate mapping gt Assim como com o elemento ia a fun o name do elemento property informa ao Hibernate qual m todo getter e setter dever usar Assim neste caso o Hibernate ir procurar pelos m todos getDate setDate getTitle setTitle Configuragao do Hibernate O mapeamento do title tamb m n o possui a fun o type O tipo que declaramos e utilizamos nos arquivos mapeados n o s o como voc esperava ou seja fun es de dados Java Eles tamb m n o s o como os tipos de base de dados SQL Esses tipos podem ser chamados de Tipos de mapeamento Hibernate que s o conversores que podem traduzir tipos de dados do Java para os tipos de dados SQL e vice versa Novamente o Hibernate ir tentar determinar a convers o correta e mapear 0 type pr prio caso o tipo da fun o n o estiver presente no mapeamento Em alguns casos esta detec o autom tica que usa Reflection sobre as classes Java poder n o ter o padr o que voc espera ou necessita Este o caso com a propriedade date O Hibernate n o sabe se a propriedade que do java util Date pode mapear para uma coluna do tipo date do SQL timestamp OU time N s preservamos as informa es sobre datas e horas pelo mapeamento da propriedade com um conversor timestamp Dica O Hibernate realiza esta determi
221. e c ID c NOME etc os quais n o s o iguais s colunas especificadas no mapeamento ID e NOME A seguinte forma n o vulner vel duplica o do nome de coluna sess createSQLQuery SELECT cat mother FROM CATS c CATS m WHERE c MOTHER ID c ID addEntity cat Cat class addEntity mother Cat class Esta consulta especificou a string da consulta SQL com espa o reservado para Hibernate para injetar aliases de coluna as entidades retornadas pela consulta A anota o cat e m e usada acima um atalho para todas as propriedades De forma alternativa voc pode listar as colunas explicitamente mas at neste caso n s deixamos o Hibernate injetar os aliases de coluna SQL para cada propriedade O espa o reservado para um alias de coluna simplesmente o nome de propriedade qualificado pelo alias de tabela No seguinte exemplo recuperamos os Cats e suas m es de uma tabela diferente cat log para aquele declarado no metadado de mapeamentos Note que podemos at usar os aliases de propriedade na cl usula where se quisermos String sql SELECT ID as c id NAME as c name BIRTHDATE as c birthDate MOTHER ID as c mother mother FROM CAT LOG c CAT LOG m WHERE c mother c ID List loggedCats sess createSQLQuery sql addEntity cat Cat class addEntity mother Cat class list 17 1 4 1 Alias e refer ncias de propriedades Para a maioria
222. e cole es com ndice matriz listas mapas podem ser referenciadas pelo ndice apenas na cl usula where from Order order where order items 0 id 1234 select person from Person person Calendar calendar where calendar holidays national day person birthDay and person nationality calendar calendar select item from Item item Order order where order items order deliveredItemIndices 0 item and order id 11 select item from Item item Order order where order items maxindex order items item and order id 11 A express o entre colchetes pode ser at uma express o aritim tica select item from Item item Order order where order items size order items 1 item O HQL tamb m prov a fun o interna index para elementos de associa o um para muitos ou cole o de valores select item index item from Order order join order items item where index item lt 5 226 A clausula ordenar por Fun es escalares SQL suportadas pelo banco de dados subjacente podem ser usadas from DomesticCat cat where upper cat name like FRI Se ainda n o estiver totalmente convencido pense o qu o maior e menos leg vel poderia ser a consulta a seguir em SQL select cus from Product prod Store store inner join store customers cust where prod name widget and store location name in Melbourne Sydney and prod all elements cust currentOrder lineItems Hint al
223. e com a no o de igualdade de chave composta do banco de dados Voc n o pode usar um IdentifierGenerator para gerar chaves compostas Ao inv s disso o aplicativo deve gerenciar seus pr prios identificadores Use a tag lt composite id gt com elementos lt key property gt aninhados no lugar da declara o lt id gt de costume Por exemplo a classe orderLine possui uma chave prim ria que depende da chave prim ria composta de order lt class name OrderLine gt lt composite id name id class OrderLinelId gt lt key property name lineId gt lt key property name orderId gt lt key property name customerId gt lt composite id gt lt property name name gt lt many to one name order class Order insert false update false gt lt column name orderId gt lt column name customerId gt lt many to one gt e pedia gt Agora qualquer chave exterior referenciando a tabela orderLine tamb m ser composta Voc deve declarar isto em seus mapeamentos para outras classes Uma associa o para OrderLine seria mapeada dessa forma lt many to one name orderLine class OrderLine gt i a the CVelass attribu ute is optional as usual gt 147 Capitulo 8 Mapeamento de Com lt column name lineId gt lt column name orderId gt lt column name customerId gt lt many to one gt Dica O elemento column uma alternativa para a fun o col
224. e mapeamento pois ele ir sobrescrever o SQL est tico gerado pelo Hibernate Os procedimentos armazenados s o na maioria dos casos requeridos para retornar o n mero de linhas inseridas atualizadas deletadas uma vez que o Hibernate possui algumas verifica es em tempo de espera para o sucesso das instru es O Hibernate sempre registra o primeiro par metro da instru o como um par metro de sa da num rica para as opera es CUD CREATE OR REPLACE FUNCTION updatePerson uid IN NUMBER uname IN VARCHAR2 RETURN NUMBER IS BEGIN 253 Capitulo 17 SQL Nativo update PERSON set NAME uname where ID oid return SQL ROWCOUNT END updatePerson 17 4 SQL padronizado para carga You can also declare your own SQL or HQL queries for entity loading As with inserts updates and deletes this can be done at the individual column level as described in Se o 5 7 Coluna de express es de grava o e leitura or at the statement level Here is an example of a statement level override lt sql query name person gt lt return alias pers class Person lock mode upgrade gt SELECT NAME AS pers name ID AS pers id FROM PERSON WHERE ID FOR UPDATE lt sgl query gt Este apenas uma instru o de consulta nomeada como discutido anteriormente Voc pode referenciar esta consulta nomeada em um mapeamento de classe lt class name Person gt lt id name id gt lt generator class i
225. e of the column holding the collection index values O base optional defaults to 0 the value of the index column that corresponds to the first element of the list or array lt map key column column name formula any SQL expression oo 90 type type_name node attribute name length N gt column optional the name of the column holding the collection index values O formula optional a SQL formula used to evaluate the key of the map type required the type of the map keys lt map key many to many column column name formula any SQL expression 00 class ClassName O column optional the name of the foreign key column for the collection index values formula optional a SQ formula used to evaluate the foreign key of the map key class required the entity class used as the map key Se sua tabela n o possui uma coluna de ndice e voc ainda quiser usar a Lista como tipo de propriedade voc deve mapeiar a propriedade como uma lt bag gt do Hibernate Uma bag n o mant m sua ordem quando recuperadada do banco de dados mas pode ser escolhida de forma opcional ou ordenada 6 2 4 Cole es de valores e associa es muitos para muitos Quaisquer valores de cole o ou associa o muitos para muitos requerem uma tabela de cole o dedicada com uma coluna de chave exterior ou colunas collection element column ou colunas e possivelmente uma coluna de ndice ou colunas Par
226. e participar das transa es gerenciadas pelo recipiente no servidor de aplica o As propriedades de conex o arbitr rias podem ser acrescentandas ao nibernate connnection ao nome da propriedade Por exemplo voc deve especificar a propriedade de conex o charset usando hibernate connection charSet Voc pode definir sua pr pria estrat gia de plugin para obter conex es JDBC implementando a interface org hibernate connection ConnectionProvider e especificando sua implementa o customizada atrav s da propriedade nibernate connection provider class 3 4 Propriedades opcionais de configura o H um grande n mero de outras propriedades que controlam o comportamento do Hibernate em tempo de execu o Todos s o opcionais e t m valores padr o l gicos Aten o Algumas destas propriedades s o somente em n vel de sistema As propriedades em nivel de sistema podem ser determinadas somente via java Dproperty value OU hibernate properties Elas n o podem ser configuradas por outras t cnicas descritas acima Tabela 3 3 Propriedades de Configura o do Hibernate Nome da Propriedade Prop sito hibernate dialect O nome da classe de um Hibernate org hibernate dialect Dialect que permite o Hibernate gerar SQL otimizado 38 Propriedades opcionais de configura o Nome da Propriedade hibernate show sdl hibernate format sql hibernate default schema hibernate default catalog Prop
227. e renderiza o da p gina Write HTML header PrintWriter out response getWriter out println lt html gt lt head gt lt title gt Event Manager lt title gt lt head gt lt body Sa Handle actions if store equals request getParameter action 23 Capitulo 1 Tutorial String eventTitle request getParameter eventTitle String eventDate request getParameter eventDate if equals eventTitle equals eventDate out printin lt b o gt Please enter event title and date lt i gt lt b LND else createAndStoreEvent eventTitle dateFormatter parse eventDate Cut print lt b gt lt i gt Added event lt i gt lt b D Print page printEventForm out listEvents out dateFormatter Write HTML footer out printin lt body gt lt html aut lusa out CLOSS G O estilo deste c digo misturado com o Java e HTML n o escalariam em um aplicativo mais complexo tenha em mente que estamos somente ilustrando os conceitos b sicos do Hibernate neste tutorial O c digo imprime um cabe alho e nota de rodap em HTML Dentro desta p gina s o impressos um formul rio para entrada de evento em HTML e uma lista de todos os evento no banco de dados O primeiro m todo trivial e somente produz um HTML private void printEventForm PrintWriter out out printin lt n2 gt Add new event lt h2 gt out printin lt
228. e usando o banco de dados e a configura o de dados para prover persist ncia de servi os e persist ncia de objetos para o aplicativo Na arquitetura m nima o aplicativo fornece suas pr prias conex es JDBC e gerencia suas transa es Esta abordagem usa o m nimo de subconjuntos das APIs do Hibernate 29 Capitulo 2 Arquitetura A arquitetura compreensiva abstrai a aplica o do JDBC JTA e APIs adjacentes e deixa o Hibernate tomar conta dos detalhes Algumas defini es dos objetos descritos nos diagramas 30 Vis o Geral SessionFactory org hibernate SessionFactory O threadsafe cach imutavel composto de mapeamentos compilados para um Unico banco de dados Uma f brica para session e um cliente de connect ionProvider SessionFactory pode conter um cach opcional de dados segundo n vel reutiliz veis entre transa es no n vel de processo ou cluster Session org hibernate Session Objeto single threaded de vida curta representa uma conversa o entre o aplicativo e o armazenamento persistente Cria uma camada sobre uma conex o JDBC uma fabrica de Transaction session possui um cach obrigat rio primeiro n vel de objetos persistentes usado para navega o nos gr ficos de objetos e pesquisa de objetos pelo identificador Objetos persistentes e cole es Objetos de vida curta single threaded contendo estado persistente e fun o de neg cios Esses podem ser JavaBeans P
229. eUtil java Esta classe n o s produz uma refer ncia org hibernate SessionFactory global em seu inicializador est tico mas tamb m esconde o fato de que utiliza um aut nomo est tico N s poderemos buscar pela refer ncia org hibernate SessionFactory a partir do JNDI no servidor da aplica o ou qualquer outra localiza o para este assunto Se voc der um nome sessionFactory em seu arquivo de configura o o Hibernate ir de fato tentar vincul lo ao JNDI sob aquele nome depois que estiver constru do Outra op o melhor seria usar a implementa o JMX e deixar o recipiente JMX capaz instanciar e vincular um HibernateService ao JNDI Essas op es avan adas s o discutidas no documento de refer ncia do Hibernate Tais op es avan adas ser o discutidas mais tarde Voc precisar agora configurar um sistema de logging O Hibernate usa logging comuns e lhe oferece a escolha entre o Log4j e o logging do JDK 1 4 A maioria dos desenvolvedores prefere o Log4j copie 10945 properties da distribui o do Hibernate no diret rio et c para seu diret rio src depois v em hibernate cfg xml D uma olhada no exemplo de configura o e mude as configura es se voc quiser ter uma sa da mais detalhada Por padr o apenas as mensagens de inicializa o do Hibernate s o mostradas no stdout O tutorial de infra estrutura est completo e n s j estamos preparados para algum trabalho de verdade com o Hibernate
230. ed the session will be automatically closed during the after completion phase of the transaction Built in and automatic session context management is preferred see Se o 2 5 Sess es Contextuais e g true false Tabela 3 7 Propriedades Variadas Nome da Propriedade Prop sito hibernate current session context class Supply a custom strategy for the scoping of the current session See Se o 2 5 Sess es 44 Propriedades opcionais de configura o Nome da Propriedade Prop sito Contextuais for more information about the built in strategies exemplo sta thread managed custom Class hibernate query factory class Escolha a implementa o de an lise HQL exemplo org hibernate hgl ast ASTQueryTranslatorFactory ou org hibernate hgql classic ClassicQueryTranslatorFactory hibernate query substitutions Mapeamento a partir de simbolos em consultas do Hibernate para para simbolos SQL simbolos devem ser por exemplo fun es ou nome literais exemplo hqlLiteral SQL LITERAL hqlFunction SQLFUNC hibernate hbm2ddl auto Automaticamente valida ou exporta DDL esquema para o banco de dados quando O SessionFactory criado Com create drop O esquema do banco de dados ser excluido quando a SessionFactory for fechada explicitamente exemplo validate update create create drop hibernate bytecode use_reflection_optim amp rables the use of bytecode manipul
231. ed denseoebeencaane diaa an aikida apnee kiaa nide 36 3 4 Propriedades opcionais de configura o i riram 38 3 4 1 Dialetos SQL sia assctasodesh saias oaea A aA aE RE na hav oleate aden ie 46 3 4 2 Busca por uni o externa Outer Join Fetching ccececeeeeseeeeeeeeeeeees 46 3 4 3 Fluxos Bin rios Binary Streams iraniana 47 3 4 4 Cach de segundo n vel e consulta aaa 47 3 4 5 Substitui o na Linguagem de Consulta item 47 3 4 6 Estat sticas do Hibernate e ierearaa aaa rrenan 47 3 0 Logging ssscsas sete ceneuoagea io dedevent weenth guga dad Gua deena P EEE E OEE 48 3 6 Implementando um NamingStrategy ss iiarir arenas 48 3 7 Arquivo de configura o XML e ARARE RAER 49 3 8 Integra o com servidores de aplica o J2EE i 50 3 8 1 Configura o de estrat gia de transa o cceceeeeeceeeeeeeeeeeeeeeeaeaaeeees 51 HIBERNATE Persist ncia Rela 3 8 2 SessionFactory vinculada JNDI rias 52 3 8 3 Gerenciamento de contexto de Sess o atual COM JTA 53 3 8 4 implementa o JMX n EARR 53 4 Classes Persistentes ieoa aaa aa lee 55 4 1 Um exemplo simples de POJO rara eae rraraaanaaa 55 4 1 1 Implemente um construtor de n o argumento cece cece eeeeeeeeeeeeeeeeeneee 56 4 1 2 Providen
232. eeeeeaaaaeeeeeeeeeeeanaaeeees 278 20 2 4 Estrat gia leitura escrita n o estrita serraria 279 20 2 5 Estrat gia transacional seara era aerarranaaaaana 279 20 2 6 Compatibilidade de Estrat gia de Concorr ncia de Cache Provedor 279 20 3 Gerenciando OS caches cece cece a aia a iaaa iaaa naia 280 20 4 O Cache de Consulta cece ee eeeeeeeeeeeeeeeeaaeaeeeeeeeeeeeeaaaaaeneeseeeeeeaeaaea 281 20 4 1 Ativa o do cache de consulta ra 281 20 4 2 Regi es de cache de consulta ra 282 20 5 Entendendo o desempenho da Cole o rias 283 20 5 k TAXONOMIA oranana aa a dus a Aa GU AE nana ag 283 20 5 2 Listas mapas bags de id e conjuntos s o cole es mais eficientes para ANU ANIZAN seraa iaaa a a E TE TE T Aa 284 20 5 3 As Bags e listas s o as cole es de invers o mais eficientes 284 20 5 4 Deletar uma vez cece ee ee cece ee eeeeaeeeeeeeaa ee eeeegaeeeeeenaeeeeeanaeeeaed 285 20 6 Monitorando desempenho eceeeeeeeeeeeeeeeeeeeeeeeeaaeaeeeeeeeeeeeeaaaaeeteeeeeeeeeaea 285 20 6 1 Monitorando uma SessionFactory ira 285 20 6 2 M TICAS sarcir aE E EEEE NAREN RS 286 21 Guia de Toolset assassinatos E eee edn AE aS 289 21 1 Gera o de esquema autom tico e errrraraa aaa 289 21 1 1 Padronizando 0 esquema errar 290 21 1
233. eeeeeeeaaaaeeeeeeeeeeeeaaa 125 6 9 5 USING an lt idbag gt nen E aden satel dan ana RONDA nana a Eai pa 125 6 4 Exemplos de coleGO s seris srnka naea EAEKO RAKA KEA aa rena AA AAE AARAA AEE 126 7 Mapeamento de associa es cece cece cece cece eeeeee terete ee ee aa eaeeteeeeeeeeeaaaaeneeeeeeeeeaea 131 Fels INTTOdU O renani ced T ER EE 131 7 2 Associa es Unidirecionais ssokta aa N aE RRK 131 fa VOOS PAI UM ss aaa E T E eee 131 freio Um para UM naie n EE E EA 132 2 32 UM Para MUNOS sienerreoiiriteenei riea en ERNE REEE ER E E ie 133 7 3 Associa es Unidirecionais com tabelas associativas eeeeseeereeeeereeeenn 133 Tal Um para muios sisisi R EA 133 Toe Muitos Para UM sirenita kiden iani oaer rik CE ENEE AVEA RECEN E pierna alas can aaa tosa 134 TaS UM para M rnn n EE E EER 135 T4 MUIOS ParasMUltOS sosise nany aiana aKa KENAAN E ARADR ANAE ees ave 135 7 4 Associa es Bidirecionais e sesscsseeeirsrrnarr sneiru sanan eae tees aaa ENANAR E KAAKE E EKRANA RERA 136 7 4 1 Um para muitos muitos para um eia 136 F425 UmeparazUM asi sga mestras eal erUna ai nen rannio cua E CLA Una aanaa aca N 137 7 5 Associa es Bidirecionais com tabelas associativas ii ees 138 7 5 1 Um para muitos muitos para um eee 138 toe Um para UM areren Seite cae shcanieena E eE EE dd dale Re anienas PERRE 139 1 08 MUNOS Para MUNOS cunin semana tosa pads a E A mada a Lain dia 140 7
234. eeeeeeeeeaeaaeaees 244 17 1 3 Manuseio de associa es e cole es aa eeeeeeaneeeeeeaneeees 245 17 1 4 Retorno de entidades m ltiplas cea eeeeeeeeeeeeeeaaaaeeeees 245 17 1 5 Retorno de entidades n o gerenciadas 247 17 1 6 Manuseio de heran a erence ener AETA 248 17 17 Parametros ye enana aacesieaasesoldasdasbtvaavanedlasiusiivadsanoblaaduabtiaasaeowiass 248 17 2 Consultas SQL Nomeadas nnne rn eese tt aa eeeeeeaaeeeeeeaaeeeeeeaaeeeeeeaaeneeeeaa 248 17 2 1 Utilizando a propriedade retorno para especificar explicitamente os nomes de colunas alias eeeeeeeeeeeeee tees aa eeeeeeeeeeeeeeaaaaeeeeeeeeeeeeaeaaeeaes 250 17 2 2 Usando procedimentos de armazenamento para consultas 251 17 3 SQL padronizado para criar atualizar e deletar ie rneeeeerr renees 252 17 4 SQL padronizado para carga ii eeeaaeraraaaa arenas 254 18 Filtrando dados ocna as iioaipeliagda alo faso eccedae pan sQnac assa die EAA 257 181 Filtros do Hibernate ssa iuseasannase sabaton assado aia paced esl i a naad aaa nota a atada 257 19 Mapeamento XML 20 555522 55505020050080200500020200 awe any secant de genro aaa pear ens andas 261 19 1 Trabalhando com dados em XML errar ara 261 19 1 1 Especificando o mapeamento de uma classe e de um arquivo XML simultantamente dnis aa radios quai EN a dan Ta Tea da 261 19 1
235. efer ncia de compra no outro lado para a navega o da associa o bidirecional Lembre se que componentes s o tipos por valor e n o permitem refer ncias compartilhadas Uma classe Purchase simples pode estar no conjunto de uma classe order mas ela n o pode ser referenciada por Item no mesmo momento At mesmo associa es tern rias ou quatern ria etc s o poss veis lt class name eq Order o a gt lt set name purchasedItems table purchase items lazy true gt lt key column order id gt lt composite element class eg OrderLine gt lt many to one name purchaseDetails class eg Purchase gt lt many to one name item class eg Item gt lt composite element gt lt set gt lt class gt Elementos compostos podem aparecer em pesquisas usando a mesma sintaxe assim como associa es para outras entidades 8 3 Componentes como indices de Map O elemento lt composite map key gt permite voc mapear uma classe componente como uma chave de um Map Tenha certeza que voc sobrescreveu hashCode equals corretamente na classe componente 146 Componentes como identificadores compostos 8 4 Componentes como identificadores compostos Voc pode usar um componente como um identificador de uma classe entidade Sua classe componente deve satisfazer certos requisitos Ele deve implementar java io Serializable Ele deve re implementar equals hashCode consistentement
236. element name mio element aliasname feoll 17 1 5 Retorno de entidades nao gerenciadas poss vel aplicar um ResultTransformer para consultas sql nativas permitindo que o retorno de entidades n o gerenciadas sess createSQLQuery SELECT NAME BIRTHDATE FROM CATS setResultTransformer Transformers aliasToBean CatDTO class Esta consulta especificou A string da consulta SQL um transformador de resultado A consulta acima ir devolver uma lista de cat DTo que foi instanciada e injetada com valores dos comandos NAME e BIRTHDATE em suas propriedades correspondentes ou campos 247 Capitulo 17 SQL Nativo 17 1 6 Manuseio de heran a As consultas sql nativas as quais consultam entidades mapeadas como parte de uma heran a devem incluir todas as propriedades na classe base e todas as suas subclasses 17 1 7 Par metros Consultas sql Nativas suportam par metros posicionais assim como par metros nomeados Query query sess createSQLQuery SELECT FROM CATS WHERE NAME like addEntity Cat class List pusList query setString 0 Pus list query sess createSQLQuery SELECT FROM CATS WHERE NAME like name addEntity Cat class List pusList query setString name Pus list 17 2 Consultas SQL Nomeadas Consultas SQL Nomeadas podem ser definidas no documento de mapeamento e chamadas exatamente da mesma forma que uma consulta HQL nomeada
237. ens catId evict a particular collection of kittens sessionFactory evictCollection Cat kittens evict all kitten collections O cacheMode controla como uma sess o em particular interage com o cache de segundo n vel e CacheMode NORMAL l e escreve itens ao cache de segundo n vel e CacheMode GET itens de leitura do cache de segundo n vel N o escreve ao cache de segundo n vel exceto quando atualizar dados 280 O Cache de Consulta e CacheMode PUT escreve itens ao cache de segundo nivel N o l a partir do cache de segundo nivel CacheMode R EFR ESH escreve itens ao cache de segundo n vel mas n o l a partir do cache de segundo n vel Passa o efeito de hibernate cache use_minimal_puts for ando uma atualiza o do cache de segundo n vel para que todos os itens leiam a partir do banco de dados Para navegar o conte do do segundo n vel ou regi o de cache de consulta use OStatistics API Map cacheEntries sessionFactory getStatistics getSecondLevelCacheStatistics regionName getEntries Voc precisar habilitar estat sticas e opcionalmente for ar o Hibernate a manter as entradas de cache em um formato mais compreens vel hibernate generate statistics true hibernate cache use structured entries true 20 4 O Cache de Consulta O conjunto de resultado de consulta pode tamb m estar em cache Isto til somente para consultas que
238. ensando O Hibernate permite que voc re anexe os objetos e persista as modifica es esse pattern chamado sess o por solicita o com objetos desanexados Utiliza se versionamento autom tico para isolar as modifica es concorrentes e Sess o Estendida ou Longa A session do Hibernate pode ser desligada da conex o adjacente do JDBC depois que a transa o foi submetida e ser reconectada quando uma nova requisi o do cliente ocorrer Este pattern conhecido como sess o por conversa o e faz o reatamento uniforme desnecess rio Versionamento autom tico usado para isolar modifica es concorrentes e a sess o por conversa o geralmente pode ser nivelada automaticamente e sim explicitamente Tanto a sess o por solicita o com objetos desanexados quanto a sess o por conversa o possuem vantagens e desvantagens Estas desvantagens ser o discutidas mais tarde neste cap tulo no contexto do controle de concorr ncia otimista 12 1 3 Considerando a identidade do objeto Uma aplica o pode acessar concorrentemente o mesmo estado persistente em duas sessions diferentes Entretanto uma inst ncia de uma classe persistente nunca compartilhada entre duas inst ncias session Portanto h duas no es diferentes da identidade Identidade da base de dados foo getId equals bar getId Identidade da JVM foo bar Ent o para os objetos acoplados a uma session espec fica ex isto est no escopo de uma s
239. ent id bigint alter table child add constraint childfk0 parent id references parent Se o pai for obrigat rio use uma associa o bidirecional um para muitos lt hibernate mapping gt lt class name Parent gt lt id name id gt lt generator class sequence gt lt id gt lt set name children inverse true gt lt key column parent id gt lt one to many class Child gt lt set gt lt class gt lt class name Child gt lt id name id gt lt generator class sequence gt lt id gt lt property name name gt 127 Capitulo 6 Mapeamento de col lt many to one name parent class Parent column parent_id not null true gt y p lt class gt lt hibernate mapping gt Repare na restri o NOT NULL create table parent id bigint not null primary key create table child id bigint not null primary key name varchar 255 parent_id bigint not null alter table child add constraint childfk0O parent id references parent Uma outra alternativa no caso de voc insistir que esta associa o deva ser unidirecional voc pode declarar a restri o como NOT NULL NO mapeamento lt key gt lt hibernate mapping gt lt class name Parent gt lt id name id gt lt generator class sequence gt lt id gt lt set name children gt lt key column parent id not null true gt lt one to many class Child gt lt set gt lt class g
240. ente da instru o select ou pode omitir do properties list nesse caso um valor gerado usado Essa ltima op o s v lida quando s o usados geradores de ids que operam no banco de dados a tentativa de usar essa op o com geradores do tipo em mem ria ir causar um exce o durante a etapa de an lise Note que para a finalidade desta discuss o os seguintes geradores operam com o banco de dados org hibernate id SequenceGenerator e suas subclasses e qualquer implementa o de org hibernate id PostInsertIdentifierGenerator Aqui a exce o mais not vel o org hibernate id TableHiLoGenerator que n o pode ser usado porque ele n o disp e de mecanismos para recuperar os seus valores Para propriedades mapeadas como version OUtimestamp a instru o insert lhe oferece duas op es Voc pode especificar a propriedade na properties list nesse caso o seu valor obtido 213 Capitulo 14 Batch processing a partir da instru o select correspondente ou ele pode ser omitido da properties list neste caso utiliza se O seed value definido pela classe org hibernate type VersionType Segue abaixo o exemplo da execu o de um HQL INSERT Session session sessionFactory openSession Transaction tx session beginTransaction String hqlInsert insert into DelinquentAccount id name select c id c name from Customer VANES an NB int createdEntities s createQuery hqlInsert
241. er sess o Eles devem ser explicitamente habilitados usando o m todo Session enabledFilter que retorna uma inst ncia da interface Filter Usando o filtro simples definido acima o c digo se pareceria com o seguinte session enableFilter myFilter setParameter myFilterParam some value NA Veja que os m todos da interface org hibernate Filter permite o encadeamento do m todo comum maioria das fun es do Hibernate Um exemplo completo usando dados temporais com um padr o de datas de registro efetivo lt filter def name effectiveDate gt lt filter param name asOfDate type date gt lt filter def gt lt class name Employee gt lt many to one name department column dept_id class Department gt lt property name effectiveStartDate type date column eff_start_dt gt lt property name effectiveEndDate type date column eff_end_dt gt sis Note that this assumes non terminal records have an eff_end_dt set to a max db date for simplicity sake gt lt filter name effectiveDate condition asOfDate BETWEEN eff start dt and eff end dt gt lt class gt lt class name Department gt lt set name employees lazy true gt lt key column dept_id gt lt one to many class Employee gt lt filter name effectiveDate condition asOfDate BETWEEN eff_start_dt and eff_end_dt gt lt set gt lt class gt Para garantir que voc sempre tenha registro
242. ermina o n vel de isolamento de uma transa o JDBC Verifique java sql Connection para valores significativos mas note que a maior parte 41 Capitulo 3 Configuration Nome da Propriedade hibernate connection autocommit Prop sito dos bancos de dados n o suportam todos os isolamentos que n o s o padr es exemplo 1 2 4 8 Habilita o auto commit para conex es no pool JDBC n o recomendado e g true false hibernate connection release mode hibernate connection lt propertyName gt hibernate jndi lt propertyName gt Especifica quando o Hibernate deve liberar conex es JDBC Por padr o uma conex o JDBC retida at a sess o estar explicitamente fechada ou desconectada Para uma fonte de dados JTA do servidor de aplica o voc deve usar after statement para for ar a libera o da conex es depois de todas as chamadas JDBC Para uma conex o n o JTA frequentemente faz sentido liberar a conex o ao fim de cada transa o usando after transaction O auto escolher after statement para as estrat gias de transa oes JTA e CMT e after transaction para as estrat gias de transa o JDBC exemplo auto padr o on close after transaction after statement This setting only affects sessions returned from sessionFactory openSession For Sessions obtained through SessionFactory getCurrentSession the CurrentSessionContext implementation configured for use controls the connect
243. ession as duas no es s o equivalentes e a identidade da JVM para a identidade da base de dados garantida pelo Hibernate Entretanto embora a aplica o possa acessar concorrentemente o mesmo objeto do neg cio identidade persistente em duas sess es diferentes as duas inst ncias ser o realmente diferentes identidade de JVM Os conflitos s o resolvidos usando versionamento autom tico no flush commit usando uma abordagem otimista Este caminho deixa o Hibernate e o banco de dados se preocuparem com a concorr ncia Ele tamb m fornece uma escalabilidade melhor garantindo que a identidade em unidades de trabalho single threaded n o necessite de bloqueio dispendioso ou de outros meios de sincroniza o A aplica o nunca necessita sincronizar qualquer objeto de neg cio t o longo que transpasse uma nica thread por session Dentro de uma session a aplica o pode usar com seguran a o para comparar objetos No entanto uma aplica o que usa fora de uma session pode ver resultados inesperados Isto pode ocorrer mesmo em alguns lugares inesperados por exemplo se voc colocar duas inst ncias desacopladas em um mesmo set Ambas podem ter a mesma identidade na base de dados ex elas representam a mesma linha mas a identidade da JVM n o por defini o garantida para inst ncias em estado desacoplado O desenvolvedor tem que substituir os m todos equals hashCode em classes persistentes e implement
244. ession do Hibernate aberta atrav s da primeira chamada para getCurrentSession em SessionFactory Ent o uma transa o do banco de dados inicializada e todo acesso a dados deve ocorrer dentro de uma transa o n o importando se o dado de leitura ou escrita N o se deve utilizar o modo auto commit em aplica es Nunca utilize uma nova session do Hibernate para todas as opera es de banco de dados Utilize uma session do Hibernate que seja de interesse a todas as solicita es Utilize getCurrentSession para que seja vinculado automaticamente thread atual de Java Agora as poss veis a es de uma solicita o ser o processadas e uma resposta HTML ser renderizada J chegaremos nesta parte Finalmente a unidade de trabalho termina quando o processamento e a renderiza o s o completados Se ocorrer algum erro durante o processamento ou a renderiza o uma exce o ser lan ada e a transa o do banco de dados revertida Isso completa o modelo session per request Em vez de usar c digo de demarca o de transa o em todo servlet voc pode tamb m criar um filtro servlet D uma olhada no website do Hibernate e do Wiki para maiores informa es sobre esse modelo chamado Sess o Aberta na Visualiza o Voc precisar disto assim que voc considerar renderizar sua visualiza o no JSP n o apenas num servlet 1 3 2 Processando e renderizando Vamos implementar o processamento da solicita o
245. esulta em uma instru o comment on table OU comment on column no DDL gerado onde suportado 21 1 2 Executando a ferramenta A ferramenta SchemaExport escreve um script DDL para padronizar e ou para executar as instru es DDL A seguinte tabela exibe as op es de linha de comando do SchemaExport java cp hibernate classpaths org hibernate tool hbm2ddl SchemaExport options mapping files Tabela 21 2 scnemazxport Op es de Linha de Comando Op o Descri o quiet n o saia do script para stdout drop somente suspenda as tabelas create somente crie tabelas text n o exporte para o banco de dados output my_schema ddl saia do script ddl para um arquivo naming eg MyNamingStrategy seleciona um NamingStrategy config hibernate cfg xml leia a configura o do Hibernate a partir do arquivo XML leia propriedades de banco de dados a partir dos properties hibernate properties arquivos format formatar bem o SQL gerado no script delimiter ajustar e finalizar o delimitador de linha para o script Voc pode at mesmo incorporar 0 SchemaExport em sua aplica o Configuration cfg essar new SchemaExport cfg create false true 21 1 3 Propriedades As Propriedades do Banco de Daods podem ser especificadas Como Propriedades de sistema com D lt property gt em hibernate properties em um arquivo de propriedades nomeadas com properties As prop
246. et aereas 106 5 5 2 Usando as anota es JDK 5 0 rara 108 5 6 Propriedades geradas ee r ra Trn ERR A EE T T 109 5 7 Coluna de express es de grava o e leitura cc ceeeeeeeeeeeeeeeeeeeeeeeeeeeeaeaaeeees 110 5 8 Objetos de Banco de Dados Auxiliares ceecceeeeeeeeeeeeeeeeeeeeeaeaaeeteeeeeeeeeaeaaea 110 6 Mapeamento de cole o cece eee e eee cnet eeeeee sees aa aa eeeeeeeeeeeeaaaaeeeeeeeeeeeeaea 113 6 1 Cole es persistentes sscscssecioeessandevehaacevesassdeceneenbodeess aa daaa a aaa 113 6 2 Mapeamento de cole o errar aee R 114 6 2 1 Chaves Externas de Cole o ria 116 6 2 2 Elementos de cole o cecececeeeeeceeeeeeeeeeeeeeeaaeeeeeeeeeeeeeeaaeaeeeeeneeeeeeaaa 116 6 2 3 Cole es indexadas a i araras 116 6 2 4 Cole es de valores e associa es muitos para muitos 117 6 2 5 Associa es um para muitos rare eras 120 6 3 Mapeamentos de cole o avan ados terrenas 121 6 3 1 Cole es escolhidas sis civectesse cod sisi aceseecevdes UCs ha bas dah qual Saba fada a Soa Sande 121 6 3 2 Associa es Bidirecionais eee eareraa aaa 122 6 3 3 Associa es bidirecionais com cole es indexadas 124 6 3 4 Associa es Tern rias ee eeeeeeeeeeee sees aaeaeeeee
247. ext val o nome da coluna na tabela que usado para manter o valor segment column name opcional padr o para sequence name O nome da coluna da tabela que usado para manter a chave de segmento Este o valor que identifica qual valor de incremento a ser usado base opcional padr o para default O valor da chave de segmento para o segmento pelo qual n s queremos obter os valores de incremento para este gerador segment value length opcional padr o para 255 Usado para a gera o do esquema O tamanho da coluna para criar esta coluna de chave de segmento initial value opcional valor padr o para 1 O valor inicial a ser restaurado a partir da tabela increment size Opcional padr o para 1 O valor pelo qual as chamadas subsequentes para a tabela devem diferir se optimizer optional defaults to See Se o 5 1 6 Otimiza o do Gerador de Identifica o 5 1 6 Otimiza o do Gerador de Identifica o For identifier generators that store values in the database it is inefficient for them to hit the database on each and every callto generate a new identifier value Instead you can group a bunch of them in memory and only hit the database when you have exhausted your in memory value 79 Capitulo 5 Mapeamento O R Basico group This is the role of the pluggable optimizers Currently only the two enhanced generators Se o 5 1 5 Aprimora o dos geradores de identificador
248. favor consulte a pr xima se o para maiores informa es Esta terceira abordagem um componente identificador a que n s recomendamos para a maioria das aplica es 5 1 8 Discriminador O elemento lt discriminator gt necess rio para persist ncia polim rfica utilizando a estrat gia de mapeamento de tabela por classe hier rquica e declara uma coluna discriminadora da tabela 81 Capitulo 5 Mapeamento O R Basico A coluna discriminadora cont m valores de marca o que informam camada de persist ncia qual subclasse instanciar para uma linha em espec fico Um restrito conjunto de tipos que podem ser utilizados string character integer byte short boolean yes no true false lt discriminator column discriminator column type diseriminator type o force true false insert true false 4 formula arbitrary sql expression 6 us O column opcional padr o para class O nome da coluna discriminadora amp type opcional padr o para string O nome que indica o tipo Hibernate force opcional valor padr o false For a o Hibernate a especificar valores discriminadores permitidos mesmo quando recuperando todas as inst ncias da classe ra z O insert opcional valor padr o para true Ajuste para false se sua coluna discriminadora tamb m fizer parte do identificador composto mapeado Isto informa ao Hibernate para n o incluir a coluna em comandos SQL INSERTS 6 fo
249. fica Note que isto significa que voc pode dar uma condi o espec fica como parte de um anexo de filtro que substitua a condi o padr o neste caso em particular 259 260 Mapeamento XML XML Mapping is an experimental feature in Hibernate 3 0 and is currently under active development 19 1 Trabalhando com dados em XML O Hibernate permite que se trabalhe com dados persistentes em XML quase da mesma maneira como voc trabalha com POJOs persistentes Uma rvore XML analisada pode ser considerada como apenas uma maneira de representar os dados relacionais como objetos ao inv s dos POJOs O Hibernate suporta a API dom4j para manipular rvores XML Voc pode escrever queries que retornem rvores dom4j do banco de dados e automaticamente sincronizar com o banco de dados qualquer modifica o feita nessas rvores Voc pode at mesmo pegar um documento XML analis lo usando o dom4j e escrever as altera es no banco de dados usando quaisquer opera es b sicas do Hibernate persist saveOrUpdate merge delete replicate a mesclagem ainda n o suportada Essa funcionalidade tem v rias aplica es incluindo importa o exporta o de dados externaliza o de dados de entidade via JMS or SOAP e relat rios usando XSLT Um mapeamento simples pode ser usado para simultaneamente mapear propriedades da classe e n s de um documento XML para um banco de dados ou se n o houver classe para ma
250. ficiente uma vez que ele requer ambos SQL SELECT para carregar um objeto e um SQLurDATE para persistir seu estado atualizado na mesma sess o Por isso o Hibernate oferece uma abordagem alternativa usando inst ncias desanexadas 4 Importante Hibernate does not offer its own API for direct execution of UPDATE Or DELETE statements Hibernate is a state management service you do not have to think in statements to use it JDBC is a perfect API for executing SQL statements you can get a JDBC connection at any time by calling session connection Furthermore the notion of mass operations conflicts with object relational mapping for online transaction processing oriented applications Future versions 168 Modificando objetos desacoplados of Hibernate can however provide special mass operation functions See Capitulo 14 Batch processing for some possible batch operation tricks 10 6 Modificando objetos desacoplados Muitas aplica es precisam recuperar um objeto em uma transa o envi lo para a camada UI para manipula o e somente ent o salvar as mudan as em uma nova transa o As aplica es que usam este tipo de abordagem em ambiente de alta concorr ncia geralmente usam dados versionados para assegurar isola o durante a longa unidade de trabalho O Hibernate suporta este modelo oferecendo re acoplamentos das inst ncias usando os m todos Session update OUSession merge
251. fique chaves naturais para todas as entidades e mapeie as usando lt natural id gt Implemente equals hashCode para comparar as propriedades que comp em a chave natural Coloque cada classe de mapeamento em seu pr prio arquivo N o use um nico c digo de mapeamento monol tico Mapeie com eg Foo no arquivo com eg Foo hbm xml Isto faz bastante sentido especialmente em ambiente de equipe Carregue os mapeamentos como recursos Implemente os mapeamentos junto s classes que eles mapeiam Considere a possibilidade de externar as strings de consultas Esta uma boa pr tica se suas consultas chamam fun es SQL que n o sejam ANSI Externar as strings de consultas para mapear arquivos ir tornar a aplica o mais port vel Use vari veis de v nculo Assim como em JDBC sempre substitua valores n o constantes por Nunca use a manipula o de strings para concatenar valores n o constantes em uma consulta At melhor considere a possibilidade de usar par metros nomeados nas consultas N o gerencie suas conex es JDBC O Hibernate permite que a aplica o gerencie conex es JDBC mas esta abordagem deve ser considerada um ltimo recurso Se voc n o pode usar os provedores de conex o embutidos considere fazer sua implementa o a partir de org hibernate connection ConnectionProvider Considere a possibilidade de usar tipos customizados Suponha que voc tenha um tipo Java de alguma biblioteca que prec
252. for especificado ser usado o nome da classe Java completamente qualificado For information about inheritance mappings see Cap tulo 9 Mapeamento de Heran a 5 1 18 Subclasses Unidas Alternativamente cada subclasse pode ser mapeada para sua pr pria tabela Isto chamado estrat gia de mapeamento de tabela por subclasse O estado herdado devolvido por associa o com a tabela da superclasse N s usamos o elemento lt joined subclass gt Por exemplo lt joined subclass name ClassName table tablename proxy ProxyInterface 9o00 lazy true false dynamic update true false dynamic insert true false schema schema catalog catalog extends SuperclassName persister ClassName subselect SQL expression entity name EntityName node element name gt SEW sesi lt property eo gt lt joined subclass gt name O nome de classe completamente qualificada da subclasse table O nome da tabela da subclasse proxy opcional Especifica a classe ou interface que usar os proxies de inicializa o lazy 0006 lazy opcional padr o para true Configurar lazy false desabilitar o uso de inicializa o lazy A coluna discriminadora n o requerida para esta estrat gia de mapeamento Cada subclasse deve declarar uma coluna de tabela com o identificador do objeto usando o elemento lt key gt O mapeamento no in cio do cap tulo poderia ser re escrito assim lt xml version 1 0
253. form 2 5 out println Title lt input name eventTitle length 50 gt lt br gt out println Date e g 24 12 2009 lt input name eventDate length 10 gt lt br gt out println lt input type submit name action value store gt out printilin Usem Sp O m todo listEvents utiliza a Session do Hibernate limitado ao thread atual para executar uma consulta 24 Processando e renderizando private void listEvents PrintWriter out SimpleDateFormat dateFormat List result HibernateUtil getSessionFactory getCurrentSession createCriteria Event class list if result size WO dl out primelin u lt h2 gt Events in database lt h2 g out println lt table border 1 SE Gut print instr SAN ont print in lt th gt Event title lt th 2 Out printin lt th gt Event date lt th ai Out prmainit ln lt 7 tae Ea Iterator it result iterator while it hasNext Event event Event it next Cut pu uns E air out printinidisca gt event getTitle lt td SEN Cut printim lt td 2 daterormatter format event getDate i tb R lt tdi OG Cute prime EMCEE gt out println lt table ae ter Finalmente a a o store despachada ao m todo createAndStorel utiliza a Session da thread atual protected void createAndStoreEvent String title Date theDate Event theEvent new Event theEvent setTitle title
254. formas para se referir a propriedade do indentificador de uma entidade A propriedade especial em letra min scula id pode ser usada para se referir propriedade do identificador de uma entidade considerando que a entidade n o define uma propriedade n o identificadora chamada id Se a entidade definir a propriedade do identificador nomeada voc poder usar este nome de propriedade As refer ncias composi o das propriedades do identificador seguem as mesmas regras de nomea o Se a entidade tiver uma propriedade de n o identificador cnamada id a composi o da propriedade do identificador pode somente ser referenciada pelo seu nome definido Do contr rio uma propriedade especial id poder ser usada para referenciar a propriedade do identificador Importante Observe esta a o mudou completamente na vers o 3 2 2 Nas vers es anteriores o ia sempre referia se propriedade do identificador n o importando seu nome atual Uma ramifica o desta decis o era que as propriedades do n o identificador de chamadas id nunca poderiam ser referenciadas nas consultas do Hibernate 218 A clausula select 15 6 A clausula select A clausula select seleciona quais objetos e propriedades retornam no resultado da consulta Considere select mate from Cat as Cat inner join cat mate as mate A consulta selecionar mates parceiros de outros cats Atualmente podemos expressar a consulta de forma mais com
255. go como SELECT cust name cust address cust phone cust id cust current_order FROM customers cust Stores store locations loc store customers se product prod WHERE prod name widget AND store loc id loc id AND loc name IN Melbourne Sydney AND sc store id store id AND sc cust id cust id AND prod id ALL SELECT item prod id FROM line items item orders o WHERE item order id o id AND cust current order o id 15 11 A cl usula ordenar por A lista retornada pela consulta pode ser ordenada por qualquer propriedade da classe ou componentes retornados from DomesticCat cat order by cat name asc cat weight desc cat birthdate As op es asc OU desc indicam ordem crescente ou decrescente respectivamente 221 Capitulo 15 HQL A Linguagem 15 12 A clausula agrupar por Uma consulta que retorne valores agregados podem ser agrupados por qualquer propriedade de uma classe ou componentes retornados select cat color sum cat weight count cat from Cak gat group Dy cat color select foo id avg name max name from Foo foo join foo names name group by foo id Uma cl usula having tamb m permitida select cat color sum cat weight count cat from Cat cat group py caticolor having cat color in eg Color TABBY eg Color BLACK Fun es SQL e fun es agregadas s o permitidas nas cl usulas having order by se suportadas pelo banco de dados subjacentes ex n o n
256. gressively release JDBC connections after each statement This allows the sessions to be managed by the life cycle of the JTA transaction to which it is associated keeping user code clean of such management concerns Your code can either use JTA programmatically through UserTransaction or recommended for portable code use the Hibernate Transaction API to set transaction boundaries If you run in an EJB container declarative transaction demarcation with CMT is preferred 3 8 4 implementa o JMX Alinha cfg buildSessionFactory ainda precisa ser executada em algum local para conseguir uma SessionFactory em JNDI Voc pode escolher fazer isto em um bloqueio de inicializador static como aquele em Hibernateutil ou implementar o Hibernate como servi o gerenciado O Hibernate distribu do com 0 org hibernate jmx HibernateService para implementa o em um servidor de aplicativo com capacidades JMX tal como o JBoss AS A implementa o atual e configura o comercial Segue aqui um exemplo do 5boss service xm1 para o JBoss 4 0 x lt xml version 1 0 gt lt SServer lt mbean code org hibernate jmx HibernateService name jboss jca service HibernateFactory name HibernateFactory gt qi Regu red SELVES lt depends gt jboss jca service RARDeployer lt depends gt lt depends gt jboss jca service LocalTxCM name HsqlDS lt depends gt lt Bind the Hibernate service to JNDI gt lt attribute name Jndi
257. gt lt key column PAYMENT ID gt lt join gt lt subclass gt lt subclass name ChequePayment discriminator value CHEQUE gt lt join table CHEQUE PAYMENT fetch select gt lt key column PAYMENT ID gt lt join gt lt subclass gt lt class gt A declara o opcional fet ch select diz ao Hibernate para n o buscar os dados da subclasse ChequePayment quando usar uma uni o externa pesquisando a superclasse 9 1 4 Mesclar tabela por hierarquia de classes com tabela por subclasse Voc pode at mesmo mesclar a estrat gia de tabela por hierarquia e tabela por subclasse usando esta abordagem 153 Capitulo 9 Mapeamento de Her lt class name Payment table PAYMENT gt lt id name id type long column PAYMENT_ID gt lt generator class native gt lt o gt lt discriminator column PAYMENT_TYPE type string gt lt property name amount column AMOUNT gt lt subclass name CreditCardPayment discriminator value CREDIT gt lt join table CREDIT PAYMENT gt lt property name creditCardType column CCTYPE gt lt join gt lt subclass gt lt subclass name CashPayment discriminator value CASH gt lt subclass gt lt subclass name ChequePayment discriminator value CHEQUE gt lt subclass gt lt class gt Para qualquer uma dessas estrat gias de mapeamento uma associa o polim rfica para a classe ra z Payment deve ser m
258. hday type date gt lt component name Name class eg Name unique true gt lt parent name namedPerson gt lt reference back to the Person gt lt property name initial gt lt property name first gt lt property name last gt lt component gt edad gt 8 2 Cole es de objetos dependentes Cole es de componentes s o suportadas ex uma matriz de tipo Name Declare a sua cole o de componentes substituindo a tag lt element gt pela tag lt composite element gt lt set name someNames table some names lazy true gt lt key column id gt lt composite element class eg Name gt lt class attribute required gt lt property name initial gt lt property name first gt lt property name last gt lt composite element gt lt set gt Ss Importante Se voc definir um set de elementos compostos muito importante implementar equals hashCode corretamente Elementos compostos podem conter componentes mas n o cole es Se o seu elemento composto tiver componentes use a tag lt nested composite element gt Este um caso bastante ex tico cole es de componentes que por si pr pria possui componentes Neste momento voc deve estar se perguntando se uma associa o de um para muitos seria mais apropriada Tente remodelar o elemento composto como uma entidade mas note que mesmo pensando que o modelo Java o mesmo o modelo relacional e a
259. hread lt property gt lt Disable the second level cache gt lt property name cache provider_class gt org hibernate cache NoCacheProvider lt property gt lt li Echo all executed SOL to stdout gt lt property name show_sql gt true lt property gt lt Drop and re create the database schema on startup gt lt property name hbm2ddl auto gt update lt property gt lt mapping resource org hibernate tutorial domain Event hbm xml gt lt session factory gt lt hibernate configuration gt Configure a SessionFactory do Hibernate A SessionFactory uma f brica global respons vel por uma base de dados particular Se voc tiver diversas bases de dados use diversas configura es lt session factory gt geralmente em diversos arquivos de configura o para uma inicializa o mais f cil Os primeiros quatro elementos property cont m a configura o necess ria para a conex o JBDC O elemento property do dialeto especifica a variante do SQL particular que o Hibernate gera Dica Q In most cases Hibernate is able to properly determine which dialect to use See for more information O gerenciamento autom tico de sess o do Hibernate para contextos de persist ncia bastante util neste contexto A op o hbm2ddl auto habilita a gera o autom tica de esquemas da base de dados diretamente na base de dados Isto tamb m pode ser naturalmente desligado apenas removendo a o
260. ia o A seguinte amostra ilustra o relacionamento padr o pai filho lt class name Person gt lt id name id column personId gt lt generator class native gt Coy at o gt lt many to one name address column addressId not null true gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt set name people inverse true gt lt key column addressId gt lt one to many class Person gt lt set gt lt class gt create table Person personId bigint not null primary key addressId bigint not null create table Address addressId bigint not null primary key Se voc usar uma List ou outra cole o indexada voc precisar especificar a coluna key da chave externa como not null O Hibernate administrar a associa o do lado da cole o para 136 Um para um que seja mantido o indice de cada elemento da cole o fazendo com que o outro lado seja virtualmente inverso ajustando update false insert false lt class name Person gt lt id name id gt lt many to one name address column addressId not null true insert false update false gt lt class gt lt class name Address gt lt id name id gt lt list name people gt lt key column addressId not null true gt lt list index column peopleldx gt lt one to many class Person gt 4 list g
261. ial exclusivo que n o seja a chave prim ria O atributo unique controla a gera o de DDL do Hibernate com a ferramenta SchemaExport lt property name serialNumber unique true type string column SERIAL NUMBER gt Ent o o mapeamento para orderTtem poderia usar lt many to one name product property ref serialNumber column PRODUCT SERIAL NUMBER gt 88 Um para um No entanto isto n o recomend vel Se a chave exclusiva referenciada engloba m ltiplas propriedades da entidade associada voc deve mapear as propriedades referenciadas dentro de um elemento chamado lt properties gt Se a chave exclusiva referenciada a propriedade de um componente voc pode especificar um caminho para a propriedade lt many to one name owner property ref identity ssn column OWNER SSN gt 5 1 13 Um para um Uma associa o um pra um para outra classe persistente declarada usando um elemento one to one lt one to one o O O09 name propertyName class ClassName cascade cascade_style constrained true false fetch join select property ref propertyNameFromAssociatedClass access field property ClassName formula any SQL expression lazy proxy no proxy false 0000000909009 entity name EntityName node element name attribute name element attribute embed xml true false foreign key foreign key name name O nome da propriedade class opcional pad
262. ialNumber private Set parts new HashSet public Set getParts return parts void setParts Set parts this parts parts public String getSerialNumber return serialNumber void setSerialNumber String sn serialNumber sn A interface atual pode ser java util set java util Collection java util List java util Map java util SortedSet java util SortedMap OU O que desejar o que desejar significa que voc ter que escrever uma implementa o de org hibernate usertype UserColl ctionType Observe como inicializamos a vari vel da inst ncia com uma inst ncia de Hashset Esta a melhor maneira de inicializar propriedades de cole es de valor de inst ncias recentemente instanciadas n o persistentes Quando voc fizer uma inst ncia persistente chamando persist como por exemplo o Hibernate substituir O HashSet por uma inst ncia da pr pria implementa o do Hibernate do set Cuidado com erros como este Cat cat new DomesticcCat Cat kitten new DomesticcCat Set kittens new HashSet kittens add kitten cat setKittens kittens session persist cat kittens cat getKittens Okay kittens collection is a Set HashSet cat getKittens Error As cole es persistentes injetadas pelo Hibernate se comportam como HashMap HashSet TreeMap TreeSet OU ArrayList dependendo do tipo de interface As inst ncias de cole o t m o comportamento comum de tipo
263. ibernate org hibernate Transaction API In this particular case we are using JDBC based transactional semantics but it could also run with JTA O que a sessionFactory getCurrentSession faz Primeiro voc pode chamar quantas vezes e de onde quiser assim que voc receber sua org hibernate SessionFactory O m todo getCurrentSession sempre retorna unidade de trabalho atual Voc se lembra que n s mudamos a op o de configura o desse mecanismo para thread em nosso src main resources hibernate cfg xm1 Devido a esta configura o o contexto de uma unidade de trabalho atual estar vinculada thread Java atual que executa nossa aplica o Ss Importante O Hibernate oferece tr s m todos da sess o atual O m todo thread baseado n o possui por interesse o uso de produ o ele basicamente til para 12 Carregando e salvando objetos prototyping e tutoriais tais como este A sess o atual ser discutida em mais detalhes mais tarde Um org hibernate Session come a quando for necess ria quando feita a primeira cnamada getCurrentSession ent o limitada pelo Hibernate para a thread atual Quando a transa o termina tanto com commit quanto rollback o Hibernate tamb m desvincula a session da thread e fecha isso pra voc Se voc chamar getCurrentSession novamente voc receber uma nova Session poder come ar uma nova unidade de trabalho Em rela o ao escopo da un
264. ida depende totalmente do propriet rio da cole o ou ele pode ser uma refer ncia outra entidade com seu pr prio ciclo de vida No ltimo caso somente o link entre os dois objetos considerado como estado seguro pela cole o O tipo contido referido como tipo de elemento de cole o Os elementos de cole o s o mapeados pelo lt element gt OU lt composite element gt ou no caso de refer ncias de entidade com lt one to many gt OU lt many to many gt Os primeiros dois mapeiam elementos com sem nticas de valor os dois outros s o usados para mapear associa es de entidade 6 2 3 Cole es indexadas Todos os mapeamentos de cole o exceto aqueles com sem nticas de conjunto e bag precisam de uma coluna ndice na tabela de cole o uma coluna que mapeia para um ndice matriz ou ndice List ou chave de map O ndice de um map pode ser de qualquer tipo mapeado com lt map key gt pode ser uma refer ncia de entidade mapeada com lt map key many to many gt ou pode ser um tipo composto mapeado com lt composite map key gt O ndice de uma matriz ou lista sempre do tipo integer e mapeado usando o elemento lt 1ist index gt As colunas mapeadas cont m inteiros sequenciais dos quais s o numerados a partir do zero por padr o lt list index column column name 116 Cole es de valores e associa es muitos para muitos base 0 1 gt O colum name required the nam
265. idade de trabalho o Hibernate org hibernate Session deve ser utilizado para executar uma ou mais opera es do banco de dados O exemplo acima utiliza uma session para cada opera o Isto pura coincid ncia o exemplo simplesmente n o complexo o bastante para mostrar qualquer outra abordagem O escopo de um Hibernate org hibernate Session flex vel mas voc nunca deve configurar seu aplicativo para utilizar um novo Hibernate org hibernate Session para aopera o de banco de dados every Portanto mesmo que voc o veja algumas vezes mais nos seguintes exemplos considere session per operation como um anti modelo Um aplicativo da web real ser demonstrado mais adiante neste tutorial See Cap tulo 12 Transa es e Concorr ncia for more information about transaction handling and demarcation The previous example also skipped any error handling and rollback Para rodar isto n s faremos uso do Maven exec plugin para chamar nossa classe com a instala o do classpath necess ria mvn exec java Dexec mainClass org hibernate tutorial EventManager Dexec args store Nota Voc precisa executar O mvn compile primeiramente Voc dever ver ap s a compila o a inicializa o do Hibernate e dependendo da sua configura o muito log de sa da No final voc ver a seguinte linha java Hibernate insert into EVENTS EVENT DATE title EVENT ID values Este O INSERT executado pelo Hibernate
266. ienta o a objetos e n o a componentes no n vel de arquitetura Por exemplo voc pode modelar uma pessoa desta maneira public class Person private java util Date birthday private Name name private String key public String getKey return key private void setKey String key this key key public java util Date getBirthday return birthday public void setBirthday java util Date birthday this birthday birthday public Name getName return name public void setName Name name this name name public class Name ehar inicial String first String Hasty public String getFirst return first void setFirst String first this First first J public String getLast return last 143 Capitulo 8 Mapeamento de Com void setLast String last this last last public char getInitial return initial void setInitial char initial this initial initial Agora Name pode ser persistido como um componente de Person Note que Name define m todos getter e setter para suas propriedades persistentes mas nao necessita declarar nenhuma interface ou propriedades identificadoras Nosso mapeamento do Hibernate seria semelhante a este lt class name eg Person table person gt lt id name Key column pid type string gt lt generator class uuid gt lt i id gt lt property name birthday type date gt lt co
267. ifica que a chave exterior se refere a colunas que n o s o chave prim ria da tabela original til para os dados legados not null1 opcional Especifica que a coluna da chave exterior n o aceita valores nulos Isto impl cito em qualquer momento que a chave exterior tamb m fizer parte da chave prim ria update opcional Especifica que a chave exterior nunca deve ser atualizada Isto est impl cito em qualquer momento que a chave exterior tamb m fizer parte da chave prim ria unique opcional Especifica que a chave exterior deve ter uma restri o nica Isto impl cito em qualquer momento que a chave exterior tamb m fizer parte da chave prim ria O O O 0 8 8 N s recomendamos que para sistemas que o desempenho deletar seja importante todas as chaves devem ser definidas on delete cascade O Hibernate ir usar uma restri o a n vel de banco de dados ON CASCADE DELETE ao inv s de muitas instru es DELETE Esteja ciente que esta caracter stica um atalho da estrat gia usual de bloqueio otimista do Hibernate para dados versionados H As fun es not null e update s o teis quando estamos mapeando uma associa o unidirecional um para muitos Se voc mapear uma associa o unidirecional um para muitos para uma chave exterior n o nula voc deve declarar a coluna chave usando lt key not null true gt 5 1 22 Elementos coluna e f rmula Qualquer elemento de mape
268. ion release mode for those sessions See Se o 2 5 Sess es Contextuais Passar a propriedade JDBC lt propertyName gt para DriverManager getConnection Passar a propriedade lt property Name gt para o JNDI InitialContextFactory 42 Propriedades opcionais de configura o Tabela 3 5 Propriedades de Cach do Hibernate Nome da Propriedade hibernate cache provider class hib rnat cach use minimal puts Prop sito O nome da classe de um cacheProvider personalizado exemplo classname of CacheProvider Otimizar opera o de cach de segundo n vel para minimizar escritas ao custo de leituras mais frequentes Esta configura o mais til para cach s em cluster e no Hibernate3 habilitado por padr o para implementa es de cache em cluster exemplo true false hib rnat cach use query cache Habilita a cache de consultas Mesmo assim consultas individuais ainda t m que ser habilitadas para o cache exemplo true false hib rnat cach use second level cache Pode ser utilizado para desabilitar completamente o cache de segundo n vel o qual habilitado por padr o para as classes que especificam um mapeamento lt cache gt exemplo true false hib hib hib rnat cach rnat cach query_cache_factory region_prefix rnat cach use_structured_entries O nome de classe de u
269. ior parent ia de p para c n o considerada parte do estado do objeto child e por isso n o criada no INSERT Ent o a solu o fazer uma parte de link do mapeamento do chila lt many to one name parent column parent id not null true gt N s tamb m precisamos adicionar a propriedade parent classe do child Agora que a entidade child est gerenciando o estado do link informaremos cole o para nao atualizar o link Utilizamos o atributo inverse para isto lt set name children inverse true gt lt key column parent id gt lt one to many class Child gt 298 Ciclo de vida em Cascata lt set O seguinte c digo seria usado para adicionar um novo child Parent p Parent session load Parent class pid Child c pew Child c setParent p p getChildren add c session save c session flush E agora somente um SQL INSERT seria editado Para assegurar tudo isto podemos criar um m todo de addchild do Parent public void addChild Child c c setParent this children add c Agora 0 c digo que adiciona um child se parece com este Parent p Parent session load Parent class pid Child c new Child Deaddeharlal ic r session save c session flush 22 3 Ciclo de vida em Cascata A chamada expl cita para save ainda inc moda Iremos nos referir a ela utilizando cascatas lt set name children inverse true cascade a
270. ios como tendo um contrato estrito com a camada de apresenta o sobre o quais dados est o dispon veis nos objetos desanexados a n o ser que voc esteja preparado para manter o contexto de persist ncia sess o aberto no processo de renderiza o da visualiza o Isto n o uma limita o do Hibernate uma solicita o fundamental para acesso a dados transacionais seguros Considere abstrair sua l gica comercial do Hibernate Oculte Hibernate o c digo de acesso a dados atr s de uma interface Combine os modelos DAO e Sess o Local de Thread Voc pode tamb m persistir algumas classes pelo JDBC handcoded associado ao Hibernate via um UserType Este um conselho para aplica es grandes o suficiente n o apropriado para uma aplica o com cinco tabelas N o use mapeamentos de associa o ex ticos Casos de testes pr ticos para associa es muitos para muitos reais s o raros A maioria do tempo voc precisa de informa o adicional armazenada na tabela de link Neste caso muito melhor usar associa es dois um para muitos para uma classe de link intermedi rio Na verdade acreditamos que a maioria das associa es um para muitos e muitos para um voc deve tomar cuidado ao utilizar qualquer outro tipo de associa o e perguntar a voc mesmo se realmente necess rio Prefira associa es bidirecionais As associa es unidirecionais s o mais dif ceis para pesquisar Em aplica es grandes
271. ique a modalidade auto commit imediatamente As transa es de banco de dados nunca s o opcionais toda a comunica o com um banco de dados tem que ocorrer dentro de uma transa o n o importa se voc vai ler ou escrever dados Como explicado o comportamento auto commit para leitura de dados deve ser evitado uma vez que muitas transa es pequenas s o improv veis de executar melhor do que uma unidade de trabalho claramente definida A ltima op o tamb m muito mais sustent vel e expandida O modelo mais comum em uma aplica o de cliente servidor multi usu rio sess o por requisi o Neste modelo uma requisi o do cliente enviada ao servidor onde a camada de persist ncia do Hibernate executada Uma session nova do Hibernate aberta e todas as opera es da base de dados s o executadas nesta unidade do trabalho Logo que o trabalho for completado e a resposta para o cliente for preparada a sess o descarregada e fechada Voc usaria tamb m uma nica transa o de base de dados para servir s requisi es dos clientes iniciando e submetendo o ao abrir e fechar da session O relacionamento entre os dois um para um e este modelo um ajuste perfeito para muitas aplica es O desafio encontra se na implementa o O Hibernate fornece gerenciamento integrado da sess o atual para simplificar este modelo Tudo que voc tem a fazer iniciar uma transa o quando uma requisi o precisa ser pr
272. ira na tabela de cole o A fun o column dentro do elemento element define o nome da coluna onde os valores da string ser o armazenados Segue abaixo o esquema atualizado EVENTS PERSON EVENT PERSON z PERSON EMAIL ADDR EVENT ID lt gt EVENT_ID EVENT_DATE PERSON_ID lt gt PERSON_ID lt gt PERSON ID TETEE AGE EMAIL_ADDR FIRSTNAME LASTNAME 19 Capitulo 1 Tutorial Voc pode observar que a chave prim ria da tabela da cole o na verdade uma chave composta usando as duas colunas Isso tamb m implica que cada pessoa n o pode ter endere os de e mail duplicados o que exatamente a sem ntica que precisamos para um set em Java Voc pode agora tentar adicionar elementos essa cole o do mesmo modo que fizemos anteriormente ligando pessoas e eventos o mesmo c digo em Java private void addEmailToPerson Long personId String emailAddress Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction Person aPerson Person session load Person class personld adding to the emailAddress collection might trigger a lazy load of the collection aPerson getEmailAddresses add emailAddress session getTransaction commit Desta vez n o utilizamos uma consulta fetch busca para inicializar a cole o Monitore o log SQL e tente otimiz lo com rdua busca 1 2 5 Associ
273. isa ser persistido mas n o prov de acess rios necess rios para mape lo como um componente Voc deve implementar org hibernate UserType Esta abordagem livra o c digo da aplica o de implementar transforma es de para o tipo Hibernate Use c digo manual JDBC nos afunilamentos Nas reas de desempenho cr tico do sistema alguns tipos de opera es podem se beneficiar do uso direto do JDBC Mas por favor espere at voc saber se um afunilamento E n o 323 Capitulo 25 Melhores praticas suponha que o uso direto do JDBC necessariamente mais r pido Se voc precisar usar diretamente o JDBC vale a pena abrir uma session do Hibernate embrulhar a sua opera o JDBC como um objeto org hibernate jdbc Work e usar uma conex o JDBC De modo que voc possa ainda usar a mesma estrat gia de transa o e ocultar o provedor a conex o Entenda o esvaziamento da session Em Em De tempos em tempos a sess o sincroniza seu estado persistente com o banco de dados O desempenho ser afetado se este processo ocorrer frequentemente Voc pode algumas vezes minimizar a libera o desnecess ria desabilitando a libera o autom tica ou at mesmo mudando a ordem das consultas e outras opera es em uma transa o particular uma arquitetura de tr s camadas considere o uso de objetos separados Ao usar a arquitetura do bean de sess o servlet voc pode passar os objetos persistentes carregados no bean de
274. jetos errar eraa aaa 159 10 1 Estado dos objetos no Hibernate eee 159 10 2 Tornando os objetos persistentes eee 159 10 3 Carregando 0 objeto cos assusasa ninfetas ease canbe sate eacaan iiaa aaa aaa iaaa aA 161 10 4 Consultando iioetaienedeianesccndadanatenecsivnccdszadesacenaet a a i 162 10 4 1 Executando consultas 0 ccc cece ceeeeeee eee rraraa ana 162 10 4 2 Filtrando cole es eeeeeeeeeeee tees aeaaeeeeeeeeeeeeaeaaeeneeeeeeeeeaeaaea 166 10 4 3 Consulta por crit rio cece eeeeee ects cece aaeeeeeeeeeeeeaeaaaeneeeeeeeeeaeaaea 167 10 4 4 Consultas em SQL nativa cece eeeeeeeeeeeeeeeeaaeaeeeeeeeeeeeeaeaaeeees 167 10 5 Modificando objetos persistentes siena aerea 168 10 6 Modificando objetos desacoplados raiar 169 10 7 Detec o autom tica de estado e eerrraaaa araras 170 10 8 Apagando objetos persistentes errar enreraa aaa 171 10 9 Replicando objeto entre dois armazenamentos de dados diferentes 171 10 10 Limpando a Sess o ee cece ee ee eee teeter ee ee eae ee eeeeeeeeaeaaeaneeeeeeeeeaeaaea 172 10 11 Persist ncia Transitiva c cece ccecee ee eeeneeeeeeeeeeeeaeaaeeeeeeeeeeeaeaaaaeeeeeeeeeaeaaaaaes 173 10 12 Usando metadados arsino E EEE vis Moeiber ue oeeees vn otebaeeboieeess 175 11 Read only entities 2 0 00 cece
275. k table works discriminator value W gt lt id name id column id gt lt generator class native gt ey fio E lt discriminator column type type character gt lt property name title gt lt set name authors table author work gt lt key column name work id gt lt many to many class Author column name author id gt lt set gt 313 Capitulo 24 Exemplo Varios lt subclass name Book discriminator value B gt lt property name text gt lt subclass gt lt subclass name Song discriminator value S gt lt property name tempo gt lt property name genre gt lt subclass gt lt class gt lt class name Author table authors gt lt id name id column id gt lt The Author must have the same identifier as the Person gt lt generator class assigned gt afta lt property name alias gt lt one to one name person constrained true gt lt set name works table author_work inverse true gt lt key column author_id gt lt many to many class Work column work id gt lt set gt lt class gt lt class name Person table persons gt lt id name id column id gt lt generator class native gt lt id gt lt property name name gt lt class gt lt hibernate mapping gt Existem quatro tabelas neste mapeamento works authors persons mat m os dados de trabalho autor e pessoa respectiv
276. le iter hasNext Qux qux Qux iter next fetch the object something we couldnt express in the query if qux calculateComplicatedAlgorithm delete the current instance iter remove dont need to process the rest break 10 4 1 2 Consultas que retornam tuplas Algumas vezes as consultas do Hibernate retornam tuplas de objetos Cada tupla retornada como uma matriz Iterator kittensAndMothers sess createQuery select kitten mother from Cat kitten join kitten mother mother st terat ar y 163 Capitulo 10 Trabalhando com while kittensAndMothers hasNext Object tuple Object kittensAndMothers next Cat kitten Cat tuple 0 Cat mother Cat tuple 1 10 4 1 3 Resultados escalares As consultas devem especificar uma propriedade da classe na cl usula select Elas tamb m podem chamar fun es SQL de agrega es Propriedades ou agrega es s o consideradas resultados agregados e n o entidades no estado persistente Iterator results sess createQuery select cat color min cat birthdate count cat from Cat cat group by cat color ERES IO iterator while results hasNext Object row Object results next Color type Color row 0 Date oldest Date row 1 Integer count Integer row 2 10 4 1 4 Parametros de vinculo M todos em consulta s o oferecidos para valores de v ncul
277. litar o uso da autoriza o JAAS lt listener type pre delete class org hibernate secure JACCPreDeleteEventListener gt lt listener type pre update class org hibernate secure JACCPreUpdateEventListener gt lt listener type pre insert class org hibernate secure JACCPreInsertEventListener gt 206 Seguran a declarativa do Hibernate lt listener type pre load class org hibernate secure JACCPreLoadEventListener gt Note que lt listener type class gt somente um atalho para lt event type gt lt listener class gt lt event gt quando existir somente um listener para um tipo de evento em particular Depois disso ainda em hibernate cfg xm1 vincule as permiss es aos pap is lt grant role admin entity name User actions insert update read gt lt grant role su entity name User actions gt Os nomes das fun es s o as fun es conhecidas pelo seu provedor JACC 207 208 Batch processing Uma alternativa para inserir 100 000 linhas no banco de dados usando o Hibernate pode ser a seguinte Session session sessionFactory openSession Transaction tx session beginTransaction for inte 0 1 lt 100000 ift Customer customer new Customer We session save customer tx commit session close Isto ir falhar com um outofMemoryExcept ion em algum lugar pr ximo a linha 50 000 Isso ocorre devido ao fato do
278. ll gt lt key column parent_id gt lt one to many class Child gt lt set gt Isto simplifica o c digo acima para Parent p Parent session load Parent class pid Child c new Child p addChild c 299 Capitulo 22 Exemplo Pai Filho session flush Da mesma forma nao precisamos repetir este comando com os filhos ao salvar ou deletar um Parent O comando seguinte ir remover o p e todos os seus filhos do banco de dados Parent p Parent session load Parent class pid session delete p session flush No entanto este c digo Parent p Parent session load Parent class pid Child c Child p getChildren iterator next p getChildren remove c c setParent null session flush n o ir remover c do banco de dados Neste caso ele somente remover o link para p e causar uma viola o de restri o NoT NULL Voc precisar delete de forma expl cita O child Parent p Parent session load Parent class pid Child c Child p getChildren iterator next p getChildren remove c session delete c session flush Agora no seu caso um Child n o pode existir sem seu pai Ent o se removermos um child da cole o n o iremos mais querer que ele seja deletado Devido a isto devemos utilizar um cascade all delete orphan lt set name children inverse true cascade all delete orphan gt lt key column paren
279. lo 16 Consultas por cr Listy Isto retornar todos os cats com um mate amigo cujo nome inicia com bom ordenado pela idade de seu mate e todos os cats que n o tem mates Isto til quando houver necessidade de pedir ou limitar a prioridade do banco de dados em retornar conjuntos de resultado complexo grande e remover muitas inst ncias onde consultas m ltiplas deveriam ter sido executadas e os resultados unidos pelo java em mem ria Sem este recurso o primeiro de todos os cats sem um mate teria que ser carregado em uma consulta Uma segunda consulta teria que restaurar os cats com os mates cujos os nomes iniciem com bom selecionados pelas idades dos mates A terceira em mem ria as listas teriam que ser unidas manualmente 16 5 Busca de associa o din mica Voc deve especificar as sem nticas de busca de associa o em tempo de execu o usando setFetchMode List cats sess createCriteria Cat class add Restrictions like name Fritzs setFetchMode mate FetchMode EAGER setFetchMode kittens FetchMode EAGER Persie de This query will fetch both mate and kittens by outer join See Se o 20 1 Estrat gias de Busca for more information 16 6 Exemplos de consultas A classe org hibernate criterion Example permite que voc construa um crit rio de consulta a partir de uma dada inst ncia Cat cat new Cat cat setSex F cat setColor Color BLACK Li
280. lo e execu o de par metro s o feitos programaticamente Query q sess getNamedQuery ByNameAndMaximumWeight q setString 0 name q setInt 1 minWeight List cata q list f Note que o c digo de programa atual independente da linguagem de consulta que utilizada voc tamb m pode definir as consultas SQL nativas no metadado ou migrar consultas existentes para o Hibernate colocando os em arquivos de mapeamento Observe tamb m que uma declara o de consulta dentro de um elemento lt hibernate mapping gt requer um nome nico global para a consulta enquanto uma declara o de consulta dentro de um elemento de lt classe gt torna se nico automaticamente aguardando o nome completo da classe qualificada por exemplo eg Cat ByNameAndMaximumWeight 10 4 2 Filtrando cole es Uma cole o filter um tipo especial de consulta que pode ser aplicado a uma cole o persistente ou a uma matriz A faixa de consulta pode referir se ao this significando o elemento de cole o atual Collection blackKittens session createFilter pk getKittens where this color 166 Consulta por crit rio setParameter Color BLACK Hibernate custom ColorUserType class pee eat A cole o retornada considerada uma bolsa e a c pia da cole o dada A cole o original n o modificada Ela oposta implica o do nome filtro mas consistente com o comportamento esperado O
281. lores s o inicializados de algumas outras propriedades que mapeiam a s mesma s coluna s ou por um trigger ou outra aplica o property ref opcional O nome de uma propriedade da classe associada que esteja unida esta chave exterior Se n o for especificada a chave prim ria da classe associada ser utilizada access opcional padr o para property A estrat gia que o Hiberante deve utilizar para acessar o valor da propriedade unique opcional Habilita a gera o DDL de uma restri o nica para a coluna da chave exterior Al m disso permite ser o alvo de uma property ref Isso torna a multiplicidade da associa o efetivamente um para um 87 Capitulo 5 Mapeamento O R Basico not nu11 opcional Habilita a gera o DDL de uma restri o de nulidade para as colunas de chaves exteriores O optimistic lock opcional padr o para true Especifica se mudan as para esta propriedade requerem ou n o bloqueio otimista Em outras palavras determina se um incremento de vers o deve ocorrer quando esta propriedade est suja 1azy opcional padr o para proxy Por padr o associa es de ponto nico s o envoltas em um proxie lazy no proxy especifica que a propriedade deve ser trazida de forma tardia quando a inst ncia da vari vel acessada pela primeira vez Isto requer instrumenta o bytecode em tempo de cria o O lazy false especifica que a associa o ser sempre procurada
282. lt id name id column child_id gt 123 Capitulo 6 Mapeamento de col lt many to one name parent class Parent column parent_id not null true gt lt class gt Mapear apenas uma das pontas da associa o com inverse true n o afeta as opera es em cascata uma vez que isto um conceito ortogonal 6 3 3 Associa es bidirecionais com cole es indexadas Uma associa o bidirecional onde um dos lados representado por uma lt list gt OU lt map gt requer uma considera o especial Se houver uma propriedade da classe filha que fa a o mapeamento da coluna do ndice sem problemas pode se continuar usando inverse true no mapeamento da cole o lt class name Parent gt lt id name id column parent_id gt lt map name children inverse true gt lt key column parent_id gt lt map key column name type string gt lt one to many class Child gt lt map gt lt class gt lt class name Child gt lt id name id column child_id gt lt property name name not null true gt lt many to one name parent class Parent column parent_id not null true gt lt fc lass E Mas se n o houver nenhuma propriedade na classe filha n o podemos ver essa associa o como verdadeiramente bidirecional h uma informa o dispon vel em um lado da associa o que n o est dispon vel no extremo oposto Nesse caso n s n o podemos mapear a c
283. lt set name parts gt lt key column productSerialNumber not null true gt lt one to many class Part gt lt set gt lt class gt Al m do lt set gt existe tamb m os elementos de mapeamento lt list gt lt map gt lt bag gt lt array gt and lt primitive array gt O elemento lt map gt de representa o lt map name propertyName table table name schema schema name lazy true extra false inverse true false cascade all none save update delete all delete orphan delete orphan sort unsorted natural comparatorClass order by column name asc desc where arbitrary sql where condition fetch join select subselect batch size N 114 Mapeamento de cole o access field property ClassName 12 optimistic lock true false 13 mutablle VErue False node element name embed xmi true false KIN op oo VS lt map key gt lt element gt lt map gt ooo aq o O 88 o O name O nome da propriedade da cole o table opcional padr o para nome de propriedade o nome da tabela de cole o Isto n o usado para associa es um para muitos schema opcional o nome de um esquema de tabela para sobrescrever o esquema declarado no elemento ra z 1azy opcional padr o para true pode ser utilizado para desabilitar a busca lazy e especificar que a associa o sempre buscada antecipadamente ou para habilitar bus
284. lunas 290 Padronizando o esquema lt property name name type my customtypes Name gt lt column name last not null true index bar_idx length 30 gt lt column name first not null true index bar_idx length 20 gt lt column name initial gt lt property gt A fun o default deixa voc especificar um valor padr o para uma coluna Voc deve atribuir o mesmo valor propriedade mapeada antes de salvar uma nova inst ncia da classe mapeada lt property name credits type integer insert false gt lt column name credits default 10 gt lt property gt lt version name version type integer insert false gt lt column name version default 0 gt lt property gt A fun o sal type permite que o usu rio sobrescreva o mapeamento padr o de um tipo de Hibernate para um tipo de dados SQL lt property name balance type float gt lt column name balance sql type decimal 13 3 gt lt property gt A fun o check permite que voc especifique uma restri o de verifica o lt property name foo type integer gt lt column name foo check foo S aoe lt property gt lt class name Foo table foos check bar lt 100 0 gt lt property name bar type float gt lt class gt A seguinte tabela resume estes atributos opcionais 291 Capitulo 21 Guia de Toolset Tabela 21 1 Sumario Fun o Valores In
285. m Cat cat where cat alive true Pode se testar o tamanho de uma cole o com a propriedade especial size ou a fun o especial size from Cat cat where cat kittens size gt 0 from Cat cat where size cat kittens gt 0 Para cole es indexadas voc pode se referir aos ndices maximo e m nimo usando as fun es minindex maxindex Igualmente pode se referir aos elementos m ximo e m nimo de uma cole o de tipos b sicos usando as fun es minelement maxelement Por exemplo from Calendar cal where maxelement cal holidays gt current date from Order order where maxindex order items gt 100 from Order order where minelement order items gt 10000 As fun es SQL any some all exists in s o suportadas quando passado o elemento ou o conjunto de ndices de uma cole o elements e ndices de fun es ou o resultado de uma subconsulta veja abaixo select mother from Cat as mother Cat as kit where kit in elements foo kittens select p from NameList list Person p where p name some elements list names 225 Capitulo 15 HQL A Linguagem from Cat cat where exists elements cat kittens from Player p where 3 gt all elements p scores from Show show where fizard in indices show acts Note que essas constru es tamanho elementos ndices minindex maxindex minelement maxelement s podem ser usados na cl usula where do Hibernates Elementos d
286. m EJBs com transa es gerenciadas por recipiente porque uma transa o ser terminada quando um m todo de EJB retornar antes que a renderiza o de toda vis o possa come ar Veja o website e o f rum do Hibernate para dicas e exemplos em torno deste modelo de Sess o Aberta na Visualiza o 12 1 2 Longas conversa es O modelo sess o por requisi o n o o nico conceito til que voc pode usar ao projetar unidades de trabalho Muitos processos de neg cio requerem uma totalidade de s ries de intera es com o usu rio intercaladas com acessos a uma base de dados Em aplica es da web e corporativas n o aceit vel que uma transa o atrapalhe uma intera o do usu rio Considere o seguinte exemplo A primeira tela de um di logo se abre e os dados vistos pelo usu rio s o carregados em uma Session e transa o de banco de dados particulares O usu rio est livre para modificar os objetos O usu rio clica em Salvar ap s 5 minutos e espera suas modifica es serem persistidas O usu rio tamb m espera que ele seja a nica pessoa que edita esta informa o e que nenhuma modifica o conflitante possa ocorrer N s chamamos esta unidade de trabalho do ponto da vis o do usu rio uma conversa o de longa dura o ou transa o da aplica o H muitas maneiras de voc implementar em sua aplica o Uma primeira implementa o simples pode manter a session e a transa o aberta durante o
287. m uma ordem errada Geralmente voc n o precisa se preocupar com esses detalhes pois muito provavelmente usar a caracter stica de persist ncia transitiva do Hibernate para salvar os objetos associados automaticamente Assim enquanto uma restri o NOT NULL n o ocorrer o Hibernate tomar conta de tudo Persist ncia transitiva ser discutida mais adiante nesse mesmo cap tulo 160 Carregando o objeto 10 3 Carregando o objeto O m todo 10ad de uma session oferece uma maneira de recuperar uma inst ncia persistente se o identificador for conhecido O 1oad escolhe uma classe do objeto e carregar o estado em uma inst ncia mais recente dessa classe em estado persistente Cat fritz Cat sess load Cat class generatedId you need to wrap primitive identifiers long id 1234 DomesticCat pk DomesticCat sess load DomesticCat class new Long id Alternativamente pode se carregar um estado em uma inst ncia dada Cat cat new DomesticcCat load pk s state into cat sess load cat new Long pkId Set kittens cat getKittens Repare que 1oad ir lan ar uma exce o irrecuper vel se n o houver na tabela no banco de dados um registro que combine Se a classe for mapeada com um proxy load simplesmente retorna um proxy n o inicializado e realmente n o chamar o banco de dados at que um m todo do proxy seja invocado Esse comportamento muito til para criar uma associa o
288. ma interface personalizada QueryCache padroniza para o StandardQueryCache criado automaticamente exemplo classname of QueryCach Um prefixo para usar em nomes regionais de cach de segundo nivel exemplo prefix For a o Hibernate a armazenar dados no cach de segundo n vel em um formato mais humanamente amig vel exemplo true false 43 Capitulo 3 Configuration Tabela 3 6 Propriedades de Transacao do Hibernate Nome da Propriedade Prop sito hibernate transaction factory class O nome da classe de uma TransactionFactory para usar com API do Hibernate Transaction por padr oJDBCTransactionFactory exemplo classname of TransactionFactory jta UserTransaction Um nome JNDI usado pelo JTATransactionFactorypara obter uma UserTransaction JTA a partir do servidor de aplica o e g jndi composite name hibernate transaction manager lookup cl 3s nome da classe de um TransactionManagerLookup Ele requerido quando o caching a n vel JVM estiver habilitado ou quando estivermos usando um gerador hilo em um ambiente JTA exemplo classname of TransactionManagerLookup hibernate transaction flush before compl temabled the session will be automatically flushed during the before completion phase of the transaction Built in and automatic session context management is preferred see Se o 2 5 Sess es Contextuais e g true false hibernate transaction auto close sessiorf enabl
289. make the contract read only and change to a new plan tx session beginTransaction Contract contract Contract session get Contract class contractId session setReadOnly contract true Plan newPlan new Plan new plan contract setPlan newPlan tx commit get the same contract tx session beginTransaction contract Contract session get Contract class contractId newPlan Contract session get Plan class newPlan getId contract getPlan still refers to the original plan newPlan is non null because it was persisted when the previous transaction was committed tz commit 7 session close 11 2 2 2 Unidirectional one to many and many to many Hibernate treats unidirectional one to many and many to many associations owned by a read only entity the same as when owned by an entity that is not read only Hibernate dirty checks unidirectional one to many and many to many associations The collection can contain entities that are read only as well as entities that are not read only Entities can be added and removed from the collection changes are flushed to the database If automatic versioning is used Hibernate will update the version due to changes in the collection if they dirty the owning entity 184 Bidirectional associations 11 2 3 Bidirectional associations 11 2 3 1 Bidirectional one to one If a read only entity owns a bidirectional one to o
290. me connection datasource gt java comp env jdbc MyDB lt property gt lt property name dialect gt org hibernate dialect MySQLDialect lt property gt lt property name show sql gt false lt property gt lt property name transaction factory class gt org hibernate transaction JTATransactionFactory lt property gt lt property name jta UserTransaction gt java comp UserTransaction lt property gt Si mappingltales gt 49 Capitulo 3 Configuration lt mapping resource org hibernate auction Item hbm xm1 gt lt mapping resource org hibernate auction Bid hbm xml gt SS gache settings gt lt class cache class org hibernate auction Item usage read write gt lt class cache class org hibernate auction Bid usage read only gt lt collection cache collection org hibernate auction Item bids usage read write gt lt session factory gt lt hibernate configuration gt Como voc pode ver a vantagem deste enfoque a externaliza o dos nomes dos arquivos de mapeamento para configura o O hibernate cfg xml tamb m mais conveniente caso voc tenha que ajustar o cache do Hibernate Note que a escolha sua em usar hibernate properties OU hibernate cfg xml ambos s o equivalentes exceto os acima mencionados de usar a sintaxe de XML Com a configura o do XML iniciar o Hibernate ent o t o simples quanto SessionFactory sf new Configuration configure buildSe
291. mento de mapeamento para voc Configuration cfg new Configuration addClass org hibernate auction Item class addClass org hibernate auction Bid class O Hibernate procurara pelos arquivos de mapeamento chamados org hibernate auction Item hbm xml org hibernate auction Bid hbm xml no classpath Esta abordagem elimina qualquer nome de arquivo de dif cil compreens o Uma configuration tamb m permite que voc especifique propriedades de configura o espec fica Por exemplo Configuration cfg new Configuration addClass org hibernate auction Item class addClass org hibernate auction Bid class setProperty hibernate dialect org hibernate dialect MySQLInnoDBDialect setProperty hibernate connection datasource java comp env jdbc test setProperty hibernate order updates true 35 Capitulo 3 Configuration Esta n o a unica forma de passar as propriedades de configura o para o Hibernate As varias op es incluem 1 Passar uma inst ncia de java util Properties para Configuration setProperties 2 Colocar hibernate properties de arquivo nomeado no diret rio ra z do classpath 3 Determinar as propriedades do system usando java Dproperty value 4 Incluir elementos lt property gt NO hibernate cfg xm1 discutido mais tarde Caso voc deseje inicializar rapidamente O hibernate properties a abordagem mais r pida O org hibernate cfg Configuration
292. mponent name Name class eg Name gt lt class attribute optional gt lt property name initial gt lt property name first gt lt property name last gt lt component gt class A tabela person teria as seguintes colunas pid birthday initial first and last Assim como todos tipos por valor componentes nao suportam refer ncias cruzadas Em outras palavras duas persons podem ter o mesmo nome mas os dois objetos person podem ter dois objetos de nome independentes apenas o mesmo por valor A sem ntica dos valores null de um componente s o ad hoc No recarregameno do conte do do objeto o Hibernate entender que se todas as colunas do componente s o null ent o todo o componente null Isto seria o certo para a maioria dos prop sitos As propriedades de um componente podem ser de qualquer tipo do Hibernate cole es associa es muitos para um outros componentes etc Componentes agrupados n o devem ser considerados luxo O Hibernate tem a inten o de suportar um modelo de objetos fine grained muito bem granulados O elemento lt component gt permite um sub elemento lt parent gt mapeie uma propriedade da classe do componente como uma referencia de volta para a entidade que o cont m lt class name eg Person table person gt 144 Cole es de objetos dependentes lt id name Key column pid type string gt lt generator class uuid gt Syste lt property name birt
293. n o faz com que a entidade se torne persistente por padr o A adi o de uma entidade cole o por padr o meramente cria um link entre as duas entidades A remo o da entidade remover o link Isto muito apropriado para alguns tipos de casos No entanto n o apropriado o caso de um relacionamento pai filho Neste caso a vida do filho est vinculada ao ciclo de vida do pai 22 2 Bidirecional um para muitos Suponha que come amos uma associa o lt one to many gt simples de Parent para Child lt set name children gt lt key column parent id gt 297 Capitulo 22 Exemplo Pai Filho lt one to many class Child gt lt set gt Se fossemos executar o seguinte c digo Parent D aro Child c new Child p getChildren add c session save c session flush O Hibernate editaria duas instru es SQL UM INSERT para criar um registro para c UM UPDATE para criar um link de p para c Isto n o somente ineficiente como tamb m viola qualquer restri o NoT NULL na coluna parent id N s podemos concertar a viola o da restri o de nulabilidade especificando um not null true no mapeamento da cole o lt set name children gt lt key column parent id not null true gt lt one to many class Child gt lt set gt No entanto esta n o uma solu o recomendada As causas subjacentes deste comportamento que o link a chave exter
294. n com que teremos de lidar s o direcionalidade multiplicidade e comportamento de cole o 1 2 2 Uma associa o unidirecional baseada em Configura o Iremos adicionar uma cole o de eventos na classe Person Dessa forma poderemos navegar pelos eventos de uma pessoa em particular sem executar uma consulta explicitamente apenas chamando Person getEvents As associa es de valores m ltiplos s o representadas no Hibernate por um dos contratos do Java Collection Framework aqui n s escolhemos um java util Set uma vez que a cole o n o conter elementos duplicados e a ordem n o relevante em nossos exemplos public class Person private Set events new HashSet public Set getEvents return events 15 Capitulo 1 Tutorial public void setEvents Set events this events events Antes de mapearmos esta associa o pense no outro lado Claramente poder amos apenas fazer isto de forma unidirecional Ou poder amos criar outra cole o no Event se quisermos navegar de ambas dire es Isto n o necess rio de uma perspectiva funcional Voc poder sempre executar uma consulta expl cita para recuperar os participantes de um evento em particular Esta uma escolha de design que cabe a voc mas o que claro nessa discuss o a multiplicidade da associa o muitos v lidos em ambos os lados n s cnamamos isto de uma associa o muitos para muitos Daqui pra frente usaremos
295. nCode column REGIONCODE gt lt return property name id column EID gt lt return property name salary gt lt return column name VALUE gt lt return column name CURRENCY gt lt return property gt lt return gt call selectAllEmployments lt sql query gt Observe que os procedimentos armazenados somente devolvem escalares e entidades O lt return join gt lt load collection gt N o s o suportados 251 Capitulo 17 SQL Nativo 17 2 2 1 Regras e limita es para utilizar procedimentos armazenados Para usar procedimentos armazenados com Hibernate os procedimentos e fun es precisam seguir a mesma regra Caso n o sigam estas regras n o poder o ser usados com o Hibernate Se voc ainda desejar usar estes procedimentos ter que execut los atrav s da session connection AS regras s o diferentes para cada banco de dados uma vez que os fabricantes possuem procedimentos de sem nticas sint xe armazenados Consultas de procedimento armazenado n o podem ser paginados com O setFirstResult setMaxResults O formul rio de chamada recomedado o padr o SQL92 call functionName lt parameters gt Of call procedureName lt parameters gt A sint xe de chamada nativa n o suportada As seguintes regras se aplicam para Oracle A fun o deve retornar um conjunto de resultado O primeiro par metro do procedimento deve ser um ouT que retorne um c
296. na o de tipo de mapeamento usando a reflex o quando os arquivos de mapeamentos s o processados Isto pode levar tempo e recursos portanto se voc inicializar o desempenho ser importante que voc considere claramente a defini o do tipo para uso Salve este arquivo de mapeamento como src main resources org hibernate tutorial domain Event hbm xml 1 1 4 Configura o do Hibernate Nestas alturas voc deve possuir a classe persistente e seu arquivo de mapeamento prontos o momento de configurar o Hibernate Primeiro vamos configurar o HSQLDB para rodar no modo do servidor N s utilizaremos o Maven exec plugin para lan ar o servidor HSQLDB pela execu o mvn exec java Dexec mainClass org hsqldb Server Dexec args database 0 Capitulo 1 Tutorial file target data tutorial Voc pode ver ele iniciando e vinculando ao soquete TCP IP aqui ser onde nossa aplica o ir se conectar depois Se voc deseja iniciar uma nova base de dados durante este tutorial finalize o HSQLDB delete todos os arquivos no diret rio target data e inicie o HSQLBD novamente O Hibernate conectar ao banco de dados no lugar de sua aplica o portanto ele precisar saber como obter as conex es Para este tutorial n s usaremos um pool de conex o aut nomo ao inv s de javax sql DataSource O Hibernate vem com o suporte para dois ter os dos pools de conex o JDBC de c digo aberto c3p0 https sour
297. name p AGE AS age FROM PERSON p WHERE p NAME LIKE Hiber lt sql query gt Voc pode externar as informa es de mapeamento de conjunto de resultado em um elemento lt resultset gt tanto para reus los em diversas consultas nomeadas quanto atrav s da API setResultSetMapping lt resultset name personAddress gt lt return alias person class eg Person gt lt return join alias address property person mailingAddress gt lt resultset gt lt sql query name personsWith resultset ref personAddress gt SELECT person NAME AS person name person AGE AS person age person SEX AS person sex address STREET AS address street address CITY AS address city address STATE AS address state address ZIP AS address zip FROM PERSON person JOIN ADDRESS address ON person ID address PERSON ID AND address TYPE MAILING WHERE person NAME LIKE namePattern lt sql query gt Voc pode tamb m como forma alternativa usar a informa o de mapeamento de conjunto de resultado em seus arquivos hbm em c digo de java List cats sess createSQLQuery 249 Capitulo 17 SQL Nativo select cat kitten from cats cat cats kitten where kitten mother cat id setResultSetMapping catAndKitten Lise 17 2 1 Utilizando a propriedade retorno para especificar explicitamente os nomes de colunas alias Com a lt return property gt voc pode informar explicitamente quais aliases de c
298. ncrement gt Jade lt property name name not null true gt lt loader query ref person gt lt class gt Este tamb m funciona com procedimentos armazenados Voc pode tamb m definir uma consulta para carregar uma cole o lt set name employments inverse true gt lt key gt lt one to many class Employment gt lt loader query ref employments gt lt set gt 254 SQL padronizado para carga lt sql query name employments gt lt load collection alias emp role Person employments gt SELECT emp FROM EMPLOYMENT emp WHERE EMPLOYER id ORDER BY STARTDATE ASC EMPLOYEE ASC lt sql query gt Voc pode at definir um carregador de entidade que carregue uma cole o por busca de uni o lt sql query name person gt lt return alias pers class Person gt lt return join alias emp property pers employments gt SELECT NAME AS pers emp FROM PERSON pers LEFT OUTER JOIN EMPLOYMENT emp ON pers ID emp PERSON ID WHERE ID lt sql query gt 255 256 Filtrando dados O Hibernate3 prov um novo m todo inovador para manusear dados com regras de visibilidade Um Filtro do Hibernate um filtro global nomeado e parametrizado que pode ser habilitado ou n o dentro de uma Sess o do Hibernate 18 1 Filtros do Hibernate O Hibernate3 tem a habilidade de pr definir os crit rios do filtro e anexar esses filtros no n vel da classe e
299. ncy gt lt dependencies gt lt project gt Dica It is not a requirement to use Maven If you wish to use something else to build this tutorial such as Ant the layout will remain the same The only change is that you will need to manually account for all the needed dependencies If you use something like vy http ant apache org ivy providing transitive dependency management you would still use the dependencies mentioned below Otherwise you d need to grab all dependencies both explicit and transitive and add them to the project s classpath If working from the Hibernate distribution bundle this would mean hibernate3 jar all artifacts in the 1ib required directory and all files from either the 1ib bytecode cglib OF lib bytecode javassist directory additionally you will need both the servlet api jar and one of the slf4j logging backends Salve este arquivo como pom xml no diret rio raiz do projeto 1 1 2 A primeira Classe Agora iremos criar uma classe que representa o evento que queremos armazenar na base de dados Isto uma classe JavaBean simples com algumas propriedades package org hibernate tutorial domain import java util Date public class Event private Long id private String title private Date date public Event public Long getId return id private void setId Long id thilsea d a public Date getDate return date Capitulo 1 Tutorial public void setD
300. ne association Hibernate does not dirty check the association updates that change the association reference to null or to refer to a different entity will not be flushed to the database If automatic versioning is used Hibernate will not increment the version due to local changes to the association When the owner is not read only Hibernate treats an association with a read only entity the same as when the association is with an entity that is not read only 11 2 3 2 Bidirectional one to many many to one A read only entity has no impact on a bidirectional one to many many to one association if the read only entity is on the one to many side using an inverse collection the read only entity is on the one to many side using a non inverse collection the one to many side uses a non inverse collection that contains the read only entity When the one to many side uses an inverse collection a read only entity can only be added to the collection when it is created a read only entity can only be removed from the collection by an orphan delete or by explicitly deleting the entity 11 2 3 3 Bidirectional many to many Hibernate treats bidirectional many to many associations owned by a read only entity the same as when owned by an entity that is not read only 185 Capitulo 11 Read only entities Hibernate dirty checks bidirectional many to many associations The collection on either side of the
301. nenhum tipo de cascata com as inst ncias associadas As cole es s o ignoradas por uma Sess o sem Estado Opera es realizadas com uma Sess o sem Estado ignoram a arquitetura de eventos e os interceptadores As sess es sem estado s o vulner veis aos efeitos do alias dos dados 210 Opera es no estilo DML devido falta do cach prim rio Uma Sess o sem Estado uma abstra o de baixo nivel muito mais pr xima do JDBC adjacente StatelessSession session sessionFactory openStatelessSession Transaction tx session beginTransaction ScrollableResults customers session getNamedQuery GetCustomers scroll ScrollMode FORWARD ONLY while customers next Customer customer Customer customers get 0 customer updateStuff session update customer tz commit session close Veja neste exempo as instancias de customer retornadas pela consulta sao imediatamente desvinculadas Elas nunca ser o associadas um contexto persistente As opera es insert update delete definidas pela interface statelessSession S o considerados opera es diretas no banco de dados Isto resulta em uma execu o imediata de comandos SQL INSERT UPDATE OU DELETE respectivamente Dessa forma eles possuem uma sem ntica bem diferente das opera es save saveorUpdate OU delete definidas na interface session H 14 4 Opera es no estilo DML C
302. nidades de trabalho Ou voc modifica um objeto fora de um org hibernate Session quando n o se encontra no estado persistente se j esteve neste estado anteriormente chamamos esse estado de detached Voc pode at mesmo modificar uma cole o quando esta se encontrar no estado detached private void addPersonToEvent Long personId Long eventId Session session HibernateUtil getSessionFactory getCurrentSession session beginTransaction Person aPerson Person session createQuery select p from Person p left join fetch p events where p id pid setParameter pid personId uniqueResult Eager fetch the collection so we can use it detached Event anEvent Event session load Event class eventId 17 Capitulo 1 Tutorial session getTransaction commit Ene o zarae Vaie OE on aPerson getEvents add anEvent aPerson and its collection is detached Begin second unit of work Session session2 HibernateUtil getSessionFactory getCurrentSession session2 beginTransaction session2 update aPerson Reattachment of aPerson session2 getTransaction commit A chamada update cria um objeto persistente novamente pode se dizer que ele liga o objeto a uma nova unidade de trabalho assim qualquer modifica o que voc fa a neste objeto enquanto estiver no estado desanexado pode ser salvo no banco de dados Isso inclui qualquer modifica o adi o exclus o que v
303. no n vel da cole o Um crit rio do filtro a habilidade de definir uma cl usula restritiva muito semelhante fun o where dispon vel para a classe e v rias cole es A n o ser que essas condi es de filtros possam ser parametrizadas A aplica o pode ent o decidir em tempo de execu o se os filtros definidos devem estar habilitados e quais valores seus par metros devem ter Os filtros podem ser usados como Views de bancos de dados mas com par metros dentro da aplica o Para usar esses filtros eles devem inicialmente ser definidos e anexados aos elementos do mapeamento apropriados Para definir um filtro use o elemento lt filter def gt dentro do elemento lt nibernate mapping gt lt filter def name myFilter gt lt filter param name myFilterParam type string gt lt filter def gt Esse filtro pode ser acoplado uma classe lt class name myClass gt lt filter name myFilter condition myFilterParam MY_FILTERED_COLUMN gt lt class gt Ou a uma colegao SSE o qo lt filter name myFilter condition myFilterParam MY FILTERED COLUMN gt lt set gt Ou mesmo para ambos ou muitos de cada ao mesmo tempo Os m todos na session S O enableFilter String filterName getEnabledFilter String filterName disableFilter String filterName Por padr o os filtros n o s o habilitados 257 Capitulo 18 Filtrando dados dentro de qualqu
304. nos Por exemplo package eg import java util Set import java util Date public class Cat private Long id identifier private Date birthdate private Color color private char sex private float weight private int litterId private Cat mother private Set kittens new HashSet private void setId Long id this id id public Long getId return id void setBirthdate Date date birthdate date public Date getBirthdate return birthdate void setWeight float weight this weight weight public float getWeight 55 Capitulo 4 Classes Persistentes return weight public Color getColor return color void setColor Color color this color color void setSex char sex this sex sex public char getSex return sex void setLitterId int id this litterId id public int getLitterId return litterId void setMother Cat mother this mother mother public Cat getMother return mother void setKittens Set kittens this kittens kittens public Set getKittens return kittens addKitten not needed by Hibernate public void addKitten Cat kitten kitten setMother this kitten setLitterId kittens size kittens add kitten As quatro regras principais das classes persistentes sao descritas em maiores detalhes nas seguintes se es 4 1 1 Implemente um construtor de n o argument
305. not null true column productId gt lt class gt lt class name Product gt lt synchronize table LineItem gt lt id name productId length 10 gt lt generator class assigned gt lt id gt lt property name description not null true length 200 gt lt property name price length 3 gt lt property name numberAvailable gt lt property name numberOrdered gt lt formula gt select sum li quantity from LineItem li where li productId productId lt formula gt lt property gt lt class 319 Capitulo 24 Exemplo Varios 24 4 3 Muitos para muitos com fun o de chave composta compartilhada lt class name User table User gt lt composite id gt lt key property name name gt lt key property name org gt lt composite id gt lt set name groups table UserGroup gt lt key gt lt column name userName gt lt column name org gt lt key gt lt many to many class Group gt lt column name groupName gt lt formula gt org lt formula gt lt many to many gt lt set gt lt class gt lt class name Group table Group gt lt composite id gt lt key property name name gt lt key property name org gt lt composite id gt lt property name description gt lt set name users table UserGroup inverse true gt lt key gt lt column name groupName gt lt column name org gt lt key gt
306. nte que voc n o os confuda N s usamos et ch para ajustar o desempenho Podemos usar lazy para definir um contrato para qual dado sempre dispon vel em qualquer inst ncia desconectada de uma classe particular 20 1 1 Trabalhando com associa es pregui osas lazy Por padr o o Hibernate3 usa busca pregui osa para cole es e busca pregui osa com proxy para associa es de um valor Esses padr es fazem sentido para quase todas as associa es em quase todas a aplica es Se voc ajustar hibernate default batch fetch size O Hibernate ir usar otimiza o de busca em lote para a busca pregui osa Essa otimiza o pode ser tamb m habilitada em um n vel mais fino Perceba que o acesso a associa es pregui osas fora do contexto de uma sess o aberta do Hibernate ir resultar numa exce o Por exemplo s sessions openSession Transaction tx s beginTransaction User u User s createQuery from User u where u name userName setString userName userName uniqueResult Map permissions u getPermissions Ex commit s alosel Integer accessLevel Integer permissions get accounts Error Como a cole o de permiss es n o foi inicializada quando a Session for fechada a cole o n o poder carregar o seu estado O Hibernate n o suporta inicializa o pregui osa para objetos desconectados Para consertar isso necess rio mover o c digo que carrega a col
307. ntemente os gr ficoscompletos de objetos modificados t m que ser verificados n o somente nicas inst ncias O Hibernate oferece checagem de vers o autom tica com uma session estendida ou inst ncias desatachadas como o paradigma do projeto 12 3 2 Sess o estendida e versionamento autom tico Uma nica inst ncia de session e suas inst ncias persistentes s o usadas para a conversa o inteira isto conhecido como sess o por conversa o O Hibernate verifica vers es da inst ncia no momento da libera o lan ando uma exce o se a modifica o concorrente for detectada At o desenvolvedor pegar e tratar essa exce o As op es comuns s o a oportunidade para que o usu rio intercale as mudan as ou reinicie a conversa o do neg cio com dados n o antigos A session desconectada de toda a conex o JDBC adjacente enquanto espera a intera o do usu rio Este caminho o mais eficiente em termos de acesso a bancos de dados A aplica o n o precisa se preocupar com a checagem de vers o ou com as inst ncias destacadas reatadas nem precisa recarregar inst ncias a cada transa o foo is an instance loaded earlier by the old session Transaction t session beginTransaction Obtain a new JDBC connection start transaction foo setProperty bar session flush Only for last transaction in conversation E commit Also return JDBC connection session close Only for last transaction in
308. ntifies org hibernate exception JDBCConnect ionException as possibly being thrown A JDBCConnectionException here is interpreted to imply a non transient aka non recoverable connection problem and is used to indicate an immediate stop to resolution attempts All other exceptions result in a warning and continuing on to the next resolver A melhor parte destes solucionadores que os usuarios tamb m podem registrar os seus pr prios solucionadores personalizados dos quais ser o processados antes dos Hibernates internos Isto poder ser til em um n mero diferente de situa es permite uma integra o f cil de auto detec o de dialetos al m daqueles lan ados com o pr prio Hibernate Al m disto permite que voc especifique o uso de um dialeto personalizado quando um banco de dados particular reconhecido etc Para registrar um ou mais solucionadores apenas especifique os separados por v rgula tabs ou espa os usando o conjunto de configura o hibernate dialect resolvers consulte a constante DIALECT RESOLVERS NO org hibernate cfg Environment 26 4 Gera o do identificador When considering portability between databases another important decision is selecting the identifier generation stratagy you want to use Originally Hibernate provided the native generator for this purpose which was intended to select between a sequence identity or table strategy depending on the capability of the underl
309. o cat possui um construtor de n o argumento Todas as classes persistentes devem ter um construtor padr o que n o pode ser p blico para que o Hibernate possa instanci lo utilizando um Constructor newInstance N s recomendamos enfaticamente ter um construtor padr o com ao menos uma visibilidade package para a gera o de um proxy de tempo de espera no Hibernate 56 Providencie uma propriedade de identificador opcional 4 1 2 Providencie uma propriedade de identificador opcional Cat possui uma propriedade chamada id Esta propriedade mapeia para a coluna de chave primaria de uma tabela de banco de dados A propriedade pode ter sido chamada por qualquer nome e seu tipo pode ter sido qualquer um primitivo ou qualquer tipo wrapper java lang String OU java util Date Se sua tabela de banco de dados de legacia possuir chaves compostas voc tamb m podera usar uma classe de usuario definido com propriedades destes tipos veja a se o de identificadores compostos mais adiante A propriedade de identificador estritamente opcional Voc pode deix los desligados e deixar que o Hibernate encontre os identificadores de objeto internamente No entanto n o recomendamos que fa a isto Na verdade algumas funcionalidades est o dispon veis somente para classes que declaram uma propriedade de identificador Transitive reattachment for detached objects cascade update or cascade merge see Se o 10 11 Per
310. o EJB por exemplo A demarca o program tica portanto n o mais necess ria Entretanto frequentemente desej vel manter sua camada de persist ncia port vel entre ambientes de recurso locais n o gerenciados e sistemas que podem confiar em JTA mas use BMT ao inv s de CMT Em ambos os casos voc usaria demarca o de transa o program tica O Hibernate oferece uma API chamada Transaction que traduz dentro do sistema de transa o nativa de seu ambiente de implementa o Esta API realmente opcional mas n s encorajamos fortemente seu uso a menos que voc esteja em um bean de sess o CMT Geralmente finalizar uma session envolve quatro fases distintas e liberar a sess o submeter a transa o fechar a sess o e tratar as exce es A libera o da sess o j foi bem discutida agora n s daremos uma olhada na demarca o da transa o e na manipula o de exce o em ambientes controlados e n o controlados 12 2 1 Ambiente n o gerenciado Se uma camada de persist ncia do Hibernate roda em um ambiente n o gerenciado as conex es do banco de dados s o geralmente tratadas pelos pools de conex es simples ex n o DataSource dos quais o Hibernate obt m as conex es assim que necessitar A maneira de se manipular uma sess o transa o mais ou menos assim Non managed environment idiom Session sess factory openSession Transaction tx null try tx sess beginTransaction
311. o Hibernate package eg import java util ArrayList import java util Calendar import java util Iterator import java util List import org hibernate HibernateException import org hibernate Query import org hibernate Session import org hibernate SessionFactory import org hibernate Transaction import org hibernate cfg Configuration import org hibernate tool hbm2ddl SchemaExport public class BlogMain private SessionFactory sessions public void configure throws HibernateException _sessions new Configuration addClass Blog class addClass BlogItem class buildSessionFactory public void exportTables throws HibernateException Configuration cfg new Configuration addClass Blog class addClass BlogItem class new SchemaExport cfg create true true public Blog createBlog String name throws HibernateException Blog blog new Blog blog setName name blog setItems new ArrayList Session session _sessions openSession Transaction tx null try tx session beginTransaction session persist blog 306 C digo Hibernate Ex commit O catch HibernateException he if tx null tx rollback throw he finally session close return blog public BlogItem createBlogItem Blog blog String title String text throws HibernateException BlogItem item new BlogItem item setTitle title item setText text
312. o MeuSQL select cat from Cat cat join cat kittens kitten group by cat id cat name cat other cat properties having avg kitten weight 100 order by count kitten asc sum kitten weight desc Note que nem a cl usula group by OU order by podem conter express es aritm ticas O Hibernate tamb m n o expande atualmente uma entidade agrupada portanto voc n o pode escrever group by cat caso todas as propriedades do cat n o estiverem agregadas Voc precisa listar claramente todas as propriedades n o agregadas 15 13 Subconsultas Para bancos de dados que suportam subsele es o Hibernate suporta subconsultas dentro de consultas Uma subconsulta precisa estar entre par nteses normalmente uma chamada de fun o agregada SQL Mesmo subconsultas co relacionadas subconsultas que fazem refer ncia alias de outras consultas s o aceitas 228 Exemplos de HQL from Cat as fatcat where fatcat weight aN select avg cat weight from DomesticCat cat from DomesticCat as cat where cat name some select name nickName from Name as name from Cat as cat where not exists from Cat as mate where mate mate cat from DomesticCat as cat where cat name not in select name nickName from Name as name select cat id select max kit weight from cat kitten kit from Cat as cat Note que HQL subconsultas podem aparecer apenas dentro de cl usulas select ou where Note that subqueries can also utilize row v
313. o do contexto atual feito pelo Hibernate pode significativamente simplificar este projeto como tudo que voc necessita do acesso a uM SessionFactory A manipula o de exce o discutida mais tarde neste cap tulo Note que voc deve selecionar org hibernate transaction JDBCTransactionFactory que o padr o e para o segundo exemplo thread como seu hibernate current session context class 12 2 2 Usando JTA Se sua camada de persist ncia funcionar em um servidor de aplica o por exemplo dentro dos beans de sess o EJB cada conex o da fonte de dados obtida pelo Hibernate automaticamente far parte da transa o global de JTA Voc pode tamb m instalar uma implementa o 193 Cap tulo 12 Transa es e Con standalone de JTA e us la sem EJB O Hibernate oferece duas estrat gias para a integra o de JTA Se voc usar transa es de bean gerenciado BMT o Hibernate dir ao servidor de aplica o para come ar e para terminar uma transa o de BMT se voc usar a Transaction API Assim o c digo de ger ncia de transa o id ntico ao ambiente n o gerenciado BMT idiom Session sess factory openSession Transaction tx null try tx sess beginTransaction do some work Ex comnit catch RuntimeException e TE ts null tz rollback I throw e or display error message finally sess close Se voc quiser usar uma session limitada por
314. o mapeamento muitos para muitos do Hibernate lt class name Person table PERSON gt lt id name id column PERSON ID gt lt generator class native gt ES Mio ba lt property name age gt lt property name firstname gt lt property name lastname gt lt set name events table PERSON_EVENT gt lt key column PERSON_ID gt lt many to many column EVENT ID class Event gt lt set gt lt class gt O Hibernate suporta todo tipo de mapeamento de cole o sendo um set mais comum Para uma associa o muitos para muitos ou relacionamento de entidade n m necess ria uma tabela de associa o Cada linha nessa tabela representa um link entre uma pessoa e um evento O nome da tabela configurado com a fun o table do elemento set O nome da coluna identificadora na associa o pelo lado da pessoa definido com o elemento key o nome da coluna pelo lado dos eventos definido com a fun o column do many to many Voc tamb m precisa dizer para o Hibernate a classe dos objetos na sua cole o a classe do outro lado das cole es de refer ncia O esquema de mapeamento para o banco de dados est a seguir EVENTS PERSON EVENT PERSON EVENT ID EVENT ID 16 Trabalhando a associa o EVENT DATE PERSON ID lt gt PERSON_ID MET EEE AGE EE FIRSTNAME LASTNAME 1 2 3 Trabalhando a associa
315. o para par metros nomeados ou de estilo JDBC 2 Ao contr rio do JDBC o Hibernate numera par metros a partir de zero Par metros nomeados s o identificadores da forma name na faixa de consulta As vantagens de par metros nomeados s o Par metros nomeados s o insens veis ordem que eles ocorrem na faixa de consulta eles podem ocorrer em tempos m ltiplos na mesma consulta eles s o auto document veis named parameter preferred Query q sess createQuery from DomesticCat cat where cat name name q setstring name Fritz Iterator cats q iterate positional parameter Query q sess createQuery from DomesticCat cat where cat name g setString 0 IZi 164 Executando consultas Iterator cats q iterate named parameter list List names new ArrayList names add Izi names add Fritz Query q sess createQuery from DomesticCat cat where cat name in namesList q setParameterList namesList names List cars q list 10 4 1 5 Pagina o Se voc precisar especificar v nculos do conjunto de resultados o maximo de n meros por linha que quiser recuperar e ou a primeira linha que quiser recuperar voc deve usar m todos de interface Consulta Query q sess createQuery from DomesticCat cat q setFirstResult 20 q setMaxResults 10 List cats g listy O Hibernate sabe como traduzir esta consulta de limite para a SQL na
316. oc fa a em uma cole o da entidade deste objeto Bem isso n o de grande utilidade na nossa situa o atual por m um importante conceito que voc pode criar em seu pr prio aplicativo No momento complete este exerc cio adicionando uma a o ao m todo principal da classe EventManager e chame o pela linha de comando Se voc precisar dos identificadores de uma pessoa ou evento o m todo save retornar estes identificadores voc poder modificar alguns dos m todos anteriores para retornar aquele identificador else if args 0 equals addpersontoevent Long eventId mgr createAndStoreEvent My Event new Date Long personld mgr createAndStorePerson Foo Bar mgr addPersonToEvent personId eventId System out printin Added person personId to event eventId Este foi um exemplo de uma associa o entre duas classes igualmente importantes duas entidades Como mencionado anteriormente h outras classes e tipos dentro de um modelo t pico geralmente menos importante Alguns voc j viu como um int ou uma String N s chamamos essas classes de tipos de valores e suas inst ncias dependem de uma entidade particular As inst ncias desses tipos n o possuem sua pr pria identidade nem s o compartilhados entre entidades Duas pessoas n o referenciam o mesmo objeto firstname mesmo se elas tiverem o mesmo objeto firstname Naturalmente os tipos de valores n o s o apenas encont
317. ocessada e terminar a transa o antes que a resposta seja enviada ao cliente Voc pode fazer onde quiser solu es comuns s o ServletFilter interceptador AOP com um pointcut ponto de corte nos m todos de servi o ou em um recipiente de proxy intercepta o Um recipiente de EJB uma maneira padronizada de implementar aspectos cross cutting tais como a demarca o da transa o em beans de sess o EJB declarativamente com CMT Se voc se decidir usar demarca o program tica de transa o d prefer ncia API Transaction do Hibernate mostrada mais adiante neste cap tulo para facilidade no uso e portabilidade de c digo Your application code can access a current session to process the request by calling sessionFactory getCurrentSession You will always get a Session scoped to the current database transaction This has to be configured for either resource local or JTA environments see Se o 2 5 Sess es Contextuais s vezes conveniente estender o escopo de uma session e de uma transa o do banco de dados at que a vis o esteja renderizada especialmente til em aplica es servlet que 188 Longas conversa es utilizam uma fase de renderiza o separada depois da requisi o ter sido processada Estender a transa o at que a renderiza o da vis o esteja completa f cil de fazer se voc implementar seu pr prio interceptador Entretanto n o ser f cil se voc confiar e
318. oi associado a uma nova sess o utilizando update isto significa que o Hibernate ir executar uma instru o SQL de sELEcT adicional para determinar se um UPDATE necess rio nesse momento polymorphism opcional padr o para implicit Determina se deve ser utilizado a consulta polim rfica impl cita ou explicitamente where opicional Especifica um comando SQL wHERE arbitr rio para ser usado quando da recupera o de objetos desta classe persister opcional Especifica uma classPersister customizada 11 Capitulo 5 Mapeamento O R Basico batch size opcional valor padr o 1 Especifica um tamanho de lote para a recupera o de inst ncias desta classe pela identifica o optimistic lock opcional valor padr o version Determina a estrat gia de bloqueio Ho e lazy opcional A recupera o lazy pode ser completamente desabilitada ajustando lazy false entity name optional defaults to the class name Hibernate3 allows a class to be mapped multiple times potentially to different tables It also allows entity mappings that are represented by Maps or XML at the Java level In these cases you should provide an explicit arbitrary name for the entity See Se o 4 4 Modelos din micos and Cap tulo 19 Mapeamento XML for more information check opcional Uma express o SQL utilizada para gerar uma restri o de verifica o de m ltiplas linhas para a
319. ole o usando inverse true Devemos usar o seguinte mapeamento lt class name Parent gt lt id name id column parent_id gt lt map name children gt lt key column parent id 124 Associa es Tern rias not null true gt lt map key column name type string gt lt one to many class Child gt lt map gt lt class gt lt class name Child gt lt id name id column child_id gt lt many to one name parent class Parent column parent_id insert false update false not null true gt lt class Veja que neste mapeamento o lado de cole o v lida da associa o respons vel pela atualiza o da chave exterior 6 3 4 Associa es Tern rias H tr s meios poss veis de se mapear uma associa o tern ria Uma usar um Map com uma associa o como seu indice lt map name contracts gt lt key column employer_id not null true gt lt map key many to many column employee_id class Employee gt lt one to many class Contract gt lt map gt lt map name connections gt lt key column incoming_node_id gt lt map key many to many column outgoing node id class Node gt lt many to many column connection id class Connection gt lt map gt A segunda maneira simplesmente remodelar a associa o das classes da entidade Esta a abordagem que utilizamos com mais frequ ncia Uma alternativa final us
320. oluna utilizar ao inv s de usar a sint xe para deixar o Hibernate injetar seus pr prios aliases Por exemplo lt sql query name mySqlQuery gt lt return alias person class eg Person gt lt return property name name column myName gt lt return property name age column myAge gt lt return property name sex column mySex gt lt return gt SELECT person NAME AS myName person AGE AS myAge person SEX AS mySex FROM PERSON person WHERE person NAME LIKE name lt sql query gt lt return property gt tamb m funciona com colunas m ltiplas Isto resolve a limita o com a sint xe que n o pode permitir controle granulado fino de muitas propriedades de colunas m ltiplas lt sql query name organizationCurrentEmployments gt lt return alias emp class Employment gt lt return property name salary gt lt return column name VALUE gt lt return column name CURRENCY gt lt return property gt lt return property name endDate column myEndDate gt lt return gt SELECT EMPLOYEE AS emp employee EMPLOYER AS emp employer STARTDATE AS emp startDate ENDDATE AS emp endDate REGIONCODE as emp regionCode EID AS emp id VALUE CURRENCY FROM EMPLOYMENT WHERE EMPLOYER id AND ENDDATE IS NULL ORDER BY STARTDATE ASC lt sql query gt Observe que neste exemplo n s usamos lt return property gt combinado sintaxe para inje o Permite que os usu rios escolham como ele
321. omo j discutido anteriormente o mapeamento objeto relacional autom tico e transparente adquirido com a ger ncia do estado do objeto Com isto o estado daquele objeto fica dispon vel na mem ria Isto significa que a manipula o de dados usando as instru es SQL Data Manipulation Language SQL style DML INSERT UPDATE DELETE diretamente no banco de dados n o ir afetar o estado registrado em mem ria Entretanto o Hibernate prov m todos para executar instru es de volume de SQL style DML que s o totalmente executados com HQL Hibernate Query Language Linguagem de Consulta Hibernate HQL A pseudo sintaxe para instru es UPDATE DELETE Algumas observa es UPDATE DELETE FROM EntityName WHERE where conditions Alguns pontos a serem destacados Na cl usula from a palavra chave FROM opcional Somente uma entidade pode ser cnamada na cl usula from Isto pode opcionalmente ser um alias Se o nome da entidade for um alias ent o qualquer refer ncia de propriedade deve ser qualificada usando esse alias Caso o nome da entidade n o for um alias ent o ser ilegal qualquer das refer ncias de propriedade serem qualificadas 211 Capitulo 14 Batch processing Nenhum joins tanto impl cito ou expl cito pode ser especificado em uma consulta de volume HQL As Sub consultas podem ser utilizadas na cl usula on
322. onjunto de resultado Isto feito usando o tipo sys REFCURSOR no Oracle 9 ou 10 No Oracle necess rio definir o tipo de REF cursor veja a documenta o do Oracle Para servidores Sybase ou MS SQL aplicam se as seguintes regras O procedimento deve retornar um conjunto de resultados Observe que como este servidor pode retornar m ltiplos conjuntos de resultados e contas atualizadas o Hibernate ir inteirar os resultados e pegar o primeiro resultado o qual o valor de retorno do conjunto de resultados O resto ser descartado e Se voc habilitar SET NOCOUNT ON no seu procedimento ele provavelmente ser mais eficiente Mas isto n o obrigat rio 17 3 SQL padronizado para criar atualizar e deletar Hibernate3 can use custom SQL for create update and delete operations The SQL can be overridden at the statement level or inidividual column level This section describes statement overrides For columns see Se o 5 7 Coluna de express es de grava o e leitura A persist ncia de classe e cole o no Hibernate j cont m um conjunto de strings gerados por tempo de configura o insertsql deletesql updatesq etc O mapeamento das tags lt sql insert gt lt sql delete gt lt sql update gt sobrescreve essas strings lt class name Person gt lt id name id gt 252 SQL padronizado para criar atualizar e deletar lt generator class increment gt lt id gt lt pro
323. onsiderados singletons Isto significa que eles s o compartilhados entre as requisi es e assim sendo n o devem salvar nenhum estado das vari veis instanciadas Um listener personalizado deve implementar a interface referente ao evento a ser processado e ou deve estender a classes base equivalentes ou mesmo os listeners padr es usados pelo Hibernate eles n o s o declarados como finais com esse objetivo O listener personalizado pode ser registrado programaticamente no objeto configuration ou declarativamente no XML de configura o do Hibernate especificado A configura o declarativa atrav s do arquivo de propriedades n o suportado Aqui temos um exemplo de como carregar um listener personalizado public class MyLoadListener implements LoadEventListener this is the single method defined by the LoadEventListener interface public void onLoad LoadEvent event LoadEventListener LoadType loadType throws HibernateException if MySecurity isAuthorized event getEntityClassName event getEntityId throw MySecurityException Unauthorized access 205 Capitulo 13 Interceptadores Voc tamb m precisa adicionar uma entrada no XML de configura o do Hibernate para registrar declarativamente qual listener deve se utilizado em conjunto com o listener padr o lt hibernate configuration gt lt session factory gt lt event type load gt lt listener class com eg MyLoadListener gt lt li
324. onsultas o padr o 10 10 5 273 Capitulo 20 Aumentando o des Voc tamb m pode habilitar busca em lote de uma cole o Por exemplo se cada Person tem uma cole o pregui osa de cats e 10 persons est o j carregadas em uma session ser o gerados 10 SELECTS ao se interar todas as persons um para cada chamada de getcats Se voc habilitar busca em lote para a cole o de cats no mapeamento da classe Person O Hibernate pode fazer uma pr carga das cole es lt class name Person gt lt set name cats batch size 3 gt lt set gt lt class gt Com um bat ch size de 3 o Hibernate ir carregar 3 3 3 1 cole es em 4 sELEcTS Novamente o valor da fun o depende do n mero esperado de cole es n o inicializadas em determinada Session A busca em lote de cole es particularmente til quando voc tem uma rvore encadeada de tens ex o t pico padr o bill of materials Se bem que um conjunto encadeado ou caminho materializado pode ser uma op o melhor para rvores com mais leitura 20 1 6 Usando busca de subsele o Se uma cole o ou proxy simples precisa ser recuperado o Hibernate carrega todos eles rodando novamente a consulta original em uma subsele o Isso funciona da mesma maneira que busca em lote sem carregar tanto 20 1 7 Perfis de Busca Outra forma de afetar a estrat gia de busca para o carregamento de objetos associados atrav s
325. opriedades select avg cat weight sum cat weight max cat weight count cat from Cak Cat As fun es agregadas suportadas s o avolesa SUM aee y MIN Ces ap MaR cs a count Count Cass COUNT dArstinct sas ConnEltalls aa Pode se usar operadores aritm ticos concatena o e fun es SQL reconhecidas na cl usula select select cat weight sum kitten weight from Cat cat join cat kittens kitten group by cat id cat weight select firstName initial upper lastName from Person As palavras distinct all podem ser usadas e t m a mesma sem ntica que no SQL 220 Pesquisas Polim rficas select distinct cat name from Cat cat select count distinct cat name count cat from Cat cat 15 8 Pesquisas Polimorficas A consulta from Cat as cat retorna inst ncias n o s de cat mas tamb m de subclasses como Domest icCat As consultas do Hibernate podem nomear qualquer classe Java ou interface na clausula from A consulta retornara instancias de todas as classes persistentes que extendam a determinada classe ou implemente a determinada interface A consulta a seguir poderia retornar todos os objetos persistentes from java lang Object o A interface Named pode ser implementada por varias classes persistentes from Named n Named m where n name m name Note que as duas ltimas consultas requerem mais de um SQL sgLECT Isto significa que a clausula order by nao ordena
326. or uni o externa para associa es um para um e muitos para um cujos quais t m sido mapeados com fetch join See Se o 20 1 Estrat gias de Busca for more information 3 4 3 Fluxos Bin rios Binary Streams O Oracle limita o tamanho de matrizes de byte que podem ser passadas para do driver JDBC Se voc desejar usar grandes inst ncias de tipos binary OU serializable voc deve habilitar hibernate jdbc use streams for binary Essa uma configura o que s pode ser feita em n vel de sistema 3 4 4 Cach de segundo n vel e consulta The properties prefixed by hibernate cache allow you to use a process or cluster scoped second level cache system with Hibernate See the Se o 20 2 O Cach de Segundo Nivel for more information 3 4 5 Substitui o na Linguagem de Consulta Voc pode definir novos s mbolos de consulta Hibernate usando hibernate query substitutions Por exemplo hibernate query substitutions true 1 false 0 Isto faria com que os s mbolos true e false passasem a ser traduzidos para literais inteiros no SQL gerado hibernate query substitutions toLowercase LOWER Isto permitir que voc renomeie a fun o LOWER no SQL 3 4 6 Estat sticas do Hibernate Se voc habilitar hibernate generate statistics 0 Hibernate exibir um numero de m tricas bastante til ao ajustar um sistema via sessionFactory getStatistics O Hibernate pode at ser configurado para exibir essa
327. ora vamos continuar e adicionar algumas associa es de classe Primeiro iremos adicionar pessoas nossa aplica o e armazenar os eventos em que elas participam 1 2 1 Mapeando a classe Person O primeira parte da classe Person parece se com isto package org hibernate tutorial domain public class Person private Long id private int age private String firstname private String lastname public Person Accessor methods for all properties private setter for eae 14 Uma associa o unidirecional baseada em Configura o Salve isto ao arquivo nomeado src main java org hibernate tutorial domain Person java Ap s isto crie um novo arquivo de mapeamento como src main resources org hibernate tutorial domain Person hbm xml lt hibernate mapping package org hibernate tutorial domain gt lt class name Person table PERSON gt lt id name id column PERSON_ID gt lt generator class native gt lt id gt lt property name age gt lt property name firstname gt lt property name lastname gt lt class gt lt hibernate mapping 5 Finalmente adicione o novo mapeamento configura o do Hibernate lt mapping resource events Event hbm xml gt lt mapping resource events Person hbm xml gt Crie agora uma associa o entre estas duas entidades As pessoas Person podem participar de eventos e eventos possuem participantes As quest es de desig
328. ores compostos tamb m s o permitidos Leia abaixo para maiores informa es Os tipos de valores b sicos t m suas constantes Type correspondentes definidas em org hibernate Hibernate Por exemplo Hibernate STRING representa o tipo string 5 2 3 Tipos de valores personalizados relativamente f cil para desenvolvedores criarem seus pr prios tipos de valores Por exemplo voc pode querer persistir propriedades do tipo java lang BigInteger para colunas VARCHAR O Hibernate n o fornece um tipo correspondente para isso Mas os tipos adaptados n o s o limitados a mapeamento de uma propriedade ou elemento de cole o a uma nica coluna da tabela Assim por exemplo voc pode ter uma propriedade Java get Name setName do tipo java lang String que persistido para colunas FIRST NAME INITIAL SURNAME Para implementar um tipo personalizado implemente org hibernate UserType OU org hibernate CompositeUserType e declare propriedades usando o nome qualificado da classe do tipo Veja org hibernate test DoubleStringType para outras funcionalidades lt property name twoStrings type org hibernate test DoubleStringType gt lt column name first string gt lt column name second string gt lt property gt Observe o uso da tag lt column gt para mapear uma propriedade para colunas m ltiplas As interfaces CompositeUserType EnhancedUserType UserCollectionType e UserVersionType fornecem suporte p
329. os armazenados para todas as opera es de criar atualizar deletar e carregar 17 1 Usando um sotouery A execu o de consultas SQL nativa controlada atrav s da interface soLquery que obtido chamando a session createSQLQuery AS se es abaixo descrevem como usar este API para consultas 17 1 1 Consultas Escalares A consulta SQL mais b sica obter uma lista dos escalares valores sess createSQLQuery SELECT FROM CATS list sess createSQLQuery SELECT ID NAME BIRTHDATE FROM CATS list Eles ir o retornar uma matriz de Lista de Objeto Object com valores escalares para cada coluna na tabela CATS O Hibernate usar o ResultSetMetadata para deduzir a ordem atual e tipos de valores escalares retornados Para evitar o uso do ResultSetMetadata OU simplesmente para ser mais expl cito em o qu retornado voc poder usar 0 addScalar sess createSOLQuery SELECT FROM CATS addScalar ID Hibernate LONG addScalar NAME Hibernate STRING addScalar BIRTHDATE Hibernate DATE Esta consulta especificou A string da consulta SQL as colunas e tipos para retornar Este ainda ir retornar as matrizes de Objeto mas desta vez ele n o usar O ResultSetMetdata ao inv s disso obter explicitamente a coluna de ID NOME e DATA DE NASCIMENTO como 243 Capitulo 17 SQL Nativo respectivamente uma Longa String e Curta a partir do conjunto de resultados adjacentes I
330. os JDBC org hibernate tool hbmidegistra todas as instru es SQL DDL a medida que elas s o executadas org hibernate pretty Registra o estado de todas as entidades maximo 20 entidades associadas sess o no momento da libera o flush org hibernate cache Registra todas as atividades de cach de segundo n vel org hibernate transact Registra atividades relacionada transa o org hibernate jdbc Registra todas as requisi es de recursos JDBC org hibernate hql ast Aegistra instru es SQL e HQL durante a an lise da consultas org hibernate secure Registra todas as requisi es de autoriza o JAAS org hibernate Registra tudo Apesar de ter muita informa o muito til para o problema de inicializa o Ao desenvolver aplica es com Hibernate voc deve quase sempre trabalhar com o depurador debug habilitado para a categoria org hibernate soL ou alternativamente com a propriedade hibernate show sql habilitada 3 6 Implementando UM namingst rategy A interface org nibernate cfg NamingStrategy permite que voc especifique um padr o de nomea o para objetos do banco de dados e elementos de esquema 48 Arquivo de configura o XML Voc deve criar regras para a gera o automaticamente de identificadores do banco de dados a partir de identificadores Java ou para processar colunas l gicas e nomes de tabelas dado o arquivo de mapeamento para nomes f sicos de tabelas e col
331. ou elemento XML que contenha a propriedade ou os dados da entidade O formato da fun o node deve ser o seguinte element name mapeia para o elemento XML nomeado Gattribute name mapeia para a fun o XML com determinado nome e mapeia para o elemento pai element name Gattribute name mapeia para a fun o nomeada com o elemento nomeado 262 Mapeando metadados com XML Para cole es e associa es de valores simples existe uma fun o adicional embed xm1 Se a fun o embed xml t rue que o valor padr o a rvore XML para a entidade associada ou cole o de determinado tipo de valor ser embutida diretamente na rvore XML que cont m a associa o Por outro lado se embed xml false ent o apenas o valor do identificador referenciado ir aparecer no XML para associa es simples e as cole es simplesmente n o ir o aparecer Voc precisa tomar cuidado para n o deixar 0 embed xmi t rue para muitas associa es pois o XML n o suporta bem refer ncias circulares lt class name Customer table CUSTOMER node customer gt lt id name id column CUST ID node id gt lt map name accounts node embed xml true gt lt key column CUSTOMER ID not null true gt lt map key column SHORT_DESC node short desc type string gt lt one to many entity name Account embed xml false node account gt lt map gt lt component name
332. p o de configura o ou redirecionado para um arquivo com ajuda do SchemaExport na tarefa do Ant Finalmente iremos adicionar os arquivos das classes de persist ncia mapeadas na configura o Capitulo 1 Tutorial Salve este arquivo como hibernate cfg xm1 no diret rio src main resources 1 1 5 Construindo com o Maven N s iremos construir agora o tutorial com Maven Voc necessitar que o Maven esteja instalado ele est dispon vel a partir do Maven download page http maven apache org download html O Maven gravar o arquivo pom xm1 que criamos anteriormente al m de saber como executar algumas tarefas do projeto b sico Primeiro vamos rodar o objetivo compile para nos certificarmos de que tudo foi compilado at agora hibernateTutorial mvn compile HO OCA nga rOn PrO ECE Sme NFO R NFO Building First Hibernate Tutorial FO task segment compile NFO R FO resources resources NFO Using default encoding to copy filtered resources FO compiler compile NFO Compiling 1 source file to home steve projects sandbox hibernateTutorial target classes FO 2222222222 FO BUILD SUCCESSFUL NFO R FO Total time 2 seconds NFO Finished at Tue Jun 09 12 25 25 CDT 2009 FO Final Memory 5M 547M NFO 1 1 6 Inicializagao e Auxiliares hora de carregar e armazenar alguns objetos Event mas primeiro
333. pacta como select cat mate from Cat cat As consultas podem retornar propriedades de qualquer tipo de valor incluindo propriedades de tipo de componente select cat name from DomesticCat cat where cat name like fri select cust name firstName from Customer as cust As consultas podem retornar multiplos objetos e ou propriedades como uma matriz do tipo Object select mother offspr mate name from DomesticCat as mother inner join mother mate as mate left outer join mother kittens as offspr Ou como um List select new list mother offspr mate name from DomesticCat as mother inner join mother mate as mate left outer join mother kittens as offspr Ou considerando que a classe Family tenha um construtor apropriado como um objeto Java typesafe atual 219 Capitulo 15 HQL A Linguagem select new Family mother mate offspr from DomesticCat as mother join mother mate as mate left join mother kittens as offspr Pode se designar alias express es selecionadas usando as select max bodyWeight as max min bodyWeight as min count as n from Cor pat Isto bem mais til quando usado junto comselecione novo mapa select new map max bodyWeight as max min bodyWeight as min count as n from Cat cat Esta consulta retorna um Mapa de refer ncias para valores selecionados 15 7 Fun es de agrega o As consultas HQL podem retornar o resultado de fun es agregadas nas pr
334. pear pode ser usado simplesmente para mapear o XML 19 1 1 Especificando o mapeamento de uma classe e de um arquivo XML simultaneamente Segue um exemplo de como mapear um POJO e um XML ao mesmo tempo lt class name Account table ACCOUNTS node account gt lt id name accountId column ACCOUNT ID node id gt lt many to one name customer column CUSTOMER ID node customer id embed xml false gt lt property name balance column BALANCE node balance gt 261 Capitulo 19 Mapeamento XML lt class gt 19 1 2 Especificando somente um mapeamento XML Segue um exemplo que nao cont m uma classe POJO lt class entity name Account table ACCOUNTS node account gt lt id name id column ACCOUNT_ID node id type string gt lt many to one name customerId column CUSTOMER_ID node customer id embed xml false entity name Customer gt lt property name balance column BALANCE node balance type big_decimal gt lt class gt Esse mapeamento permite que voc acesse os dados como uma arvore dom4j ou um grafico de pares de nome valor de propriedade ou Maps do Java Os nomes de propriedades s o somente constru es l gicas que podem ser referenciadas em consultas HQL 19 2 Mapeando metadados com XML Muitos elementos do mapeamento do Hibernate aceitam a fun o node Atrav s dele voc pode especificar o nome de uma fun o
335. pelo seu nome qualificado completo binary Mapeia matrizes de bytes para um tipo bin rio de SQL apropriado text Mapeia strings de Java longos para um tipo SQL CLOB ou TEXT serializable Mapeia tipos Java serializ veis para um tipo bin rio SQL apropriado Voc pode tamb m indicar o tipo serializable do Hibernate com o nome da classe ou interface Java serializ vel que n o padr o para um tipo b sico 103 Capitulo 5 Mapeamento O R Basico clob blob Tipos de mapeamentos para as classes JDBC java sql Clob and java sql Blob Estes tipos podem ser inconvenientes para algumas aplica es visto que o objeto blob ou clob nao pode ser reusado fora de uma transa o Al m disso o suporte de driver imcompleto e inconsistente imm date imm time imm timestamp imm calendar imm calendar date imm serializable imm binary Mapeamento de tipos para os geralmente considerados tipos mut veis de Java Isto onde o Hibernate faz determinadas otimiza es apropriadas somente para tipos imut veis de Java e a aplica o trata o objeto como imut vel Por exemplo voc n o deve chamar Date setTime para uma inst ncia mapeada como imm timestamp Para mudar o valor da propriedade e ter a mudan a feita persistente a aplica o deve atribuir um novo objeto nonidentical propriedade Identificadores nicos das entidades e cole es podem ser de qualquer tipo b sico exceto binary blob OU clob Identificad
336. perty name name not null true gt lt sql insert gt INSERT INTO PERSON NAME ID VALUES UPPER lt sql insert gt lt sql update gt UPDATE PERSON SET NAME UPPER WHERE ID lt sql update gt lt sql delete gt DELETE FROM PERSON WHERE ID lt sql delete gt lt class gt O SQL executado diretamente no seu banco de dados ent o voc pode usar qualquer linguagem que quiser Isto com certeza reduzir a portabilidade do seu mapeamento se voc utilizar um SQL para um banco de dados espec fico Os procedimentos armazenados s o suportados se a fun o callable estiver ativada lt class name Person gt lt id name id gt lt generator class increment gt lt id gt lt property name name not null true gt lt sql insert callable true gt call createPerson lt sql insert gt lt sql delete callable true gt call deletePerson lt sql delete gt lt sql update callable true gt call updatePerson lt sql update gt lt class gt A ordem de posi es dos par metros s o vitais pois eles devem estar na mesma sequ ncia esperada pelo Hibernate Voc pode ver a ordem esperada ativando o debug logging no n vel org hibernate persister entity Com este n vel ativado o Hibernate ir imprimir o SQL est tico que foi usado para criar atualizar deletar etc entidades Para ver a sequ ncia esperada lembre se de n o incluir seu SQL padronizado no arquivo d
337. pos de cole es com maior desempenho n o inverso com conjuntos que nao ficam atr s Espera se que os conjuntos sejam um tipo mais comum de cole o nas aplica es Hibernate Isto porque as sem nticas conjunto s o mais naturais em modelos relacionais No entanto em modelos de dom nio de Hibernate bem criados geralmente vemos que a maioria das cole es s o de fato associa es um para muitos com inverse true Para estas associa es a atualiza o manipulada pelo lado muitos para um de uma associa o e portanto considera es de desempenho de atualiza o de cole o simplesmente n o se aplicam a este caso 20 5 3 As Bags e listas s o as cole es de invers o mais eficientes Existe um caso em particular no qual as bags e tamb m as listas possuem um desempenho muito maior do que conjuntos Para uma cole o com inverse true O idioma de relacionamento um para um bidirecional padr o por exemplo podemos adicionar elementos a uma bag ou uma lista sem precisar inicializar buscar os elementos da bag Isto acontece porque a Collection add OU Collection addAll deve sempre retornar verdadeira para uma bag ou List Isto pode fazer que o c digo comum seguinte seja muito mais r pido Parent p Parent sess load Parent class id Child c new Child c setParent p 284 Deletar uma vez p getChildren add c no need to fetch the collection sess flush 20 5 4 Deletar uma vez
338. priedade mapeada com lt any gt from AuditLog log Payment payment where log item class Payment and log item id payment id Veja que log item class payment class podem referir se valores de colunas de banco de dados completamente diferentes na consulta acima 15 10 Express es As express es permitidas na cl usula where incluem o seguinte operadores matem ticos operadores de compara o bin rios gt lt lt gt like operadores l gicos and or not e Par nteses que indica o agrupamento e in not in between is null is not null is empty is not empty member of and not member of Case simples case when then else end and searched case case when waa then ses Else ese end 223 Capitulo 15 HQL A Linguagem concatena o de string OUconcat current_date current_time current_timestamp second minute hour day month year qualquer fun o ou operador definidos pela EJB QL 3 0 substring trim lower upper length locate abs sqrt bit_length mod e coalesce and nullif str para converter valores num ricos ou temporais para uma string de leitura e cast as onde o segundo argumento o nome do tipo hibernate eextract from se ANSI cast extract suportado pelo banco de dados adjacente e A fun o HQL in
339. quando voc configura a f brica de transa o do Hibernate Lembre se tamb m de configurar O hibernate transaction manager lookup class Al m disso certifique se que Seu hibernate current session context class OU n o configurado compatibilidade com o legado ou est definido para jta A opera o getCurrentSession tem um aspecto negativo em um ambiente JTA H uma advert ncia para o uso do m todo liberado de conex o after statement O qual usado ent o por padr o Devido a uma limita o simples da especifica o JTA n o poss vel para o Hibernate automaticamente limpar quaisquer inst ncias scrollableResults OU Iterator abertas retornadas pelo scroll OU iterate Voc deve liberar o cursor subjacente da base de dados chamando scrollableResults close OU Hibernate close Iterator explicitamente de um bloco finally Claro que a maioria das aplica es podem facilmente evitar o uso do scroll ou do iterate em todo c digo provindo do JTA ou do CMT 12 2 3 Tratamento de Exce o Se a Session levantar uma exce o incluindo qualquer soLException voc dever imediatamente dar um rollback na transa o do banco chamando session close e descartando a inst ncia da session Certos m todos da sessionn o deixar o a sess o em um estado inconsistente Nenhuma exce o lan ada pelo Hibernate pode ser recuperada Certifique se que a Session ser fechada chamando close no bloco finally A exce o
340. r Tabela 21 5 schemavalidator Op es de Linha de Comando Op o Descri o naming eg MyNamingStrategy seleciona um NamingStrategy 295 Capitulo 21 Guia de Toolset Op o Descri o leia propriedades de banco de dados a partir dos properties hibernate properties arquivos config hibernate cfg xml especifique um arquivo cfg xml Voc pode incorporar O SchemaValidator em sua aplica o Configuration ctg new SchemaValidator cfg validate 21 1 8 Utilizando Ant para valida o de esquema Voc pode chamar 0 SchemaValidator a partir do script Ant lt target name schemavalidate gt lt taskdef name schemavalidator classname org hibernate tool hbm2ddl SchemaValidatorTask classpathref class path gt lt schemavalidator properties hibernate properties gt lt fileset dir src gt lt include name hbm xml gt lt fileset gt lt schemavalidator gt lt target gt 296 Exemplo Pai Filho Uma das primeiras coisas que um usuario tenta fazer com o Hibernate modelar um tipo de relacionamento Pai Filho Existem duas abordagens diferentes para isto Por diversas raz es diferentes a abordagem mais conveniente especialmente para novos usu rios modelar ambos OS Parent Child como classes de entidade com uma associa o lt one to many gt a partir do Parent para O Child A abordagem alternativa declarar 0 child como um lt compo
341. r encontrar informa o sobre a rela o entre as duas entidades Isso ser muito mais f cil de entender quando voc analisar como a rela o bidirecional entre as entidades criada 1 2 6 Trabalhando com links bidirecionais Primeiro tenha em mente que o Hibernate n o afeta a sem ntica normal do Java Como foi que criamos um link entre uma Person e um Event no exemplo unidirecional Adicionamos uma inst ncia de Event da cole o de refer ncias de eventos uma inst ncia de Person Ent o obviamente se quisermos que este link funcione bidirecionalmente devemos fazer a mesma coisa para o outro lado adicionando uma refer ncia de person na cole o de um Event Essa configura o de link de ambos os lados absolutamente necess ria e voc nunca deve esquecer de faz la Muitos desenvolvedores programam de maneira defensiva e criam m todos de gerenciamento de um link que ajustam se corretamente em ambos os lados como por exemplo em Person protected Set getEvents return events protected void setEvents Set events this events events public void addToEvent Event event this getEvents add event event getParticipants add this public void removeFromEvent Event event this getEvents remove event event getParticipants remove this Observe que os m todos set e get da cole o est o protegidos Isso permite que classes e subclasses do mesmo pacote continuem a
342. r o para o tipo de propriedade determinado pela reflex o O nome da classe associada cascade opcional Especifica qual opera o deve ser cascateada do objeto pai para o objeto associado constrained opcional Especifica que uma restri o de chave exterior na chave prim ria da tabela mapeada referencia a tabela da classe associada Esta op o afeta a ordem em que save delete s o cascateadas e determina se a associa o pode sofrer o proxie Isto tamb m usado pela ferramenta schema export fetch opcional padr o para select Escolhe entre recupera o da uni o exterior ou recupera o sequencial de sele o 89 Capitulo 5 Mapeamento O R Basico 6 property ref opcional O nome da propriedade da classe associada que ligada chave prim ria desta classe Se n o for especificada a chave prim ria da classe associada utilizada access opcional padr o para property estrat gia que o Hiberante deve utilizar para acessar o valor da propriedade formula opcional Quase todas associa es um pra um mapeiam para a chave prim ria da entidade dona Caso este n o seja o caso voc pode especificar uma outra coluna colunas ou express es para unir utilizando uma f rmula SQL Veja org hibernate test onetooneformula para exemplo lazy opcional valor padr o proxy Por padr o as associa es de ponto nico est o em proxy lazy no proxy especifica que a propriedade
343. ra muitos para Dog sess createSQLQuery SELECT ID NAME BIRTHDATE D ID D NAME CAT ID FROM CATS c DOGS d WHERE Cy Dy se CAT TRT addEntity cat Cat class addJoin cat dogs Neste est gio estamos chegando no limite do que poss vel fazer com as consultas nativas sem come ar a destacar as colunas sql para torn las til no Hibernate Os problemas come am a surgir quando se retorna entidades m ltiplas do mesmo tipo ou quando o padr o de nomes de alias coluna n o s o suficientes 17 1 4 Retorno de entidades m ltiplas At aqui os nomes de colunas do conjunto de resultados s o considerados como sendo os mesmos que os nomes de colunas especificados no documento de mapeamento Isto pode ser problem tico para as consultas SQL que une tabelas m ltiplas uma vez que os mesmos nomes de colunas podem aparecer em mais de uma tabela necess rio uma inje o de alias de coluna na seguinte consulta a qual bem prov vel que falhe sess createSQLQuery SELECT c m FROM CATS c CATS m WHERE c MOTHER ID c ID addEntity cat Cat class addEntity mother Cat class A inten o para esta consulta retornar duas inst ncias Cat por linha um cat e sua m e Isto ir falhar pois existe um conflito de nomes s o mapeados aos mesmos nomes de colunas e em alguns bancos de dados os aliases de colunas retornadas estar o muito provavelmente na forma 245 Capitulo 17 SQL Nativo d
344. rados dentro da JDK mas voc pode tamb m criar suas classes como por exemplo Address OU MonetaryAmount De fato no aplicativo Hibernate todas as classes JDK s o consideradas tipos de valores Voc tamb m pode criar uma cole o de tipo de valores Isso conceitualmente muito diferente de uma cole o de refer ncias para outras entidades mas em Java parece ser quase a mesma coisa 18 Cole o de valores 1 2 4 Cole o de valores Vamos adicionar uma cole o de endere os de e mail entidade Person Isto ser representado como um java util set das inst ncias java lang String private Set emailAddresses new HashSet public Set getEmailAddresses return emailAddresses public void setEmailAddresses Set emailAddresses this emailAddresses emailAddresses Segue abaixo o mapeamento deste set lt set name emailAddresses table PERSON EMAIL ADDR gt lt key column PERSON_ID gt lt element type string column EMAIL ADDR gt lt set A diferen a comparada com o mapeamento anterior se encontra na parte element que informa ao Hibernate que a cole o n o cont m refer ncias outra entidade mas uma cole o de elementos do tipo string O nome da tag em min sculo indica que se trata de um tipo conversor de mapeamento do Hibernate Mais uma vez a fun o table do elemento set determina o nome da tabela para a cole o O elemento key define o nome da coluna de chave estrange
345. remover uma entidade da cole o n o significa que possa ter sido deletada e n o existe efeito cascata de estado por padr o a partir de uma entidade para outras entidades associadas O Hibernate n o implementa persist ncia por alcance por padr o Para cada opera o b sica da sess o do Hibernate incluindopersistir mesclar salvarOuAtualizar deletar bloquear atualizar despejar replicar existe um estilo cascata correspondente Respectivamente os estilos cascatas s o nomeados criar mesclar salvar atualizar deletar bloquiar atualizar despejar replicar Se desejar uma opera o em cascata junto a associa o voc dever indicar isto no documento de mapeamento Por exemplo 173 Cap tulo 10 Trabalhando com lt one to one name person cascade persist gt Estilo cascata pode ser combinado lt one to one name person cascade persist delete lock gt Voc pode at utilizar cascade al1 para especificar que todas as opera es devem estar em cascata junto associa o O padr o cascade none especifica que nenhuma opera o deve estar em cascata Um estilo especial em cascata delete orphan aplica somente associa es um para um e indica que a opera o delete deve ser aplicada em qualquer objeto filho que seja removido da associa o Recomenda es N o faz sentido habilitar a cascata em uma associa o lt many to one gt OU lt many to many gt
346. rfaces O Hibernate oferece varias op es de interfaces estendidas que voc pode implementar para customizar sua camada persistente Veja a documenta o da API para maiores detalhes Dada uma arquitetura minima o aplicativo passa pelas APIs Transaction TransactionFactory OU ConnectionProvider para se comunicar diretamente com a transa o JTA ou JDBC 31 Capitulo 2 Arquitetura 2 2 Estados de instancia Uma instancia de classes persistentes pode estar em um dos tr s diferentes estados que sao definidos respeitando um contexto persistente O objeto session do Hibernate o contexto persistente Os tr s diferentes estados s o os seguintes transiente A inst ncia n o associada a nenhum contexto persistente N o possui uma identidade persistente ou valor de chave prim ria persistente A inst ncia est atualmente associada a um contexto persistente Possui uma identidade persistente valor de chave prim ria e talvez correspondente a uma fila no banco de dados Para um contexto persistente em particular o Hibernate garante que a identidade persistente equivalente identidade Java na localiza o em mem ria do objeto desanexado A inst ncia foi associada com um contexto persistente por m este contexto foi fechado ou a inst ncia foi serializada por outro processo Possui uma identidade persistente e talvez corresponda a uma fila no banco de dados Para inst ncias desanexadas o Hibernate n o
347. rg hibernate cache 0SCacheProvidemem ria yes disco SwarmCache org hibernate cache SwarmCacheProvdlustered sim ip invalida o multicast em cluster JBoss org hibernate cache TreeCacheProviff r sim sim Cache 1 x multicast replica o solicita o em cluster de sync de transacional rel gio JBoss org hibernate cache jbc JBossCacheffegionFactosim sim Cache 2 multicast invalida o solicita o em cluster ou de sync de transacional replica o rel gio 277 Capitulo 20 Aumentando o des 20 2 1 Mapeamento de Cache O elemento lt cache gt de uma classe ou mapeamento de cole o possui a seguinte forma lt cache usage transactional read write nonstrict read write read only region RegionName 090 include all non lazy gt O uso solicitado especifica a estrat gia de cache transacional leitura escrita leitura escrita n o estrito OU somente leitura region opcional padr o classe ou nome papel da cole o especifica o nome da regi o do cache de segundo n vel include opcional padr o para a11 non lazy especifica que a propriedade da entidade mapeada com 1azy true pode n o estar em cache quando o n vel da fun o busca lazy for habilitada De forma alternativa voc poder especificar os elementos lt class cache gt lt collection cache gt em hibernate cfg xml A fun o uso especifica uma estrat gia de concorr ncia de cache 20 2 2
348. riedades necess rias s o 293 Capitulo 21 Guia de Toolset Tabela 21 3 SchemaExport Connection Properties Nome de Propriedade Descri o hibernate connection driver class classe de driver jdbc hibernate connection url jdbc url hibernate connection username usuario de banco de dados hibernate connection password senha do usuario hibernate dialect dialeto 21 1 4 Usando o Ant Voc pode chamar o Schema lt target name schemaexport gt lt taskdef name schemaexport Export a partir de seu script de constru o do Ant classname org hibernate tool hbm2ddl1 SchemaExportTask classpathref class path gt lt schemaexport properties hibernate properties quiet no text no drop no delimiter output schema export sql gt lt fileset dir src gt lt fileset gt lt schemaexport gt lt target gt lt include name hbm xml gt 21 1 5 Atualiza es de esquema incremental A ferramenta schemaUpdate ir atualizar um esquema existente com mudan as incrementais Observe que SchemaUpdate depende totalmente da API de metadados JDBC portanto n o ir funcionar com todos os driver JDBC java cp hibernate classpaths org nibernate tool hbm2ddl Schemaupdate options mapping files Tabela 21 4 scnemaupaate Op es de Linha de Comando Op o Descri o quiet n o saia do script para stdout text nao exporte o sc
349. rim ria da tabela destino lt many to one name propertyName column column_name o 86 Muitos para um O O O 8 88 class ClassName cascade cascade_style fetch join select update true false insert true false property ref propertyNameFromAssociatedClass access field property ClassName unique true false not null true false optimistic lock true false lazy proxy no proxy false not found ignore exception entity name EntityName 9000906000000060 formula arbitrary SQL expression node element name Gattribute name element fattribute embed xml true false index index name unique key unique key id foreign key foreign key name name O nome da propriedade column opcional O nome da coluna da chave exterior Isto pode tamb m ser especificado atrav s de elementos aninhados lt column gt class opcional padr o para o tipo de propriedade determinado pela reflex o O nome da classe associada cascade opcional Especifica qual opera o deve ser cascateada do objeto pai para o objeto associado fetch opcional padr o para select Escolhe entre recupera o da uni o exterior ou recupera o sequencial de sele o update insert opcional valor padr o true especifica que as colunas mapeadas devem ser inclu das em instru es SQL de UPDATE e ou INSERT Com o ajuste de ambas para false voc permite uma associa o derivada pura cujos va
350. rio test da distribui o do Hibernate 24 4 1 Associa o um para um Typed lt class name Person gt lt id name name gt lt one to one name address cascade all gt lt formula gt name lt formula gt lt formula gt HOME lt formula gt lt one to one gt lt one to one name mailingAddress cascade all gt lt formula gt name lt formula gt lt formula gt MAILING lt formula gt lt one to one gt lt class gt lt class name Address batch size 2 check addressType in MAILING HOME BUSINESS gt lt composite id gt lt key many to one name person column personName gt lt key property name type column addressType gt lt composite id gt lt property name street type text gt lt property name state gt lt property name zip gt folass gt 317 Capitulo 24 Exemplo Varios 24 4 2 Exemplo de chave composta lt class name Customer gt lt id name customerId length 10 gt lt generator class assigned gt ES Mio ba lt property name name not null true length 100 gt lt property name address not null true length 200 gt lt list name orders inverse true cascade save update gt lt key column customerId gt lt index column orderNumber gt lt one to many class Order gt alee gt lt class gt lt class name Order table CustomerOrder lazy true gt lt synchronize table LineItem
351. ript ao banco de dados naming eg MyNamingStrategy seleciona um NamingStrategy 294 Utilizando Ant para atualiza es de esquema incremental Op o Descri o leia propriedades de banco de dados a partir dos properties hibernate properties arquivos config hibernate cfg xml especifique um arquivo cfg xml Voc pode incorporar 0 SchemaUpdate em sua aplica o Configuration ctg new SchemaUpdate cfg execute false 21 1 6 Utilizando Ant para atualiza es de esquema incremental Voc pode chamar SchemaUpdate a partir do script Ant lt target name schemaupdate gt lt taskdef name schemaupdate classname org hibernate tool hbm2ddl SchemaUpdateTask classpathref class path gt lt schemaupdate properties hibernate properties quiet no gt lt fileset dir src gt lt include name hbm xml gt lt fileset gt lt schemaupdate gt lt target gt 21 1 7 Valida o de esquema A ferramenta schemavalidator ir confirmar que o esquema de banco de dados existente combina com seus documentos de mapeamento Observe que 0 SchemaValidator depende totalmente da API de metadados JDBC portanto ele n o funcionar com todos os drivers JDBC Esta ferramenta extremamente til para teste java cp hibernate classpaths org hibernate tool hbm2dd1 SchemaValidator options mapping files A seguinte tabela exibe as op es de linha de comando do schemavalidato
352. rmite especificar o SQL diretamente List cats sess createCriteria Cat class add Restrictions sqlRestriction lower alias name like lower Fritz Hibernate STRING alaise A O par metro alias ser substituido pelo alias da entidade procurada Uma maneira alternativa de obter um crit rio apartir de uma inst ncia Property Voc pode criar uma Property chamando Property forName Property age Property forName age List cats sess createCriteria Cat class add Restrictions disjunction add age isNull add age eq new Integer 0 add age eq new Integer 1 add age eq new Integer 2 ine cadal Property forName name can new String i Eritz TIZ Pk VD ey eg 16 3 Ordenando resultados Voc poder ordenar os resultados usando org hibernate criterion Order List cats sess createCriteria Cat class add Restrictions like name F addOrder Order asc name addOrder Order desc age setMaxResults 50 Selma E List cats sess createCriteria Cat class add Property forName name like FS addOrder Property forName name asc addOrder Property forName age desc setMaxResults 50 TESEO 236 Associa es 16 4 Associa es Atrav s da navega o de associa es usando createCriteria voc pode especificar restri es por entidades relacionadas List cats sess
353. rmula opcional Uma express o SQL arbitr ria que executada quando um tipo tem que ser avaliado Permite discrimina o baseada em conte do Valores atuais de uma coluna discriminada s o especificados pela fun o discriminator value da lt class gt e elementos da lt subclass gt O atributo force til apenas em tabelas contendo linhas com valores discriminadores extras que n o est o mapeados para uma classe persistente Este n o geralmente o caso Usando o atributo formula voc pode declarar uma express o SQL arbitr ria que ser utilizada para avaliar o tipo de uma linha Por exemplo lt discriminator formula case when CLASS TYPE in a b c then 0 else 1 end type integer gt 5 1 9 Versao opcional O elemento lt version gt opcional e indica que a tabela possui dados versionados Isto particularmente til se voc planeja utilizar transa es longas Veja abaixo maiores informa es lt version column version column name propertyName o 82 Timestamp opcional type typename access field property ClassName unsaved value null negative undefined generated never always 9006900 insert true false node element name attribute name element attribute column opcional tem como padr o o nome da propriedade name O nome da coluna mantendo o n mero da vers o name O nome da propriedade da classe persistente type opcional padr
354. ro da JVM N o poss vel obter o endere o MAC ou um endere o de mem ria do c digo Java portanto este o melhor que pode ser feito sem utilizar JNI 5 1 4 4 Colunas de identidade e sequ ncias Para bancos de dados que suportam colunas de identidade DB2 MySQL Sybase MS SQL voc pode utilizar uma gera o de chave identity Para bancos de dados que suportam sequencias DB2 Oracle PostgreSQL Interbase McKoi SAP DB voc pode utilizar a gera o de chaves no estilo sequence As duas estrat gias requerem duas consultas SQL para inserir um novo objeto lt id name id type long column person id gt lt generator class sequence gt lt param name sequence gt person id sequence lt param gt lt generator gt lt fid gt lt id name id type long column person_id unsaved value 0 gt lt generator class identity gt lt id gt Para desenvolvimento multi plataforma a estrat gia native ira escolher entre as estrat gias identity sequence hilo dependendo das capacidades do banco de dados utilizado 5 1 4 5 Identificadores atribu dos Se voc quiser que a aplica o especifique os identificadores em vez do Hibernate ger los voc deve utilizar o gerador assigned Este gerador especial ir utilizar o valor do identificador 77 Capitulo 5 Mapeamento O R Basico especificado para a propriedade de identifica o do objeto Este gerador usado quando a chave prim ria
355. ropriedades de identifica o O elemento lt composite id gt aceita o mapeamento da propriedade lt key property gt e mapeamentos lt key many to one gt como elementos filhos lt composite id gt lt key property name medicareNumber gt lt key property name dependent gt lt composite id gt A classe persistente precisa substituir equals hashcode para implementar identificadores compostos igualmente E precisa tamb m implementar serializable Infelizmente esta solu o para um identificador composto significa que um objeto persistente seu pr prio identificador N o h outro handle conveniente a n o ser o pr prio objeto Voc mesmo precisa instanciar uma inst ncia de outra classe persistente e preencher suas 80 Discriminador propriedades de identifica o antes que voc possa dar um load para o estado persistente associado com uma chave composta N s chamamos esta solu o de identificador composto incorporado e n o aconselhamos para aplica es s rias Uma segunda solu o seria chamar de identificador composto mapped quando a propriedades de identifica o nomeadas dentro do elemento lt composite i a gt est o duplicadas tanto na classe persistente como em uma classe de identifica o separada lt composite id class MedicareId mapped true gt lt key property name medicareNumber gt lt key property name dependent gt lt composite id gt No exemplo amba
356. ry mothersWithKittens Cat session createQuery select mother from Cat as mother left join fetch mother kittens Set uniqueMothers new HashSet mothersWithKittens list Geralmente uma consulta executada ao invocar 1ist O resultado da consulta sera carregado completamente em uma cole o na mem ria Inst ncias de entidades recuperadas por uma consulta est o no estado persistente O uniqueResult Oferece um atalho se voc souber previamente que a consulta retornar apenas um nico objeto Repare que consultas que fazem uso da busca antecipada eager fetching de cole es geralmente retornam duplicatas dos objetos raiz mas com suas cole es inicializadas Pode se filtrar estas duplicatas atrav s de um simples set 10 4 1 1 Interagindo com resultados Ocasionalmente pode se obter um melhor desempenho com a execu o de consultas usando o m todo iterate Geralmente isso acontece apenas se as inst ncias das entidades reais retornadas pela consulta j estiverem na sess o ou no cach de segundo n vel Caso elas ainda n o tenham sido armazenadas iterate ser mais devagar do que 1ist e podem ser necess rios v rios acessos ao banco de dados para uma simples consulta geralmente 1 para a sele o inicial que retorna apenas identificadores e n consultas adicionais para inicializar as inst ncias reais fetch ids Iterator iter sess createQuery from eg Qux q order by q likeliness iterate whi
357. s lt one to many class ClassName not found ignore exception oe entity name EntityName node element name embed xml true false gt O class requerido O nome da classe associada O not found opcional padr o para exception Especifica como os identificadores em cache que referenciam as linhas faltantes ser o tratadas ignore tratar a linha faltante como uma associa o nula entity name opcional O nome da entidade da classe associada como uma alternativa para a class Note que o elemento lt one to many gt n o precisa declarar qualquer coluna Nem necess rio especificar o nome da table em qualquer lugar 120 Mapeamentos de cole o avan ados Aten o Se a coluna da chave exterior de uma associa o lt one to many gt for declarada como NOT NULL Voc deve declarar a lt key gt mapeando not null true OU use uma associa o bidirecional com o mapeamento da cole o marcado como inverse true Veja a discuss o das associa es bidirecionais mais tarde neste mesmo cap tulo Este exemplo demonstra um mapa das entidades Part por nome onde partName uma propriedade persistente de Part Note que o uso de um ndice baseado em f rmula lt map name parts cascade al1 gt lt key column productId not null true gt lt map key formula partName gt lt one to many class Part gt lt map gt 6 3 Mapeamentos de cole o avan ados 6
358. s tb pul sessionFactory Tall ObjectName on new ObjectName hibernate tb MBean object name StatisticsService stats new StatisticsService MBean implementation server registerMBean stats on Register the MBean on the server Voc pode des ativar o monitoramento para uma SessionFactory no tempo de configura o ajuste hibernate generate_statistics para falso em tempo de espera sf getStatistics setStatisticsEnabled true ou hibernateStatsBean setStatisticsEnabled true As estat sticas podem ser reajsutadas de forma program tica usando o m todo clear Um resumo pode ser enviado para o usu rio nivel de info usando o m todo logSummary 20 6 2 M tricas O Hibernate oferece um n mero de m tricas desde informa es bem b sicas at especializadas somente relevantes a certos cen rios Todos os contadores dispon veis est o descritos na API da interface statistics em tr s categorias e As m tricas relacionadas ao uso da sess o tal como um n mero de sess es em aberto conex es JDBC recuperadas etc As m tricas relacionadas s entidades cole es consultas e caches como um todo mais conhecido como m tricas globais M tricas detalhadas relacionadas uma entidade em particular cole o consulta ou regi o de cache Por exemplo voc pode verificar a coincid ncia de um cache perder e colocar a rela o entre as entidades cola es e
359. s gt lt array gt Um mapa desde indices de strigs at datas lt map name holidays table holidays schema dbo order by hol name asc gt lt key column id gt lt map key column hol name type string gt lt element column hol date type date gt lt map gt Uma lista de componentes isto ser discutido no pr ximo cap tulo lt list name carComponents table CarComponents gt 119 Capitulo 6 Mapeamento de col lt key column carid gt lt list index column sortOrder gt lt composite element class CarComponent gt lt property name price gt lt property name type gt lt property name serialNumber column serialNum gt lt composite element gt SP Lise gt 6 2 5 Associa es um para muitos Uma associa o um para muitos liga as tabelas das duas classes atrav s de uma chave exterior sem a interven o da tabela de cole o Este mapeamento perde um pouco da sem ntica das cole es normais do Java Uma inst ncia de classes entidades contidas podem n o pertencer mais de uma inst ncia da cole o Uma inst ncia da classe de entidade contida pode n o aparecer em mais de um valor do ndice da cole o Uma associa o a partir do Produto at a Parte requer a exist ncia de uma coluna de chave exterior e possivelmente uma coluna de ndice para a tabela part Uma tag lt one to many gt indica que esta uma associa o um para muito
360. s em rela o ao servi o de persist ncia Uma entidade existe independentemente de qualquer outro objeto guardando refer ncias para a entidade Em contraste com o modelo usual de Java que um objeto n o referenciado coletado pelo coletor de lixo Entidades devem ser explicitamente salvas ou deletadas exceto em opera es de salvamento ou dele o que possam ser executada em cascata de uma entidade pai para seus filhos Isto diferente do modelo ODMG de persist ncia do objeto por acessibilidade e se refere mais forma como os objetos de aplica es s o geralmente usados em grandes sistemas Entidades suportam refer ncias circulares e comuns Eles podem ser versionados O estado persistente da entidade consiste de refer ncias para outras entidades e inst ncias de tipos de valor Valores s o primitivos cole es n o o que tem dentro de uma cole o componentes e certos objetos imut veis Entidades distintas valores em cole es e componentes particulares s o persistidos e apagados por acessibilidade Visto que objetos de valor e primitivos s o persistidos e apagados junto com as entidades que os cont m e n o podem ser versionados independentemente Valores t m identidade n o independente assim eles n o podem ser comuns para duas entidades ou cole es At agora estivemos usando o termo classe persistente para referir s entidades Continuaremos a fazer isto No entanto nem todas as classes definidas pelo
361. s o rodadas frequentemente com os mesmos par metros 20 4 1 Ativa o do cache de consulta A aplica o do cache nos resultados de consulta introduz alguns resultados referentes o seu processamento transacional normal de aplica es Por exemplo se voc realizar o cache nos resultados de uma consulta do Person Hibernate voc precisar acompanhar quando estes resultados dever o ser inv lidos devido altera es salvas no Person Tudo isto acompanhado com o fato de que a maioria dos aplicativos n o recebem benef cio algum ao realizar o cache nos resultados da consulta levando o Hibernate a desativar o cache de resultados de consulta por padr o Para uso do cache de consulta voc primeiro precisa ativar o cache de consulta hibernate cache use query cache true Esta configura o cria duas novas regi es de cache org hibernate cache StandardQueryCache mantendo os resultados da consulta com cache 281 Capitulo 20 Aumentando o des org hibernate cache UpdateTimestampsCache mant m os timestamps das atualiza es mais recentes para tabelas consult veis Elas s o usadas para validar os resultados uma vez que elas s o servidas a partir do cache de consulta Importante If you configure your underlying cache implementation to use expiry or timeouts is very important that the cache timeout of the underlying cache region for the UpdateTimestampsCache be set to a higher value than the timeouts of any of
362. s algum c digo de inicializa o ou classe de utilidade em seu aplicativo a n o ser que voc use a implementa o JMX com O HibernateService discutido mais tarde Se voc usar um JNDI SessionFactory 0 EJB ou qualquer outra classe obter a SessionFactory utilizando um localizador JNDI Recomendamos que voc vincule a SessionFactory ao JNDI em um ambiente gerenciado e utilize um singleton static Para proteger seu c digo de aplicativo destes detalhes tamb m recomendamos que esconda o c digo de localiza o atual para uma SessionFactory em uma 52 Gerenciamento de contexto de Sess o atual com JTA classe de ajuda assim como O Hibernateutil getSessionFactory Note que tal classe tamb m uma forma bastante conveniente de inicializar o Hibernate veja o cap tulo 1 3 8 3 Gerenciamento de contexto de Sess o atual com JTA The easiest way to handle sessions and transactions is Hibernate s automatic current session management For a discussion of contextual sessions see Se o 2 5 Sess es Contextuais Using the jta session context if there is no Hibernate session associated with the current JTA transaction one will be started and associated with that JTA transaction the first time you call sessionFactory getCurrentSession The Sessions retrieved via getCurrentSession in the jta context are set to automatically flush before the transaction completes close after the transaction completes and ag
363. s as classes de identificadores compostas medicareia e a pr pria classe entidade possuem propriedades nomeadas medicareNumber dependent A classe identificadora precisa sobrepor equals hashCode e implementar Serializable A desvantagem desta solu o bvia duplica o de c digo As seguintes fun es s o utilizadas para especificar o mapeamento de um identificador composto mapped opcional false por padr o Indica que um identificar composto mapeado usado e que as propriedades de mapeamento contidas refere se tanto classe entidade quanto classe de identifica o composta class opcional mas requerida para um identificador composto mapeado A classe usada como um identificador composto We will describe a third even more convenient approach where the composite identifier is implemented as a component class in Se o 8 4 Componentes como identificadores compostos The attributes described below apply only to this alternative approach name Opcional requerida para esta abordagem Uma propriedade do tipo componente que armazena o identificador composto Para maiores informa es por favor consulte o cap tulo 9 access opcional padr o para property A estrat gia que o Hiberante deve utilizar para acessar o valor da propriedade class opcional valor padr o para o tipo de propriedade determinando por reflex o A classe componente utilizada como um identificador composto Por
364. s com um ConnectionProvider configurado As conex es fornecidas pelo usu rio est o fora do escopo dessa discuss o Os diferentes modos de libera o est o definidos pelos valores da enumera o org hibernate ConnectionReleaseMode ON CLOSE 0 modo legado descrito acima A sess o do Hibernate obt m a conex o quando precisar executar alguma opera o JDBC pela primeira vez e mant m enquanto a conex o n o for fechada AFTER TRANSACTION informa que a conex o deve ser liberada ap s a conclus o de uma org hibernate Transaction AFTER STATEMENT tamb m conhecida como libera o agressiva informa que a conex o deve ser liberada ap s a execu o de cada instru o A libera o agressiva n o ocorre se a instru o deixa pra tr s algum recurso aberto associado com a sess o obtida Atualmente a nica situa o em que isto ocorre com o uso de org hibernate ScrollableResults O par metro de configura o hibernate connection release mode usado para especificar qual modo de libera o deve ser usado Segue abaixo os valores poss veis 201 Cap tulo 12 Transa es e Con auto padr o essa op o delega ao modo de libera o retornado pelo m todo org hibernate transaction TransactionFactory getDefaultReleaseMode Para JTATransactionFactory ele retorna ConnectionReleaseMode AFTER STATEMENT para JDBCTransactionFactory ele retorna ConnectionReleaseMode AF
365. s de valores Eles s o automaticamente persistidos quando referenciados por um objeto persistente e automaticamente deletados quando n o referenciados Se a cole o passada de um objeto persistente para outro seus elementos devem ser movidos de uma tabela para outra Duas entidades n o devem compartilhar uma refer ncia com uma mesma inst ncia de cole o Devido ao modelo relacional 113 Capitulo 6 Mapeamento de col adjacente as propriedades de cole es v lidas n o suportam sem nticas de valores nulos O Hibernate n o distingue entre a refer ncia da cole o nula e uma cole o vazia Use as cole es persistentes da mesma forma que usa cole es Java comuns No entanto somente tenha a certeza de entender as sem nticas de associa es bidirecionais as quais ser o discutidas mais tarde 6 2 Mapeamento de cole o Dica Existem diversas variedades de mapeamento que podem ser gerados para as cole es cobrindo muitos modelos relacionais comuns Sugerimos que voc fa a o teste com a ferramenta de gera o do esquema para obter uma id ia de como diversas declara es de mapeamento traduzem as tabelas de banco de dados O elemento do mapeamento do Hibernate usado para mapear uma cole o depende do tipo de interface Por exemplo um elemento lt set gt usado para mapear propriedades do tipo Set lt class name Product gt lt id name serialNumber column productSerialNumber gt
366. s detalhes da classe SQLExceptionConverterFactory Os subtipos padr o de JDBCException s o e JDBCConnectionException indica um erro com a comunica o subjacente de JDBC SQLGrammarException indica um problema da gram tica ou da sintaxe com o SQL emitido ConstraintViolationException indica algum forma de viola o de confinamento de integridade LockAcquisitionException indica um erro ao adquirir um n vel de bloqueio necess rio para realizar a opera o de requisi o GenericJDBCExcept ion Uma exce o gen rica que n o est inclusa em nenhuma das outras categorias 12 2 4 Tempo de espera de Transa o O tempo de espera de transa o uma caracter stica extremamente importante fornecida por um ambiente gerenciado como EJB e que nunca fornecido pelo c digo n o gerenciado Os tempos de espera de transa o asseguram que nenhuma transa o retenha indefinidamente recursos enquanto n o retornar nenhuma resposta ao usu rio Fora de um ambiente controlado JTA o Hibernate n o pode fornecer inteiramente esta funcionalidade Entretanto o Hibernate pode afinal controlar as opera es do acesso a dados assegurando que o n vel de deadlocks e consultas do banco de dados com imensos resultados definidos sejam limitados pelo tempo de espera Em um ambiente gerenciado o Hibernate pode delegar o tempo de espera da transa o ao JTA Esta funcionalidade abstra da pelo
367. s do id type Voc deve especificar o mapeamento de valores do meta type para nome de classes lt any name being id type long meta type string gt lt meta value value TBL ANIMAL class Animal gt lt meta value value TBL HUMAN class Human gt lt meta value value TBL ALIEN class Alien gt lt column name table name gt lt column name id gt lt any gt lt any name propertyName id type idtypename meta type metatypename cascade cascade style access field property ClassName 000006 optimistic lock true false lt meta value gt lt meta value gt Seo una uu Jo Se out name O nome da propriedade id type 0 tipo identificador o meta type opcional padr o para string Qualquer tipo que permitido para um mapeamento discriminador cascade opcional valor padr o none o estilo cascata access opcional padr o para property A estrat gia que o Hiberante deve utilizar para acessar o valor da propriedade 101 Capitulo 5 Mapeamento O R Basico O optimistic lock opcional valor padraot rue Especifica que as atualiza es para esta propriedade requerem ou n o aquisi o da bloqueio otimista Em outras palavras define se uma vers o de incremento deve ocorrer se esta propriedade for suja 5 2 Tipos do Hibernate 5 2 1 Entidades e valores Os objetos de n vel de linguagem Java s o classificados em dois grupo
368. s estat sticas via JMX Leia o Javadoc da interface org hibernate stats para mais informa es 47 Capitulo 3 Configuration 3 5 Logging O Hibernate utiliza o Simple Logging Facade for Java http www slf4j org SLF4J com o objetivo de registrar os diversos eventos de sistema O SLF4J pode direcionar a sua sa da de logging a diversos frameworks de logging NOP Simple log4j version 1 2 JDK 1 4 logging JCL ou logback dependendo de sua escolha de vincula o Com o objetivo de determinar o seu logging voc precisar do s1f45 api jar em seu classpatch juntamente com o arquivo jar para a sua vincula o preferida s1 45 1094512 jar no caso do Log4J Consulte o SLF4J documentation http Avww slf4j org manual html para maiores detalhes Para usar o Log4j voc precisar tamb m colocar um arquivo 10945 properties em seu classpath Um exemplo do arquivo de propriedades est distribu do com o Hibernate no diret rio src N s recomendamos que voc se familiarize se com mensagens de log do Hibernate Tem sido um rduo trabalho fazer o log Hibernate t o detalhado quanto poss vel sem faz lo ileg vel um dispositivo de controle de erros essencial As categorias de log mais interessantes s o as seguintes Tabela 3 9 Categorias de Log do Hibernate Categoria Fun o org hibernate SQL Registra todas as instru es SQL DML a medida que elas s o executadas org hibernate type Registra todos os par metr
369. s por chaves naturais constantes Em algumas aplica es este tipo de consulta ocorre com frequ ncia O API de crit rio prov provis o especial para este caso de uso Primeiro voc deve mapear a chave natural de sua entidade usando um lt natural id gt e habilitar o uso de um cache de segundo n vel lt class name User gt lt cache usage read write gt lt id name id gt lt generator class increment gt lt id gt lt natural id gt lt property name name gt lt property name org gt lt natural id gt lt property name password gt lt class gt Note que esta funcionalidade n o proposta para o uso com entidades com chaves naturais mut veis Uma vez que voc tenha ativado o cache de consulta Hibernate 0 Restrictions naturalId nos permite que utilizemos um algoritmo de cache mais eficiente session createCriteria User class add Restrictions naturalId set name gavin Set Torg hB setCacheable true uniqueResult 242 SQL Nativo Voc tamb m pode expressar consultas no dialeto SQL nativo de seu banco de dados Isto bastante til para usar recursos espec ficos do banco de dados assim como dicas de consultas ou a palavra chave em Oracle connect Ele tamb m oferece um caminho de migra o limpo de uma aplica o baseada em SQL JDBC direta at o Hibernate O Hibernate3 permite que voc especifique o SQL escrito m o incluindo procediment
370. s querem se referir coluna e s propriedades 250 Usando procedimentos de armazenamento para consultas Se seu mapeamento possuir um discriminador voc deve usar lt return discriminator gt para especificar a coluna do discriminador 17 2 2 Usando procedimentos de armazenamento para consultas O Hibernate 3 apresenta o suporte para consultas atrav s de procedimentos e fun es z armazenadas A maior parte da documenta o a seguir equivalente para ambos Os procedimentos e fun es armazenados devem devolver um conjunto de resultados como primeiros par metros externos para poder trabalhar com o Hibernate Um exemplo disto a fun o armazenada em Oracle 9 e vers es posteriores como se segue CREATE OR REPLACE FUNCTION selectAllEmployments RETURN SYS_REFCURSOR AS st cursor SYS REF CURSOR BEGIN OPEN st cursor FOR SELECT EMPLOYEE EMPLOYER STARTDATE ENDDATE REGIONCODE EID VALUE CURRENCY FROM EMPLOYMENT RETURN st cursor END Para usar esta consulta no Hibernate voc vai precisar mape lo atrav s de uma consulta nomeada lt sql query name selectAllEmployees_SP callable true gt lt return alias emp class Employment gt lt return property name employee column EMPLOYEE gt lt return property name employer column EMPLOYER gt lt return property name startDate column STARTDATE gt lt return property name endDate column ENDDATE gt lt return property name regio
371. s the version if the entity has a collection with changes that dirties the entity A read only entity can be deleted Even if an entity is not read only its collection association can be affected if it contains a read only entity For details about the affect of read only entities on different property and association types see Se o 11 2 Read only affect on property type For details about how to make entities read only see Se o 11 1 Making persistent entities read only Hibernate does some optimizing for read only entities It saves execution time by not dirty checking simple properties or single ended associations It saves memory by deleting database snapshots 11 1 Making persistent entities read only Only persistent entities can be made read only Transient and detached entities must be put in persistent state before they can be made read only 177 Capitulo 11 Read only entities Hibernate provides the following ways to make persistent entities read only you can map an entity class as immutable when an entity of an immutable class is made persistent Hibernate automatically makes it read only see Se o 11 1 1 Entities of immutable classes for details you can change a default so that entities loaded into the session by Hibernate are automatically made read only see Se o 11 1 2 Loading persistent entities as read only for details you can make an HQL query or criteria re
372. s transitivas no Hibernate especialmente teis para pessoas utilizando identificadores atribu dos ou chaves compostas 5 1 10 Timestamp opcional O elemento opcional lt timestamp gt indica que uma tabela cont m dados em timestamp Isso tem por objetivo dar uma alternativa para versionamento Timestamps s o por natureza uma implementa o menos segura do bloqueio otimista Entretanto algumas vezes a aplica o pode usar timestamps em outros caminhos lt timestamp column timestamp column 83 Capitulo 5 Mapeamento O R Basico o O 8 8 name propertyName access field property ClassName unsaved value null undefined source vm db 00000 generated never always node element name Gattribute name element fattribute column opcional padr o para o nome da propriedade O nome da coluna que mant m o timestamp name O nome da propriedade no estilo JavaBeans do tipo Date OU Timestamp da classe persistente access opcional padr o para property A estrat gia que o Hiberante deve utilizar para acessar o valor da propriedade unsaved value opcional padr o para nu11 Um valor de propriedade da vers o que indica que uma inst ncia foi recentemente instanciada unsaved distinguindo a de inst ncias desconectadas que foram salvas ou carregadas em sess es pr vias Undefined especifica que um valor de propriedade de identifica o deve ser utilizado source opcional padr o para
373. sada pelo Hibernate para atualizar ou deletar linhas de cole es Isto sugere a seguinte classifica o Cole es indexadas conjuntos e Bags Todas as cole es indexadas mapas listas matrizes possuem uma chave prim ria que consiste em colunas lt key gt e lt index gt Neste caso as atualiza es de cole o s o geralmente muito eficientes A chave prim ria pode ser indexada de forma eficiente e uma linha em particular pode ser localizada de forma eficiente quando o Hibernate tentar atualizar ou delet la Os conjuntos possuem uma chave prim ria que consiste em lt key gt e colunas de elemento Isto pode ser menos eficiente para alguns tipos de elementos de cole es especialmente elementos compostos ou textos grandes ou ainda campos bin rios O banco de dados pode n o ser capaz de indexar uma chave prim ria complexa de forma t o eficiente Por um outro lado para associa es um para muitos ou muitos para muitos especialmente no caso de identificadores sint ticos bem prov vel que seja t o eficiente quanto Se voc quiser que O SchemaExport crie para voc uma chave prim ria de um lt set gt voc dever declarar todas as colunas como not null t rue Os mapeamentos lt idbag gt definem uma chave substituta para que elas sejam sempre muito eficientes ao atualizar Na verdade este o melhor caso 283 Capitulo 20 Aumentando o des As Bags sao os piores casos Como uma bag permite
374. se d nas seguintes formas Uma chamada a session 1oad especificando O LockMode Uma chamada session lock Uma chamada Query setLockMode Se uma Session load invocada com UPGRADE OU UPGRADE NOWAIT O objeto requisitado ainda n o foi carregado pela sess o o objeto carregado usando SELECT FOR UPDATE Se load for chamado para um objeto que j foi carregado com um bloqueio menos restritivo que o novo bloqueio solicitado o Hibernate invoca o m todo lock para aquele objeto O Session lock executa uma verifica o no n mero da vers o se o modo de bloqueio especificado for READ UPGRADE OU UPGRADE NOWAIT No caso do UPGRADE OU UPGRADE NOWAIT usado SELECT FOR UPDATE Se o banco de dados n o suportar o modo de bloqueio solicitado o Hibernate usar um modo alternativo apropriado ao inv s de lan ar uma exce o Isso garante que a aplica o seja port til 12 5 Modos para liberar a conex o O comportamento legado do Hibernate 2 x referente ao gerenciamento da conex o via JDBC era que a Session precisaria obter uma conex o quando ela precisasse pela primeira vez e depois manteria a conex o enquanto a sess o n o fosse fechada O Hibernate 3 x introduz a id ia de modos para liberar a sess o para informar a sess o a forma como deve manusear a sua conex o JDBC Veja que essa discuss o s pertinente para conex es fornecida
375. sess o para e a partir da camada servlet JSP Use uma nova sess o para manipular cada solicita o Use a session merge OU a Session saveOrUpdate para sincronizar objetos com o banco de dados uma arquitetura de duas camadas considere o uso de contextos de longa persist ncia As Transa es do Banco de Dados precisam ser as mais curtas poss veis para uma melhor escalabilidade No entanto geralmente necess rio implementar transa es de aplica es de longa dura o uma nica unidade de trabalho a partir do ponto de vista de um usu rio Uma transa o de aplica o pode transpor diversos ciclos de solicita o resposta de cliente comum usar objetos desanexados para implementar as transa es de aplica o Uma outra alternativa extremamente apropriada em uma arquitetura de duas camadas manter um nico contato de persist ncia aberto sess o para todo o tempo de vida da transa o de aplica o e simplesmente disconect lo do JDBC ao final de cada solicita o e reconect lo no in cio de uma solicita o subsequente Nunca compartilhe uma sess o nica com mais de uma transa o de aplica o ou voc ir trabalhar com dados antigos N o trate as exce es como recuper veis Isto mais uma pr tica necess ria do que uma melhor pr tica Quando uma exce o ocorre retorne Transaction e feche a sess o Se n o fizer isto o Hibernate n o poder garantir que o estado em mem ria represent
376. session close If Session isDefaultReadOnly returns true then you can use Query setReadOnly false and Criteria setReadOnly false to override this session setting and load entities that are not read only 11 1 4 Making a persistent entity read only Nota Persistent entities of immutable classes are automatically made read only 180 Read only affect on property type To make a persistent entity or proxy read only call Session setReadOnly entityOrProxy true To change a read only entity or proxy of a mutable class so it is no longer read only call Session setReadOnly entityOrProxy false Importante When a read only entity or proxy is changed so it is no longer read only Hibernate assumes that the current state of the read only entity is consistent with its database representation If this is not true then any non flushed changes made before or while the entity was read only will be ignored To throw away non flushed changes and make the persistent entity consistent with its database representation call session refresh entity To flush changes made before or while the entity was read only and make the database representation consistent with the current state of the persistent entity evict the read only entity so it is detached session evict entity make the detached entity with the non flushed changes persistent session update entity now entity is no longer re
377. sion flush session clear tx commit session close 14 2 Atualiza o em lotes Para recuperar e atualizar informa es a mesma id ia v lida Al m disso pode precisar usar O scroll para usar recursos no lado do servidor em consultas que retornem muita informa o Session session sessionFactory openSession Transaction tx session beginTransaction ScrollableResults customers session getNamedQuery GetCustomers setCacheMode CacheMode IGNORE scroll ScrollMode FORWARD_ONLY int count 0 while customers next Customer customer Customer customers get 0 customer updateStuff if recount s 20 000 0 4 flush a batch of updates and release memory session flush session clear tz commit 7 session close 14 3 A interface de Sessao sem Estado Como forma alternativa o Hibernate prov uma API orientada comandos que pode ser usada para transmitir um fluxo de dados de e para o banco de dados na forma de objetos desanexados Um statelessSession n o tem um contexto persistente associado e n o fornece muito das sem nticas de alto n vel para controle do ciclo de vida Especialmente uma Sess o sem Estado n o implementa um cach prim rio e nem interage com o cache secund rio ou cach de consulta Ela n o implementa uma grava o tempor ria transacional ou checagem suja autom tica Opera es realizadas usando uma sess o sem estado n o fazem
378. sist ncia Transitiva e Session saveOrUpdate e Session merge Recomendamos que voc declare propriedades de identificador nomeados de forma consistente nas classes persistentes e que voc use um tipo anul vel ou seja n o primitivo 4 1 3 Prefira classes n o finais opcional Um recurso central do Hibernate proxies depende da classe persistente ser tanto n o final como uma implementa o de uma interface que declare todos os m todos p blicos Voc pode persistir as classes final que n o implementam uma interface com o Hibernate mas n o poder usar os proxies para busca por associa o lazy que ir limitar suas op es para ajuste de desempenho Voc deve evitar declarar m todos public final em classes n o finais Se voc desejar usar uma classe com um m todo public final voc deve desabilitar o proxy explicitamente ajustando lazy false 4 1 4 Declare acessores e mutadores para campos persistentes opcional cat declara os m todos assessores para todos os seus campos persistentes Muitas ferramentas ORM persistem diretamente vari veis de inst ncias Acreditamos ser melhor prover uma indire o entre o esquema relacional e as estruturas de dados internos da classe Por padr o o Hibernate persiste as propriedades de estilo JavaBeans e reconhece nomes de m todos da 57 Capitulo 4 Classes Persistentes forma getFoo isFoo setFoo Caso solicitado voc pode mudar para direcionar a
379. site element gt As sem nticas padr es da associa o um para muitos no Hibernate s o muito menos parecidas com as sem nticas comuns de um relacionamento pai filho do que aqueles de um mapeamento de elemento de composi o Explicaremos como utilizar uma associa o bidirecional um para muitos com cascatas para modelar um relacionamento pai filho de forma eficiente e elegante 22 1 Uma nota sobre as cole es As cole es do Hibernate s o consideradas uma parte l gica de suas pr prias entidades nunca das entidades contidas Saiba que esta uma distin o que possui as seguintes consequ ncias Quando removemos ou adicionamos um objeto da na cole o o n mero da vers o do propriet rio da cole o incrementado Se um objeto removido de uma cole o for uma inst ncia de um tipo de valor ex um elemento de composi o este objeto ir parar de ser persistente e seu estado ser completamente removido do banco de dados Da mesma forma ao adicionar uma inst ncia de tipo de valor cole o causar ao estado uma persist ncia imediata Por outro lado se uma entidade removida de uma cole o uma associa o um para muitos ou muitos para muitos ela n o ser deletada por padr o Este comportamento completamente consistente uma mudan a para o estado interno de uma outra entidade n o deve fazer com que a entidade associada desapare a Da mesma forma ao adicionar uma entidade cole o
380. ssionFactory Voc poder escolher um arquivo de configura o XML diferente utilizando SessionFactory sf new Configuration configure catdb cfg xml buildSessionFactory 3 8 Integra o com servidores de aplica o J2EE O Hibernate tem os seguintes pontos da integra o para a infraestrutura de J2EE DataSources gerenciados pelo container O Hibernate pode usar conex es JDBC gerenciadas pelo Container e fornecidas pela JNDI Geralmente um Transact ionManager compat vel com JTA e um ResourceManager cuidam do gerenciamento da transa o CMT especialmente em transa es distribu das manipuladas atrav s de v rios DataSources Naturalmente voc tamb m pode demarcar os limites das transa es programaticamente BMT ou voc poderia querer usar a API opcional do Hibernate Transaction para esta manter seu c digo port vel Vincula o binding autom tica JNDI O Hibernate pode associar sua SessionFactory a JNDI depois de iniciado Vincula o binding da Sess o na JTA A session do Hibernate pode automaticamente ser ligada ao escopo da transa es JTA Simplesmente localizando a sessionractory da JNDI e 50 Configura o de estrat gia de transa o obtendo a session corrente Deixe o Hibernate cuidar da libera o e encerramento da session quando as transa es JTA terminarem A Demarca o de transa o pode ser declarativa CMT ou program tica BMT Transa o do usu rio
381. ssocia o consultas por Criteria consultas HQL se a busca por subselect for usada Independentemente da estrat gia de busca que voc usar o gr fico n o pregui oso definido ser certamente carregado na mem ria Note que isso ir resultar em diversas sele es imediatas sendo usadas para rodar uma consulta HQL em particular Geralmente n o usamos documentos de mapeamento para customizar as buscas Ao inv s disso n s deixamos o comportamento padr o e sobrescrevemos isso em uma transa o em particular usando left join fetch no HQL Isso diz ao Hibernate para buscar a associa o inteira no primeiro select usando uma uni o externa Na API de busca criteria voc ir usar setFetchMode FetchMode JOIN Se voc quiser mudar a estrat gia de busca usada pelo get OU load simplesmente use uma consulta por Criteria por exemplo User user User session createCriteria User class setFetchMode permissions FetchMode JOIN add Restrictions idEq userId uniqueResult 269 Capitulo 20 Aumentando o des Isto o equivalente do Hibernate para o que algumas solu es ORM chamam de plano de busca Um meio totalmente diferente de evitar problemas com selects N 1 usar um cache de segundo nivel 20 1 3 Proxies de associa o final nico A recupera o pregui osa para cole es implementada usando uma implementa o pr pria do Hibernate para cole es persistentes Por m
382. ssociation orders style join gt lt fetch profile gt lt hibernate mapping gt ou ainda lt hibernate mapping gt lt class name Customer gt lt fetch profile name customer with orders gt lt fetch association orders style join gt lt fetch profile gt lt class gt lt hibernate mapping gt Agora que o c digo seguinte ir carregar ambos cliente e outros pedidos Session session session enableFetchProfile customer with orders name matches from mapping Customer customer Customer session get Customer class customerlid Apenas os perfis de busca em estilo s o suportados mas planeja se o suporte de estilos adicionais Consulte HHH 3414 http opensource atlassian com projects hibernate browse HHH 3414 para maiores detalhes 275 Capitulo 20 Aumentando o des 20 1 8 Usando busca pregui osa de propriedade O Hibernate3 suporta a busca lazy de propriedades individuais Essa t cnica de otimiza o tamb m conhecida como grupos de busca Veja que esta mais uma caracter stica de marketing j que na pr tica mais importante a otimiza o nas leituras dos registros do que na leitura das colunas Por m carregar apenas algumas propriedades de uma classe pode ser til em casos extremos onde tabelas legadas podem ter centenas de colunas e o modelo de dados n o pode ser melhorado Para habilitar a carga de propriedade lazy preciso ajustar a
383. st ncia dada n o se torna associada com a sess o ela permanece desanexada 10 8 Apagando objetos persistentes A session delete remover um estado de objeto do banco de dados claro que seu aplicativo pode ainda reter uma refer ncia um objeto apagado melhor pensar em delete como fazer uma inst ncia persistente se tornar transiente sess delete cat Voc poder deletar objetos na ordem que desejar sem risco de viola o de restri o da chave estrangeira poss vel violar uma restri o Nor NULL em uma coluna de chave estrangeira apagando objetos na ordem inversa ex se apagar o pai mas esquecer de apagar o filho 10 9 Replicando objeto entre dois armazenamentos de dados diferentes Algumas vezes til poder tirar um gr fico de inst ncias persistentes e faz los persistentes em um armazenamento de dados diferente sem gerar novamente valores de identificador retrieve a cat from one database Session sessionl factoryl openSession Transaction txl sessionl beginTransaction Cat cat sessionl get Cat class catId j tzl commit Y sessionl close reconcile with a second database Session session2 factory2 openSession Transaction tx2 session2 beginTransaction session2 replicate cat ReplicationMode LATEST VERSION t42 commit session2 close O ReplicationMode determina como 0 replicate ir lidar com conflitos em linhas existentes no banco de dados
384. st results session createCriteria Cat class add Example create cat Este Propriedades de vers o identificadores e associa es s o ignoradas Por padr o as propriedades de valor null s o exclu das 238 Proje es agrega es e agrupamento Voc pode ajustar como 0 Exemplo aplicado Example example Example create cat excludeZeroes exclude zero valued properties excludeProperty color exclude the property named color ignoreCase perform case insensitive string comparisons enableLike use like for string comparisons List results session createCriteria Cat class add example alise Op Voc pode at usar os exemplos para colocar os crit rios em objetos associados List results session createCriteria Cat class add Example create cat createCriteria mate add Example create cat getMate slige O E 16 7 Proje es agrega es e agrupamento A classe org hibernate criterion Projections uma f brica para inst ncias de Projection Voc pode aplicar uma proje o uma consulta chamando O setProjection List results session createCriteria Cat class setProjection Projections rowCount add Restrictions eq color Color BLACK alist List results session createCriteria Cat class setProjection Projections projectionList add Projections rowCount add add Projections max weight add
385. stName gt lt column name initial gt lt column name lastName gt lt many to one gt N s n o recomendamos o uso deste tipo de coisa fora do contexto de mapeamento de dados legados 5 1 17 Subclass Finalmente a persist ncia polim rfica requer a declara o de cada subclasse da classe ra z de persist ncia Para a estrat gia de mapeamento tabela por hierarquia de classe deve se utilizar a declara o lt subclass gt Por exemplo lt subclass name ClassName discriminator value discriminator value proxy ProxyInterface 90009 lazy true false dynamic update true false dynamic insert true false entity name EntityName node element name extends SuperclassName gt lt property suas gt lt subclass gt name O nome de classe completamente qualificada da subclasse discriminator value opcional padr o para o nome da classe Um valor que distingue subclasses individuais proxy opcional Especifica a classe ou interface que usar os proxies de inicializa o lazy 90 ooo lazy opcional padr o para true Configurar lazy false desabilitar o uso de inicializa o lazy Subclasses Unidas Cada subclasse deve declarar suas pr prias propriedades persistentes e subclasses As propriedades lt version gt e lt id gt s o configuradas para serem herdadas da classe ra z Cada subclasse numa hierarquia deve definir um nico discriminator value Se nenhum
386. stener class org hibernate event def DefaultLoadEventListener gt lt event gt lt session factory gt lt hibernate configuration gt Ou voc pode registrar o listener programaticamente Configuration cfg new Configuration LoadEventListener stack new MyLoadListener new DefaultLoadEventListener cfg EventListeners setLoadEventListeners stack Listeners registrados declarativamente n o compartilham da mesma inst ncia Se o mesmo nome da classe for utilizado em v rios elementos lt listener gt cada um resultar em uma inst ncia separada dessa classe Se voc tem a necessidade de compartilhar uma inst ncia de um listener entre diversos tipos de listeners voc deve registrar o listener programaticamente Mas por qu implementar uma interface e definir o tipo espec fico durante a configura o Bem um listener pode implementar v rios listeners de evento Com o tipo sendo definido durante o registro fica f cil ligar ou desligar listeners personalizados durante a configura o 13 3 Seguran a declarativa do Hibernate Geralmente a seguran a declarativa nos aplicativos do Hibernate gerenciada em uma camada de fachada de sess o Agora o Hibernate3 permite certas a es serem aceitas atrav s do JACC e autorizadas atrav s do JAAS Esta uma funcionalidade opcional constru da em cima da arquitetura do evento Primeiro voc precisa configurar um evento listener apropriado para possibi
387. sto tamb m significa que somente estas tr s colunas ir o retornar embora a consulta esteja utilizando e possa retornar mais do que tr s colunas listadas poss vel deixar de fora o tipo de informa o para todos ou alguns dos escalares sess createSOLQuery SELECT FROM CATS addScalar ID Hibernate LONG addScalar NAME addScalar BIRTHDATE Esta a mesma consulta de antes mas desta vez O Result SetMetaData utilizado para decidir o tipo de NOME e DATA DE NASCIMENTO onde o tipo de ID explicitamente especificado Como o java sql Types retornados do ResultSetMetadata mapeado para os tipos Hibernate ele controlado pelo Dialeto Se um tipo espec fico n o mapeado ou n o resulta no tipo esperado poss vel padroniza lo atrav s de chamadas para registerHibernateType no Dialeto 17 1 2 Consultas de Entidade As consultas acima foram todas sobre o retorno de valores escalares basicamente retornando os valores n o processados do conjunto de resultados A seguir mostramos como obter objetos de entidade da consulta sql nativa atrav s do addEntity sess createSQLQuery SELECT FROM CATS addEntity Cat class sess createSQLQuery SELECT ID NAME BIRTHDATE FROM CATS addEntity Cat class Esta consulta especificou A string da consulta SQL A entidade retornada por uma consulta Considerando que o Cat esteja mapeado como uma classe com colunas ID NOME e DATA DE NASCIM
388. t lt class name Child gt lt id name id gt lt generator class sequence gt lt id gt lt property name name gt lt class gt lt hibernate mapping gt Por outro lado se um filho puder ter os m ltiplos pais a associa o apropriada sera muitos para muitos lt hibernate mapping gt lt class name Parent gt lt id name id gt lt generator class sequence gt lt id gt lt set name children table childset gt 128 Exemplos de cole es lt key column parent id gt lt many to many class Child column child id gt lt set gt lt class gt lt class name Child gt lt id name id gt lt generator class sequence gt lt id gt lt property name name gt lt class gt lt hibernate mapping gt Defini es das tabelas create table parent id bigint not null primary key create table child id bigint not null primary key name varchar 255 create table childset parent id bigint not null child id bigint not null primary key parent id child id alter table childset add constraint childsetfk0 parent id references parent alter table childset add constraint childsetfkl child id references child For more examples and a complete explanation of a parent child relationship mapping see Capitulo 22 Exemplo Pai Filho for more information At mesmo o mapeamento de associa es mais complexos ser o discutimos no pr ximo c
389. t lt class gt Caso uma coluna chave externa adjacente for NOT NULL importante que voc defina not null true no elemento lt key gt no mapeamento na cole o se a coluna de chave externa para NOT NULL N o declare como not null true apenas um elemento aninhado lt column gt mas sim o elemento lt key gt 7 4 2 Um para um Uma associa o bidirecional um para um em uma chave externa bastante comum lt class name Person gt lt id name id column personId gt lt generator class native gt Jide lt many to one name address column addressId unique true not null true gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt one to one name person property ref address gt lt class gt 137 Capitulo 7 Mapeamento de ass create table Person personId bigint not null primary key addressId bigint not null unique create table Address addressId bigint not null primary key Uma associa o bidirecional um para um em uma chave prim ria usa um gerador de id especial lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt one to one name address gt lt class gt lt class name Address gt lt id name id column personId gt lt generator class foreign gt lt param name property gt person lt param g
390. t lt generator gt lt id gt lt one to one name person constrained true gt elass gt create table Person personId bigint not null primary key create table Address personId bigint not null primary key 7 5 Associa es Bidirecionais com tabelas associativas 7 5 1 Um para muitos muitos para um Segue abaixo uma amostra da associa o bidirecional um para muitos em uma tabela de uni o Veja que inverse true pode ser colocado em qualquer ponta da associa o na cole o ou na uni o lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt set name addresses table PersonAddress gt lt key column personId gt 138 Um para um lt many to many column addressId unique true class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt 6 siel lt join table PersonAddress inverse true optional true gt lt key column addressId gt lt many to one name person column personId not null true gt lt join gt lt class gt create table Person personId bigint not null primary key create table PersonAddress personId bigint not null addressId bigint not null primary key create table Address addressId bigint not null primary key 7 5 2 Um para um Uma associa o bidirecional um para um em uma
391. t SybaseDialect Sybase Qualquer lugar org hibernate dialect SybaseAnywhereDialect Servidor Microsoft SQL org hibernate dialect SQLServerDialect SAP DB org hibernate dialect SAPDBDialect Informix org hibernate dialect InformixDialect HypersonicSQL org hibernate dialect HSQLDialect Ingres org hibernate dialect IngresDialect Progresso org hibernate dialect ProgressDialect Mckoi SQL org hibernate dialect MckoiDialect Interbase org hibernate dialect InterbaseDialect Base Ponto org hibernate dialect PointbaseDialect Base Frontal org hibernate dialect FrontbaseDialect Firebird org hibernate dialect FirebirdDialect 3 4 2 Busca por uniao externa Outer Join Fetching Se seu banco de dados suporta uni o externa no estilo ANSI Oracle ou Sybase a outer join fetching frequentemente aumentar o desempenho limitando o numero de chamadas round trips para e a partir do banco de dados No entanto isto ao custo de possivelmente mais trabalho 46 Fluxos Binarios Binary Streams desempenhado pelo pr prio banco de dados A busca por uni o externa outer join fetching permite um gr fico completo de objetos conectados por associa es muitos para um um para muitos muitos para muitos e um para um para serem recuperadas em uma simples instru o SQL SELECT A busca por uni o externa pode ser desabilitada globalmente configurando a propriedade hibernate max fetch depth para 0 Um valor 1 ou maior habilita a busca p
392. t class name Product table products gt lt id name id gt lt generator class native gt tds lt property name serialNumber gt lt class gt lt hibernate mapping gt customers orders line items products recebem os dados de customer order line item e product respectivamente line items tamb m atua como uma tabela de associa o ligando ordens a produtos create table customers id BIGINT not null generated by default as identity name VARCHAR 255 primary key id create table orders id BIGINT not null generated by default as identity customer id BIGINT date TIMESTAMP primary key id create table line items line number INTEGER not null order id BIGINT not null product id BIGINT quantity INTEGER primary key order id line number create table products id BIGINT not null generated by default as identity serialNumber VARCHAR 255 primary key id 316 Exemplos variados de mapeamento alter table orders add constraint ordersFKO foreign key customer id references customers alter table line_items add constraint line_itemsFKO foreign key product_id references products alter table line_items add constraint line_itemsFK1 foreign key order id references orders 24 4 Exemplos variados de mapeamento Todos estes exemplos s o retirados do conjunto de testes do Hibernate La voc encontrar v rios outros exemplos teis de mapeamentos Verifique o diret
393. t column hol date type date gt lt map gt Nota Note que o valor da fun o order by uma ordena o SQL e n o uma ordena o Associa es podem tamb m ser escolhidas por algum crit rio arbritr rio em tempo de espera usando uma cole o filter sortedUsers s createFilter group getUsers order by this name list 6 3 2 Associa es Bidirecionais Uma associa o bidirecional permite a navega o de ambos os lados da associa o Dois dos casos de associa o bidirecional s o suportados Um para muitos conjunto ou bag de valor em um dos lados valor nico do outro Muitos para muitos Conjunto ou bag com valor em ambos os lados Voc deve especificar uma associa o muitos para muitos bidirecional simplesmente mapeando as duas associa es muitos para muitos para alguma tabela de banco de dados e declarando um dos lados como inverso Voce n o poder selecionar uma cole o indexada Segue aqui um exemplo de uma associa o muitos para muitos bidirecional Cada categoria pode ter muitos tens e cada tem pode estar em v rias categorias 122 Associa es Bidirecionais lt class name Category gt lt id name id column CATEGORY_ID gt lt bag name items table CATEGORY_ITEM gt lt key column CATEGORY_ID gt lt many to many class Item column ITEM_ID gt lt bag gt lt class gt lt class name Item gt lt id name id column ITEM_ID
394. t id gt lt one to many class Child gt lt set gt Apesar do mapeamento da cole o especificar inverse true as cascatas ainda s o processadas por repeti o dos elementos de cole o Portanto se voc requiser que um objeto seja salvo deletado ou atualizado por uma cascata voc dever adicion lo sua cole o Chamar setParent n o o bastante 300 Cascatas e unsaved value 22 4 Cascatas unsaved value Suppose we loaded up a Parent in one session made some changes in a UI action and wanted to persist these changes in a new session by calling update The Parent will contain a collection of children and since the cascading update is enabled Hibernate needs to know which children are newly instantiated and which represent existing rows in the database We will also assume that both Parent and child have generated identifier properties of type Long Hibernate will use the identifier and version timestamp property value to determine which of the children are new See Se o 10 7 Detec o autom tica de estado In Hibernate3 it is no longer necessary to specify an unsaved value explicitly O seguinte c digo atualizara O parent O childe inserir um newChild parent and child were both loaded in a previous session parent addChild child Child newChild new Child parent addChild newChild session update parent session flush Bem isto cabe bem no caso
395. tante que a session seja fechada e a transa o terminada antes de retornar para o usu rio mesmo que uma exce o ocorra durante a renderiza o da view Veja o Wiki do Hibernate para exemplos do pattern Abrir Sess o em View Em uma aplica o com uma camada de neg cios separada a l gica de neg cios deve preparar todas as cole es que ser o usadas pela camada web antes de retornar Isto sgnifica que a camada de neg cios deve carregar todos os dados e retorn los j inicializados para a camada de apresenta o que representada para um caso de uso particular 272 Usando busca em lote Geralmente a aplica o chama Hibernate initialize para cada cole o que ser usada pela camada web essa chamada deve ocorrer antes da sess o ser fechada ou retorna a cole o usando uma consulta Hibernate com uma cl usula FETCH OU UM FetchMode JOIN na Criteria Fica muito mais f cil se voc adotar o modelo Command ao inv s do Session Facade Voc tamb m pode anexar um objeto previamente carregado em uma nova Sessionmerge OU lock antes de acessar cole es n o inicializadas ou outros proxies O Hibernate n o faz e certamente n o deve fazer isso automaticamente pois isso introduziria sem ntica em transa es impromptu s vezes voc n o quer inicializar uma cole o muito grande mas precisa de algumas informa es como o mesmo tamanho ou um subconjunto de seus dados Voc pode usar um
396. te on the lt many to many gt nested element unique optional enables the DDL generation of a unique constraint for the foreign key column This makes the association multiplicity effectively one to many not found optional defaults to exception specifies how foreign keys that reference missing rows will be handled ignore will treat a missing row as a null association ent ity name optional the entity name of the associated class as an alternative to class oo oo property ref optional the name of a property of the associated class that is joined to this foreign key If not specified the primary key of the associated class is used 118 Cole es de valores e associa es muitos para muitos Segue abaixo alguns exemplos Um conjunto de strings lt set name names table person names gt lt key column person id gt lt element column person name type string gt lt set Uma bag contendo inteiros com uma ordem de itera o determinada pelo atributo order by lt bag name sizes table item sizes order by size asc gt lt key column item_id gt lt element column size type integer gt lt bag gt Uma matriz de entidades neste caso uma associa o muitos para muitos lt array name addresses table PersonAddress cascade persist gt lt key column personId gt lt list index column sortOrder gt lt many to many column addressId class Addres
397. tens o sar arquivo de servi o Voc tamb m pode precisar envolver o Hibernate suas bibliotecas de terceiros solicitadas suas classes persistentes compiladas assim como seus arquivos de mapeamento no mesmo arquivo Seus beans de empresa geralmente beans de sess o podem ser mantidos em seus pr prios arquivos JAR mas voc poder incluir estes arquivos EJB JAR no arquivo de servi o principal para conseguir uma nica unidade de hot deployable Consulte a documenta o do JBoss AS para maiores informa es sobre o servi o JMX e implementa o EJB 54 Classes Persistentes As classes persistentes sao classes dentro de um aplicativo que implementa as entidades de problemas de negocios ex Cliente e Pedido em um aplicativo e commerce Nem todas as instancias de uma classe persistente estao em estado persistente uma instancia pode ao inv s disso ser transiente ou desanexada O Hibernate trabalha melhor se estas classes seguirem uma regra simples tamb m conhecida como modelo de programa o Objeto de Java Antigo Simples POJO No entanto nenhuma destas regras s o dif ceis solicita es Certamente o Hibernate3 considera muito pouco da natureza de seus objetos persistentes Voc pode expressar um modelo de dom nio de outras formas por exemplo utilizando rvores de inst ncias map 4 1 Um exemplo simples de POJO A maior parte dos aplicativos Java requerem uma classe persistente que representa os feli
398. ter para um exemplo simples de persist ncia para uma Hashtable Observe que as configura es dynamic update dynamic insert nao s o herdadas pelas subclasses e assim podem tamb m ser especificadas em elementos lt subclass gt OU lt joined subclass gt Estas configura es podem incrementar o desempenho em alguns casos mas podem realmente diminuir o desempenho em outras O uso de select before update geralmente ir diminuir o desempenho Ela muito til para prevenir que um trigger de atualiza o no banco de dados seja ativado desnecessariamente se voc reconectar um n de uma inst ncia desconectada em uma session Se voc ativar dynamic update voc ter de escolher a estrat gia de bloqueio otimista version verifica as colunas de vers o timestamp all verifica todas as colunas dirty verifica as colunas modificadas permitindo algumas atualiza es concorrentes none n o utiliza o bloqueio otimista N s realmente recomendamos que voc utilize as colunas de vers o timestamp para o bloqueio otimista com o Hibernate Esta a melhor estrat gia em rela o ao desempenho e a nica estrat gia que trata corretamente as modifica es efetuadas em inst ncias desconectadas por exemplo quando session merge utilizado N o h diferen a entre uma vis o e uma tabela para o mapeamento do Hibernate e como esperado isto transparente no n vel do banco de dados mesmo que alguns bancos de
399. teria A interface org hibernate Criteria representa a consulta ao inv s de uma classe persistente particular A sess o uma f brica para inst ncias de criteria Criteria crit sess createCriteria Cat class crit setMaxResults 50 List cata yenealie glhansie 5 16 2 Limitando o conjunto de resultados Um crit rio individual de consulta uma inst ncia da interface org hibernate criterion Criterion A classe org hibernate criterion Restrictions define os m todos da fabrica para obter certos tipos de criterion pr fabricados List cats sess createCriteria Cat class add Restrictions like name Fritz add Restrictions between weight minWeight maxWeight Lists Restri es podem ser logicamente agrupadas List cats sess createCriteria Cat class add Restrictions like name Fritz add Restrictions or Restrictions eq age new Integer 0 Restrictions isNull age DR as aaa ec List cats sess createCriteria Cat class sadd Restrictions in name new Stringi Fritz Izi Pk VD add Restrictions disjunction add Restrictions isNull age add Restrictions eq age new Integer 0 add Restrictions eq age new Integer 1 add Restrictions eq age new Integer 2 ee alng Oy 235 Capitulo 16 Consultas por cr Existe um grande numero de crit rios pr fabricados subclasses de Restrictions Um dos mais teis pe
400. terpreta o length n mero comprimento da coluna precision n mero precis o da coluna decimal scale n mero esca a de coluna decimal not null true false especifica que a coluna deveria ser nao anulavel unique true false especifica que a coluna deveria ter uma restri o nica index index name especifica o nome de um ndice multi coluna unique key foreign key unique key name foreign key name especifica o nome de uma restri o nica de coluna m ltipla especifica o nome da restri o de chave estrangeira gerada para uma associa o por um elemento de mapeamento lt one to one gt lt many to one gt lt key gt OU lt many to many gt Note que os lados inverse true n o ser o considerados pelo SchemaExport sql type SQL column type sobrescreve o tipo de coluna padr o fun o do elemento lt column gt somente default Expressao SQL especifica um valor padr o para a coluna check Express o SQL cria uma restri o de verifica o de SQL tanto na coluna quanto na tabela O elemento lt comment gt permite que voc especifique coment rios para esquema gerado lt class name Customer table CurCust gt lt comment gt Current customers only lt comment gt lt class lt property name balance gt lt column name bal gt lt comment gt Balance in USD lt comment gt lt column gt lt property gt 292 Executando a ferramenta Isto r
401. tes de manipul las Este caminho for a a aplica o a realizar sua pr pria checagem de vers o para assegurar a conversa o do isolamento da transa o Este caminho menos eficiente em termos de acesso ao banco de dados o caminho mais similar entidade EJBs foo is an instance loaded by a previous Session session factory opensSession Transaction t session beginTransaction int oldVersion foo getVersion session load foo foo getKey load the current state if oldVersion foo getVersion throw new StaleObjectStateException foo setProperty bar t commit iy session close A propriedade version mapeada usando lt version gt e o Hibernate vai increment l automaticamente durante a libera o se a entidade estiver alterada Claro se voc estiver operando em um ambiente de baixa concorr ncia de dados e n o precisar da checagem de vers o voc pode usar este caminho e apenas pular a checagem de vers o Nesse caso o ltimo commit realizado a estrat gia padr o para suas conversa es longas Tenha em mente que isto pode confundir os usu rios da aplica o como tamb m poder o ter atualiza es perdidas sem mensagens de erro ou uma possibilidade de ajustar mudan as conflitantes 197 Cap tulo 12 Transa es e Con Claro que a checagem manual da vers o somente poss vel em circunst ncias triviais e n o para a maioria de aplica es Freque
402. the query caches In fact we recommend that the the UpdateTimestampsCache region not be configured for expiry at all Note in particular that an LRU cache expiry policy is never appropriate Conforme mencionado acima a maioria das consultas nao se beneficiam do cache ou de seus resultados Portanto por padr o as consultas individuais n o est o em cache mesmo depois de ativar o cache de consulta Para habilitar o caching de resultados chame org hibernate Query setCacheable true Esta chamada permite que a consulta procure por resultados de caches existentes ou adicione seus resultados ao cache quando for executado GJ Nota O cache de consulta n o realiza o cache ao estado de entidades atuais no cache ele apenas realiza o cache nos valores identificadores e resultados do tipo de valor Por esta raz o o cache de consulta deve sempre ser usado em conjun o com o cache de segundo n vel para as entidades esperadas a sofrerem o cache como parte de um cache de resultado de consulta apenas com o cache de cole o 20 4 2 Regi es de cache de consulta Se voc solicitar um controle de granulado fino com pol ticas de validade do cache de consulta voc poder especificar uma regi o de cache nomeada para uma consulta em particular chamando Query setCacheRegion List blogs sess createQuery from Blog blog where blog blogger blogger setEntity blogger blogger setMaxResults 15 setCacheable true set
403. theEvent setDate theDate HibernateUtil getSessionFactory getCurrentSession save theEvent Event que tamb m 25 Capitulo 1 Tutorial O servlet esta completo agora Uma solicita o ao servlet ser processada com uma nica Session Transaction Quanto antes estiver no aplicativo aut nomo maior a chance do Hibernate vincular automaticamente estes objetos thread atual de execu o Isto lhe d a liberdade para inserir seu c digo e acessar a SessionFactory como desejar Geralmente usariamos um diagrama mais sofisticado e mover amos o c digo de acesso de dados para os objetos de acesso dos dados o modelo DAO Veja o Hibernate Wiki para mais exemplos 1 3 3 Implementando e testando Para implementar este aplicativo em testes n s devemos criar um Arquivo da Web WAR Primeiro n s devemos definir o descritor WAR como src main webapp WEB INF web xml lt xml version 1 0 encoding UTF 8 gt lt web app version 2 4 xmins http java sun com xml ns j2ee xmins xsi http www w3 0rg 2001 XMLSchema instance xsi schemaLocation http java sun com xml ns j2ee http java sun com xml ns j2ee web app 2 4 xsl sservlet gt lt servlet name gt Event Manager lt servlet name gt lt servlet class gt org hibernate tutorial web EventManagerServlet lt servlet class gt lt servlet gt lt servlet mapping gt lt servlet name gt Event Manager lt servlet name gt uel Dale cern gt eventman
404. tiva de seu DBMS 10 4 1 6 Itera o rolavel Se seu driver JDBC driver suportar ResultSets rolaveis a interface da consulta podera ser usada para obter um objeto de scrollableResults que permite uma navega o flex vel dos resultados de consulta Query q sess createQuery select cat name cat from DomesticCat cat order by cat name scrollapleResults cats qg soroll she Cs Qe find the first name on each page of an alphabetical list of cats by name firstNamesOfPages new ArrayList do String name cats getString 0 firstNamesOfPages add name while cats scroll PAGE_SIZE Now get the first page of cats pageOfCats new ArrayList eats betorerirst int i 0 while PAGE_SIZE gt i amp amp cats next pageOfCats add cats get 1 165 Cap tulo 10 Trabalhando com Cats close Note que uma conex o aberta de banco de dados e cursor requerida para esta fun o use setMaxResult setFirstResult se precisar da fun o de pagina o offline 10 4 1 7 Externando consultas nomeadas Voc pode tamb m definir consultas nomeadas no documento de mapeamento Lembre se de usar uma se o CDATA se sua consulta contiver caracteres que possam ser interpretados como marca o lt query name ByNameAndMaximumWeight gt lt CDATA from eg DomesticCat as cat where cat name and cat weight 2 gt lt query WA o O v ncu
405. to isto n o garante que o valor do identificador ser determinado inst ncia persistente imediatamente pois a determina o pode acontecer no per odo de limpeza O persist tamb m garante que isto n o executar uma declara o INSERT caso esta seja chamada fora dos limites da transa o Isto til em transa es de longa execu o com um contexto de Sess o persist ncia estendido save garante retornar um identificador Caso um INSERT necessita ser executado para obter o identificador ex gerador identidade e n o sequ ncia este INSERT acontece imediatamente independente de voc estar dentro ou fora da transa o Isto problem tico numa conversa o de longa execu o com um contexto de Sess o persist ncia estendido Alternativamente pode se atribuir o identificador usando uma vers o sobrecarregada de save DomesticCat pk new DomesticCat pk setColor Color TABBY pk setSex F pk setName PK pk setKittens new HashSet pk addKitten fritz sess save pk new Long 1234 Se o objeto persistido tiver associado objetos ex a cole o kittens no exemplo anterior esses objetos podem se tornar persistentes em qualquer ordem que se queira a n o ser que se tenha uma restri o NOT NULL em uma coluna de chave estrangeira Nunca h risco de viola o de restri es de chave estrangeira Assim pode se violar uma restri o NOT NULL Se save for usado nos objetos e
406. to para todas as classes persistentes O Hibernate precisa criar para voc os objetos usando Java Reflection O construtor pode ser privado por m a visibilidade do pacote requerida para a procura o da gera o em tempo de execu o e recupera o eficiente dos dados sem a instrumenta o de bytecode Salve este arquivo no diret rio src main java org hibernate tutorial domain 1 1 3 O mapeamento do arquivo O Hibernate precisa saber como carregar e armazenar objetos da classe de persist ncia aqui que o mapeamento do arquivo do Hibernate entrar em jogo O arquivo mapeado informa ao Hibernate qual tabela no banco de dados ele dever acessar e quais as colunas na tabela ele dever usar A estrutura b sica de um arquivo de mapeamento parecida com lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC _ Hibernate Hibernate Mapping DTD 3 0 EN O mapeamento do arquivo nttp hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package org hibernate tutorial domain gt eed lt hibernate mapping gt Note que o Hibernate DTD muito sofisticado Voc pode usar isso para auto conclusao no mapeamento XML dos elementos e fun es no seu editor ou IDE Voc tamb m pode abrir o arquivo DTD no seu editor Esta a maneira mais f cil de ter uma vis o geral de todos os elementos e fun es e dos padr es como tamb m alguns coment rios Note que o Hibernate n
407. transa o isto a funcionalidade do getCurrentSession para a propaga o f cil do contexto voc ter que usar diretamente a APIJTA UserTransaction BMT idiom with getCurrentSession try UserTransaction tx UserTransaction new InitialContext lookup java comp UserTransaction tx begin Do some work on Session bound to transaction factory getCurrentSession load factory getCurrentSession persist tx commit catch RuntimeException e tx rollback je throw e or display error message Com CMT a demarca o da transa o feita em descritores de implementa o de beans de sess o n o programaticamente consequentemente o c digo reduzido a 194 Tratamento de Exce o CMT idiom Session sess factory getCurrentSession do some work Em um CMT EJB at mesmo um rollback acontece automaticamente desde que uma exce o Runt imeExcept ion n o trat vel seja lan ada por um m todo de um bean de sess o que informa ao recipiente ajustar a transa o global ao rollback Isto significa que voc n o precisa mesmo usar a API Transaction do Hibernate com BMT ou CMT e voc obter a propaga o autom tica da Sess o atual limitada transa o Veja que voc dever escolher org hibernate transaction JTATransactionFactory Se voc usar o JTA diretamente BMT e org hibernate transaction CMTTransactionFactory em um bean de sess o CMT
408. tring gt lt property name address column ADDRESS type string gt lt many to one name organization column ORGANIZATION_ID class Organization gt lt bag name orders inverse true lazy false cascade all gt lt key column CUSTOMER ID gt lt one to many class Order gt lt bag gt lt class gt lt hibernate mapping gt Note que embora as associa es sejam declaradas utilizando nomes de classe o tipo alvo de uma associa o pode tamb m ser uma entidade din mica ao inv s de um POJO Ap s ajustar o modo de entidade padr o para dynamic map para a SessionFactory voc poder trabalhar com Maps de Maps no per odo de execu o Session s openSession Transaction tx s beginTransaction Create a customer Map david new HashMap david put name David Create an organization Map foobar new HashMap 60 Tuplizadores foobar put name Foobar Inc i Link both david put organization foobar Save both s save Customer david s save Organization foobar tx commit salose As vantagens de um mapeamento din mico s o o tempo de retorno r pido para realizar o prot tipo sem a necessidade de implementar uma classe de entidade No entanto voc perde o tipo de tempo de compila o verificando e muito provavelmente ter que lidar com muitas exce es de tempo de espera Gra as ao mapeamento
409. true return false public boolean onLoad Object entity Serializable id Object state String propertyNames Type types if entity instanceof Auditable loads return false public boolean onSave Object entity Serializable id Object state String propertyNames Type types if entity instanceof Auditable ereatesdado for int i 0 i lt propertyNames length i if createTimestamp equals propertyNames i state i new Date return true return false public void afterTransactionCompletion Transaction tx if tx wasCommitted System out println Creations creates Updates updates Loads loads updates 0 creates 0 loads 0 Os interceptadores se apresentam de duas formas session scoped e SessionFactory scoped Um interceptador delimitado da session definido quando uma sess o aberta usando o m todo sobrecarregado da SessionFactory openSession que aceita um Interceptor como par metro Session session sf openSession new AuditInterceptor 204 Sistema de Eventos Um interceptador da SessionFactory scoped definido no objeto configuration antes da SessionFactory ser instanciada Nesse caso o interceptador fornecido ser aplicado para todas as sess es abertas por aquela sessionFactory Isso apenas n o ocorrer caso seja especificado um interceptador no momento em que a sess o for aberta Um
410. u es de inser o est o desabilitados devido a um bug nos drivers da Oracle 5 1 4 2 Algoritmo Hi lo Os geradores hilo seghilo fornecem duas implementa es alternativas do algoritmo hi lo uma solu o preferencial para a gera o de identificadores A primeira implementa o requer uma tabela especial do banco de dados para manter o pr ximo valor hi dispon vel A segunda utiliza uma sequ ncia do estilo Oracle quando suportado lt id name id type long column cat id gt lt generator class hilo gt lt param name table gt hi_value lt param gt lt param name column gt next_value lt param gt lt param name max_lo gt 100 lt param gt lt generator gt lt 20 gt lt id name id type long column cat id gt lt generator class seghilo gt lt param name sequence 76 gt hi_value lt param gt lt param name max_lo gt 100 lt param gt lt generator gt Jaa gt Infelizmente voc nao pode utilizar hilo quando estiver fornecendo sua pr pria Connection para o Hibernate Quando o Hibernate estiver usando uma fonte de dados do servidor de aplica es para obter conex es suportadas com JTA voc precisar configurar adequadamente O hibernate transaction manager lookup class 5 1 4 3 Algoritmo UUID O UUID cont m o endere o IP hora de in cio da JVM que com precis o de um quarto de segundo a hora do sistema e um valor contador que nico dent
411. u rios do Hibernate escolham gravar o XML manualmente existem diversas ferramentas para gerar o documento de mapeamento incluindo o XDoclet Middlegen e AndroMDA Vamos iniciar com um exemplo de mapeamento lt xml version 1 0 gt lt DOCTYPE hibernate mapping PUBLIC Hibernate Hibernate Mapping DTD 3 0 EN http hibernate sourceforge net hibernate mapping 3 0 dtd gt lt hibernate mapping package eg gt lt class name Cat table cats discriminator value C gt lt id name id gt lt generator class native gt lt id gt lt discriminator column subclass type character gt lt property name weight gt lt property name birthdate type date not null true update false gt lt property name color type eg types ColorUseriype not null true update false gt lt property name sex not null true update false gt lt property name litterId column litterId update false gt 67 Capitulo 5 Mapeamento O R Basico lt many to one name mother column mother_id update false gt lt set name kittens inverse true order by litter id gt lt key column mother_id gt lt one to many class Cat gt lt set gt lt subclass name DomesticCat discriminator value D gt lt property name name type string gt lt subclass gt lt class gt lt class name Dog gt lt mapping for Dog could go here
412. uebrar o proxy Cat cat Cat session load Cat class id instantiate a Cat proxy DomesticCat dc 270 Proxies de associa o final nico DomesticCat session load DomesticCat class id acquire new DomesticCat proxy System out printin cat dc false Por m a situa o n o t o ruim como parece Mesmo quando temos duas refer ncias para objetos proxies diferentes a inst ncia adjacente ser do mesmo objeto cat setWeight 11 0 hit the db to initialize the proxy System out println de getWeight 11 0 E por terceiro voc n o pode usar um proxy CGLIB em uma classe final ou com quaisquer m todos final Finalmente se o seu objeto persistente adquirir qualquer recurso durante a instancia o ex em inicializadores ou construtor padr o ent o esses recursos ser o adquiridos pelo proxy tamb m A classe de proxy uma subclasse da classe persistente Esses problemas se d o devido limita o origin ria do modelo de heran a simples do Java Se voc quiser evitar esses problemas em suas classes persistentes voc deve implementar uma interface que declare seus m todos comerciais Voc deve especificar essas interfaces no arquivo de mapeamento onde catImp1 implementa a interface cat e DomesticCatImpl implementa a interface Domesticcat Por exemplo lt class name Cat Impl proxy Cat gt lt subclass gt lt class gt Ent o os proxies para inst ncias de cat
413. ues to be initialized along with their parent objects using a single select This is particularly useful in the case of a collection It effectively overrides the outer join and lazy declarations of the mapping file for associations and collections See Se o 20 1 Estrat gias de Busca for more information from Cat as cat inner join fetch cat mate left join fetch cat kittens Geralmente uma uni o de busca n o precisa atribuir um alias pois o objeto associado n o deve ser usado na cl usula where ou em qualquer outra cl usula Tamb m os objetos associados n o s o retornados diretamente nos resultados da consulta Ao inv s disso eles devem ser acessados usando o objeto pai A nica raz o pela qual precisariamos de um alias quando fazemos uma uni o de busca recursivamente em uma cole o adicional from Cat as cat inner join fetch cat mate left join fetch cat kittens child left join fetch child kittens Observe que a constru o busca n o deve ser usada em consultas invocadas usando iterate embora possa ser usado com scro11 O Fetch tamb m n o deve ser usado junto com O setMaxResults OU setFirstResult pois essas opera es s o baseadas nas linhas retornadas que normalmente cont m duplicidade devido busca das cole es ent o o n mero de linhas pode n o ser o que voc espera A Fetch n o deve ser usada junto com uma condi o with poss vel que seja criado um produto cartesiano pela busca
414. umn em todos os lugares O uso do elemento column apenas fornece mais op es de declara o das quais s o teis quando utilizando hbm2dd1 Uma associa o many to many para many to many tamb m usa a chave estrangeira composta lt set name undeliveredOrderLines gt lt key column name warehouseld gt lt many to many class OrderLine gt lt column name lineId gt lt column name orderId gt lt column name customerId gt lt many to many gt lt set gt A cole o de orderLines em order usaria lt set name orderLines inverse true gt lt key gt lt column name orderId gt lt column name customerId gt lt key gt lt one to many class OrderLine gt lt set gt O elemento lt one to many gt n o declara colunas Se orderLine possui uma cole o ela tamb m tem uma chave externa composta lt class name OrderLine gt lt list name deliveryAttempts gt lt key gt lt a collection inherits the composite key type gt lt column name lineId gt lt column name orderId gt 148 Componentes Dinamicos lt column name customerId gt lt key gt lt list index column attemptId base 1 gt lt composite element class DeliveryAttempt gt lt composite element gt lt set gt lt class 8 5 Componentes Din micos Voc pode at mesmo mapear uma propriedade do tipo map lt dynamic component name userAttributes gt
415. unas Este recurso ajuda a reduzir a verbosidade do documento de mapeamento eliminando interfer ncias repetitivas TBL_ prefixos por exemplo A estrat gia padr o usada pelo Hibernate bastante m nima Voc pode especificar uma estrat gia diferente ao chamar Configuration setNamingStrategy antes de adicionar os mapeamentos SessionFactory sf new Configuration setNamingStrategy ImprovedNamingStrategy INSTANCE addFile Item hbm xm1 addFile Bid hbm xml buildSessionFactory org hibernate cfg ImprovedNamingStrategy uma estrat gia interna que pode ser um ponto inicial Util para algumas aplica es 3 7 Arquivo de configura o XML Uma maneira alternativa de configura o especificar uma configura o completa em um arquivo chamado hibernate cfg xm1 Este arquivo pode ser usado como um substituto para o arquivo hibernate properties OU se ambos estiverem presentes para substituir propriedades O arquivo XML de configura o deve ser encontrado na ra z do seu CLASSPATH Veja um exemplo lt xml version 1 0 encoding utf 8 gt lt DOCTYPE hibernate configuration PUBLIC _ Hibernate Hibernate Configuration DTD EN hnttp hibernate sourceforge net hibernate configuration 3 0 dtd gt lt hibernate configuration gt lt a SessionFactory instance listed as jndi name gt lt session factory name java hibernate SessionFactory gt si properties gt lt property na
416. unidirecional um para muitos em uma chave externa um caso muito incomum e realmente n o recomendada lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt set name addresses gt lt key column personId not null true gt lt one to many class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressId gt lt generator class native gt lt id gt lt class gt create table Person personId bigint not null primary key create table Address addressId bigint not null primary key personId bigint not null Acreditamos ser melhor usar uma tabela associativa para este tipo de associa o 7 3 Associa es Unidirecionais com tabelas associativas 7 3 1 Um para muitos Uma associa o um para muitos unidirecional usando uma tabela associativa o mais comum Note que se especificarmos unique true estaremos modificando a multiplicidade de muitos para muitos para um para muitos lt class name Person gt lt id name id column personId gt lt generator class native gt lt id gt lt set name addresses table PersonAddress gt 133 Capitulo 7 Mapeamento de ass lt key column personId gt lt many to many column addressId unique true class Address gt lt set gt lt class gt lt class name Address gt lt id name id column addressI
417. us objetos e n o necessariamente a execu o de instru es SQL O Hibernate respons vel por esta parte e relevante aos desenvolvedores de aplica es apenas quando est o ajustando o desempenho do sistema 10 1 Estado dos objetos no Hibernate O Hibernate define e suporta os seguintes estados de objetos Transient um objeto transiente se ele foi instanciando usando apenas o operador new e n o foi associado a uma session do Hibernate Ele n o possui uma representa o persistente no banco de dados e n o lhe foi atribu do nenhum identificador Inst ncias transientes ser o destru das pelo coletor de lixo se a aplica o n o mantiver sua refer ncia Use uma session do Hibernate para tornar o objeto persistente e deixe o Hibernate gerenciar as instru es SQL que ser o necess rias para executar esta transi o Persistent uma inst ncia persistente possui uma representa o no banco de dados e um identificador Ela pode ter sido salva ou carregada portanto ela se encontra no escopo de uma Session O Hibernate ir detectar qualquer mudan a feita a um objeto persistente e sincronizar o seu estado com o banco de dados quando completar a unidade de trabalho Desenvolvedores n o executam instru es manuais de UPDATE OU instru es de DELETE quando o objeto se tornar transiente Detached uma inst ncia desanexada um objeto que foi persistido mas sua session foi fechada A refer ncia ao o
418. user hibernate connection password secret hibernate c3p0 min size 5 hibernate c3p0 max size 20 hibernate c3p0 timeout 1800 hibernate c3p0 max statements 50 hibernate dialect org hibernate dialect PostgreSQLDialect Para usar dentro de um servidor de aplica o voc deve configurar o Hibernate para obter conex es de um servidor de aplica o javax sql Datasource registrado no JNDI Voc precisar determinar pelo menos uma das seguintes propriedades Tabela 3 2 Propriedades do Datasource do Hibernate Nome da Propriedade Prop sito hibernate connection datasource datasource JNDI name hibernate jndi ur URL do fornecedor JNDI opcional hibernate jndi class classe de JNDI InitialContextFactory opcional 37 Capitulo 3 Configuration Nome da Propriedade Prop sito hibernate connection username usu rio de banco de dados opcional hibernate connection password senha de usu rio de banco de dados opcional Eis um exemplo de arquivo hibernate properties para um servidor de aplica o fornecedor de fontes de dados JNDI hibernate connection datasource java comp env jdbc test hibernate transaction factory class org hibernate transaction JTATransactionFactory hibernate transaction manager lookup class org hibernate transaction JBossTransact ionManagerLookup hibernate dialect org hibernate dialect PostgreSQLDialect Conex es JDBC obtidas de um datasource JNDI ir o automaticament
419. vgWeight S EO List results session createCriteria Domestic class cat createAlias kittens kit setProjection Projections projectionList add Projections property cat name catName add Projections property kit name kitName addOrder Order asc catName addOrder Order asc kitName Listy Voc tamb m pode usar um Property forName para expressar proje es List results session createCriteria Cat class setProjection Property forName name add Property forName color eq Color BLACK alist List results session createCriteria Cat class setProjection Projections projectionList add Projections rowCount as catCountByColor 240 Consultas e subconsultas desanexadas add Property forName weight avg as avgWeight add Property forName weight max as maxWeight Fadd Property orName Mcolon Group las color add rder Order desc catCountByColor addOrder Order desc avgWeight otite Ora 16 8 Consultas e subconsultas desanexadas A classe DetachedCriteria deixa voc criar uma consulta fora do escopo de uma sess o e depois execut la usando alguma session arbitr ria DetachedCriteria query DetachedCriteria forClass Cat class add Property forName sex eq F Session session Transaction txn session beginTransaction List results query getExecuta
420. vm De onde o Hibernate deve recuperar o valor timestamp Do banco de dados ou da JVM atual Timestamps baseados em banco de dados levam a um overhead porque o Hibernate precisa acessar o banco de dados para determinar o pr ximo valor mas mais seguro para uso em ambientes de cluster Observe tamb m que nem todos os Dialects suportam a recupera o do carimbo de data e hora atual do banco de dados enquanto outros podem n o ser seguros para utiliza o em bloqueios pela falta de precis o Oracle 8 por exemplo generated opcional padr o para never Especifica que o valor da propriedade timestamp gerado pelo banco de dados Veja a discuss o do generated properties para maiores informa es Nota Observe que 0 lt timestamp gt equivalente a lt version type timestamp gt E lt timestamp source db gt equivalente a lt version type dbtimestamp gt 5 1 11 Propriedade O elemento lt property gt declara uma propriedade de estilo JavaBean de uma classe lt property name propertyName column column_name ooo type typename 84 Propriedade Hes update true false insert true false formula arbitrary SQL expression access field property ClassName lazy true false unique true false not null troel falset optimistic lock true false 900000099 generated never insert always node element name attribute name element attribute index index_name
421. xistem tr s escolhas ou internas padr es org hibernate transaction JDBCTransactionFactory delega as transa es JDBC para bases de dados Padr o org hibernate transaction JTATransactionFactory delega para uma transa o um container gerenciado se uma transa o existente estiver de acordo neste contexto ex m todo bean de sess o EJB No entanto uma nova transa o ser iniciada e ser o usadas transa es controladas por um bean org hibernate transaction CMTTransactionFactory delega para um container gerenciador de transa es JTA Voc tamb m pode definir suas pr prias estrat gias de transa o para um servi o de transa o CORBA por exemplo Algumas caracter sticas no Hibernate ex o cache de segundo n vel sess es contextuais com JTA etc requerem acesso a JTA TransactionManager em um ambiente controlado Em um 51 Capitulo 3 Configuration servidor de aplica o voc tem que especificar como o Hibernate pode obter uma refer ncia para a TransactionManager pois o J2EE n o padroniza um mecanismo simples Tabela 3 10 Gerenciadores de transa es JTA Factory de Transa o Servidor de Aplica o org hibernate transaction JBossTransactionManagerLookup JBoss org hibernate transaction WeblogicTransactionManagerLookup Weblogic org hibernate transaction WebSphereTransactionManagerLookup WebSphere org hibernate transaction WebSphereExtendedJTATransact ionLookWWebSphere 6
422. y bundle their appropriate entity name so we simply extract it from there if this represents one of our proxies otherwise we return null if Proxy isProxyClass object getClass InvocationHandler handler Proxy getInvocationHandler object if DataProxyHandler class isAssignableFrom handler getClass DataProxyHandler myHandler DataProxyHandler handler return myHandler getEntityName return null various other utility methods The EntityNameResolver implementation IMPL NOTE An EntityNameResolver really defines a strategy for how entity names should be resolved Since this particular impl can handle resolution for all of our entities we want to take advantage of the fact that SessionFactoryImpl keeps these in a Set so that we only ever have one instance registered Why Well when it comes time to resolve an entity name Hibernate must iterate over all the registered resolvers So keeping that number down helps that process be as speedy as possible Hence the equals and hashCode impls EA public class MyEntityNameResolver implements EntityNameResolver public static final MyEntityNameResolver INSTANCE new MyEntityNameResolver public String resolveEntityName Object entity return ProxyHelper extractEntityName entity public boolean equals Object obj return getClass equals obj getClass public int hashCode return getClass hashCode public
423. ying database However an insidious implication of this approach comes about when targtetting some databases which support identity generation and some which do not identity generation relies on the SQL definition of an IDENTITY or auto increment column to manage the identifier value it is what is known as a post insert generation strategy becauase the insert must actually happen before we can know the identifier value Because Hibernate relies on this identifier value to uniquely reference entities within a persistence context it must then issue the insert immediately when the users requests the entitiy be associated with the session like via save e g regardless of current transactional semantics Nota Hibernate was changed slightly once the implication of this was better understood so that the insert is delayed in cases where that is feasible The underlying issue is that the actual semanctics of the application itself changes in these cases Starting with version 3 2 3 Hibernate comes with a set of enhanced http in relation to 2082 lace identifier generators targetting portability in a much different way 328 Fun es do banco de dados e Nota q There are specifically 2 bundled enhancedgenerators org hibernate id enhanced SequenceStyleGenerator org hibernate id enhanced TableGenerator The idea behind these generators is to port the actual semantics of the identifer value generation to the different dat
424. zip length 5 gt lt property name balance precision 12 scale 2 gt Algumas tags aceitam uma fun o not nu11 para gerar uma restri o NoT NULLNAS colunas de tabela e uma fun o unique para gerar uma restri o UNIQUE em colunas de tabela lt many to one name bar column barid not null true gt lt element column serialNumber type long not null true unique true gt Uma fun o uni que key pode ser usada para agrupar colunas em uma restri o de chave nica Atualmente o valor espec fico da fun o unique key n o usada para nomear a restri o no DDL gerado somente para agrupar as colunas no arquivo de mapeamento lt many to one name org column orgid unique key OrgEmployeeId gt lt property name employeeId unique key OrgEmployee gt Uma fun o index especifica o nome de um indexe que ser criado usando a coluna ou colunas mapeada s As colunas m ltiplas podem ser agrupadas no mesmo indexe simplesmente especificando o mesmo nome de ndice lt property name lastName index CustName gt lt property name firstName index CustName gt Uma fun o foreign key pode ser usada para sobrescrever o nome de qualquer restri o de chave exterior gerada lt many to one name bar column barid foreign key FKFooBar gt Muitos elementos de mapeamento tamb m aceitam um elemento filho lt column gt Isto particularmente til para mapeamento de tipos multi co
Download Pdf Manuals
Related Search
Related Contents
ZENO Cad Update User Manual カタログ Drivven Combustion Analysis Toolkit (DCAT) User`s Manual PAC MK 30 / 50 BC 安全上の注意について Cahier Pédagogique Enfance WOLF-Garten Select 3200 E intext:Bedienungsanleitung filetype:pdf PLAN TOURISTIQUE - Communauté de Communes de la Presqu`île Copyright © All rights reserved.
Failed to retrieve file