3
"Project-Id-Version: PACKAGE VERSION\n"
4
"Report-Msgid-Bugs-To: http://bugs.kde.org\n"
5
"POT-Creation-Date: 2009-06-10 21:02+0000\n"
6
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
7
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
"Language-Team: LANGUAGE <LL@li.org>\n"
10
"Content-Type: text/plain; charset=UTF-8\n"
11
"Content-Transfer-Encoding: 8bit\n"
14
#: transactions.xml:29
16
msgid "Transactions and Concurrency"
17
msgstr "Transações e Concorrência"
20
#: transactions.xml:31
23
"The most important point about Hibernate and concurrency control is that it "
24
"is easy to understand. Hibernate directly uses JDBC connections and JTA "
25
"resources without adding any additional locking behavior. It is recommended "
26
"that you spend some time with the JDBC, ANSI, and transaction isolation "
27
"specification of your database management system."
29
"O ponto o mais importante sobre o Hibernate e o controle de concorrência é "
30
"que é muito fácil de ser compreendido. O Hibernate usa diretamente conexões "
31
"de JDBC e recursos de JTA sem adicionar nenhum comportamento de bloqueio a "
32
"mais. Nós altamente recomendamos que você gaste algum tempo com o JDBC, o "
33
"ANSI e a especificação de isolamento de transação de seu sistema de gerência "
37
#: transactions.xml:38
40
"Hibernate does not lock objects in memory. Your application can expect the "
41
"behavior as defined by the isolation level of your database transactions. "
42
"Through <literal>Session</literal>, which is also a transaction-scoped "
43
"cache, Hibernate provides repeatable reads for lookup by identifier and "
44
"entity queries and not reporting queries that return scalar values."
46
"O Hibernate não bloqueia objetos na memória. Sua aplicação pode esperar o "
47
"comportamento tal qual definido pelo nível de isolamento de suas transações "
48
"de banco de dados. Note que graças ao <literal>Session</literal>, que também "
49
"é um cache de escopo de transação, o Hibernate fornece leituras repetíveis "
50
"para procurar por identificadores e consultas de entidade (não pesquisas de "
51
"relatórios que retornam valores escalares)."
54
#: transactions.xml:46
57
"In addition to versioning for automatic optimistic concurrency control, "
58
"Hibernate also offers, using the <literal>SELECT FOR UPDATE</literal> "
59
"syntax, a (minor) API for pessimistic locking of rows. Optimistic "
60
"concurrency control and this API are discussed later in this chapter."
62
"Além do versionamento para o controle automático de concorrência otimista, o "
63
"Hibernate oferece também uma API (menor) para bloqueio pessimista de linhas "
64
"usando a sintaxe <literal>SELECT FOR UPDATE</literal>. O controle de "
65
"concorrência otimista e esta API são discutidos mais tarde neste capítulo."
68
#: transactions.xml:53
71
"The discussion of concurrency control in Hibernate begins with the "
72
"granularity of <literal>Configuration</literal>, <literal>SessionFactory</"
73
"literal>, and <literal>Session</literal>, as well as database transactions "
74
"and long conversations."
76
"Nós começamos a discussão do controle de concorrência no Hibernate com a "
77
"granularidade do <literal>Configuration</literal>, <literal>SessionFactory</"
78
"literal>, e <literal>Session</literal>, além de transações de base de dados "
79
"e conversações longas."
82
#: transactions.xml:60
84
msgid "Session and transaction scopes"
85
msgstr "Session e escopos de transações"
88
#: transactions.xml:62
91
"A <literal>SessionFactory</literal> is an expensive-to-create, threadsafe "
92
"object, intended to be shared by all application threads. It is created "
93
"once, usually on application startup, from a <literal>Configuration</"
96
"Um <literal>SessionFactory</literal> é objeto threadsafe compartilhado por "
97
"todas as threads da aplicação que consome muitos recursos na sua criação. É "
98
"criado uma unica vez no inicio da execução da aplicação a partir da "
99
"instância de uma <literal>Configuration</literal>."
102
#: transactions.xml:68
103
#, fuzzy, no-c-format
105
"A <literal>Session</literal> is an inexpensive, non-threadsafe object that "
106
"should be used once and then discarded for: a single request, a conversation "
107
"or a single unit of work. A <literal>Session</literal> will not obtain a "
108
"JDBC <literal>Connection</literal>, or a <literal>Datasource</literal>, "
109
"unless it is needed. It will not consume any resources until used."
111
"Uma <literal>Session</literal> é um objeto de baixo custo de criação, não é "
112
"threadsafe, deve ser usado uma vez, para uma única requisição, uma "
113
"conversação, uma única unidade do trabalho e então deve ser descartado. Um "
114
"<literal>Session</literal> não obterá um JDBC <literal>Connection</literal> "
115
"(ou um <literal>Datasource</literal>) a menos que necessite, "
116
"conseqüentemente não consome nenhum recurso até ser usado."
119
#: transactions.xml:76
120
#, fuzzy, no-c-format
122
"In order to reduce lock contention in the database, a database transaction "
123
"has to be as short as possible. Long database transactions will prevent your "
124
"application from scaling to a highly concurrent load. It is not recommended "
125
"that you hold a database transaction open during user think time until the "
126
"unit of work is complete."
128
"Para completar, você também tem que pensar sobre as transações de base de "
129
"dados. Uma transação tem que ser tão curta quanto possível, para reduzir a "
130
"disputa pelo bloqueio na base de dados. Transações longas impedirão que sua "
131
"aplicação escale a carga altamente concorrente. Por isso, em um projeto "
132
"raramente é para manter uma transação de base de dados aberta durante o "
133
"tempo que o usuário pensa, até que a unidade do trabalho esteja completa."
136
#: transactions.xml:84
137
#, fuzzy, no-c-format
139
"What is the scope of a unit of work? Can a single Hibernate "
140
"<literal>Session</literal> span several database transactions, or is this a "
141
"one-to-one relationship of scopes? When should you open and close a "
142
"<literal>Session</literal> and how do you demarcate the database transaction "
143
"boundaries? These questions are addressed in the following sections."
145
"Qual é o escopo de uma unidade de trabalho? Pode uma únicoa "
146
"<literal>Session</literal> do Hibernate gerenciar diversas transações ou é "
147
"esta um o relacionamento um-para-um dos escopos? Quando deve você abrir e "
148
"fechar uma <literal>Session</literal> e como você demarca os limites da "
152
#: transactions.xml:92
155
msgstr "Unidade de trabalho"
158
#: transactions.xml:94
161
"First, let's define a unit of work. A unit of work is a design pattern "
162
"described by Martin Fowler as <quote> [maintaining] a list of objects "
163
"affected by a business transaction and coordinates the writing out of "
164
"changes and the resolution of concurrency problems. </quote><citation>PoEAA</"
165
"citation> In other words, its a series of operations we wish to carry out "
166
"against the database together. Basically, it is a transaction, though "
167
"fulfilling a unit of work will often span multiple physical database "
168
"transactions (see <xref linkend=\"transactions-basics-apptx\"/>). So really "
169
"we are talking about a more abstract notion of a transaction. The term "
170
"\"business transaction\" is also sometimes used in lieu of unit of work."
174
#: transactions.xml:111
175
#, fuzzy, no-c-format
177
"Do not use the <emphasis>session-per-operation</emphasis> antipattern: do "
178
"not open and close a <literal>Session</literal> for every simple database "
179
"call in a single thread. The same is true for database transactions. "
180
"Database calls in an application are made using a planned sequence; they are "
181
"grouped into atomic units of work. This also means that auto-commit after "
182
"every single SQL statement is useless in an application as this mode is "
183
"intended for ad-hoc SQL console work. Hibernate disables, or expects the "
184
"application server to disable, auto-commit mode immediately. Database "
185
"transactions are never optional. All communication with a database has to "
186
"occur inside a transaction. Auto-commit behavior for reading data should be "
187
"avoided, as many small transactions are unlikely to perform better than one "
188
"clearly defined unit of work. The latter is also more maintainable and "
191
"Primeiro, não use o antipattern <emphasis>sessão-por-operação</emphasis>, "
192
"isto é, não abra e não feche uma <literal>Session</literal> para cada "
193
"simples chamada ao banco de de dados em uma única thread! Naturalmente, o "
194
"mesmo é verdadeiro para transações. As chamadas a banco de dados em uma "
195
"aplicação são feitas usando uma seqüência planejada, elas são agrupadas em "
196
"unidades de trabalho atômicas. (Veja que isso também significa que um auto-"
197
"commit depois de cada sentença SQL é inútil em uma aplicação, esta "
198
"modalidade é ideal para o trabalho ad hoc do console do SQL. O Hibernate "
199
"impede, ou espera que o servidor de aplicação impessa isso, o uso da "
200
"modalidade de auto-commit.) As transações nunca são opcionais, toda a "
201
"comunicação com um banco de dados tem que ocorrer dentro de uma transação, "
202
"não importa se você vai ler ou escrever dados. Como explicado, o "
203
"comportamento auto-commit para leitura de dados deve ser evitado, como "
204
"muitas transações pequenas são improváveis de executar melhor do que uma "
205
"unidade claramente definida do trabalho. A última opção também muito mais "
206
"manutenível e extensível."
209
#: transactions.xml:126
210
#, fuzzy, no-c-format
212
"The most common pattern in a multi-user client/server application is "
213
"<emphasis>session-per-request</emphasis>. In this model, a request from the "
214
"client is sent to the server, where the Hibernate persistence layer runs. A "
215
"new Hibernate <literal>Session</literal> is opened, and all database "
216
"operations are executed in this unit of work. On completion of the work, and "
217
"once the response for the client has been prepared, the session is flushed "
218
"and closed. Use a single database transaction to serve the clients request, "
219
"starting and committing it when you open and close the <literal>Session</"
220
"literal>. The relationship between the two is one-to-one and this model is a "
221
"perfect fit for many applications."
223
"O pattern mais comum em uma aplicação multi-usuário cliente/servidor é "
224
"<emphasis>sessão-por-requisição</emphasis>. Neste modelo, uma requisição do "
225
"cliente é enviada ao servidor (onde a camada de persistência do Hibernate "
226
"roda), uma <literal>Session</literal> nova do Hibernate é aberta, e todas as "
227
"operações da base de dados são executadas nesta unidade do trabalho. Logo "
228
"que o trabalho for completado (e a resposta para o cliente for preparada), a "
229
"sessão é descarregad e fechada. Você usaria também uma única transação de "
230
"base de dados para servir às requisições dos clientes, começando e "
231
"commitando-o quando você abre e fecha a <literal>Session</literal>. O "
232
"relacionamento entre os dois é um-para-um e este modelo é um ajuste perfeito "
233
"para muitas aplicações."
236
#: transactions.xml:138
237
#, fuzzy, no-c-format
239
"The challenge lies in the implementation. Hibernate provides built-in "
240
"management of the \"current session\" to simplify this pattern. Start a "
241
"transaction when a server request has to be processed, and end the "
242
"transaction before the response is sent to the client. Common solutions are "
243
"<literal>ServletFilter</literal>, AOP interceptor with a pointcut on the "
244
"service methods, or a proxy/interception container. An EJB container is a "
245
"standardized way to implement cross-cutting aspects such as transaction "
246
"demarcation on EJB session beans, declaratively with CMT. If you use "
247
"programmatic transaction demarcation, for ease of use and code portability "
248
"use the Hibernate <literal>Transaction</literal> API shown later in this "
251
"O desafio encontra-se na implementação. O Hibernate fornece gerência "
252
"integrada da \"sessão atual\" para simplificar este pattern. Tudo que você "
253
"tem que fazer é iniciar uma transação quando uma requisição tem que ser "
254
"processada e termina a transação antes que a resposta seja enviada ao "
255
"cliente. Você pode fazer onde quiser, soluções comuns são "
256
"<literal>ServletFilter</literal>, interceptador AOP com um pointcut (ponto "
257
"de corte) nos métodos de serviço ou em um container de proxy/interceptação. "
258
"Um container de EJB é uma maneira padronizada para implementar aspectos "
259
"cross-cutting tais como a demarcação da transação em EJB session beans, "
260
"declarativamente com CMT. Se você se decidir usar demarcação programática de "
261
"transação, de preferencia a API <literal>Transaction</literal> do Hibernate "
262
"mostrada mais adiante neste capítulo, para fácilidade no uso e portabilidade "
266
#: transactions.xml:150
267
#, fuzzy, no-c-format
269
"Your application code can access a \"current session\" to process the "
270
"request by calling <literal>sessionFactory.getCurrentSession()</literal>. "
271
"You will always get a <literal>Session</literal> scoped to the current "
272
"database transaction. This has to be configured for either resource-local or "
273
"JTA environments, see <xref linkend=\"architecture-current-session\"/>."
275
"Seu código de aplicação pode acessar a \"sessão atual\" para processar a "
276
"requisição fazendo uma chamada simples a <literal>sessionFactory."
277
"getCurrentSession()</literal> em qualquer lugar e com a frequencia "
278
"necessária. Você sempre conseguirá uma <literal>Session</literal> limitada a "
279
"transação atual. Isto tem que ser configurado para recurso local ou os "
280
"ambientes JTA. Veja <xref linkend=\"architecture-current-session\"/>."
283
#: transactions.xml:158
284
#, fuzzy, no-c-format
286
"You can extend the scope of a <literal>Session</literal> and database "
287
"transaction until the \"view has been rendered\". This is especially useful "
288
"in servlet applications that utilize a separate rendering phase after the "
289
"request has been processed. Extending the database transaction until view "
290
"rendering, is achieved by implementing your own interceptor. However, this "
291
"will be difficult if you rely on EJBs with container-managed transactions. A "
292
"transaction will be completed when an EJB method returns, before rendering "
293
"of any view can start. See the Hibernate website and forum for tips and "
294
"examples relating to this <emphasis>Open Session in View</emphasis> pattern."
296
"Às vezes é conveniente estender o escopo de uma <literal>Session</literal> e "
297
"de uma transação do banco de dados até que a \"visão esteja renderizada\". É "
298
"especialmente útil em aplicações servlet que utilizam uma fase de "
299
"rendenderização separada depois que a requisição ter sido processada. "
300
"Estendendo a transação até que renderização da visão esteja completa é fácil "
301
"de fazer se você implementar seu próprio interceptador. Entretanto, não se "
302
"pode fazer facilmente se você confiar em EJBs com transações gerenciadas por "
303
"contêiner, porque uma transação será terminada quando um método de EJB "
304
"retornar, antes da renderização de toda visão puder começar. Veja o website "
305
"e o fórum do Hibernate para dicas e exemplos em torno deste pattern "
306
"<emphasis>Open Session in View</emphasis>."
309
#: transactions.xml:173
311
msgid "Long conversations"
312
msgstr "Longas conversações"
315
#: transactions.xml:175
316
#, fuzzy, no-c-format
318
"The session-per-request pattern is not the only way of designing units of "
319
"work. Many business processes require a whole series of interactions with "
320
"the user that are interleaved with database accesses. In web and enterprise "
321
"applications, it is not acceptable for a database transaction to span a user "
322
"interaction. Consider the following example:"
324
"O pattern sessão-por-requisição não é o único conceito útil que você pode "
325
"usar ao projetar unidades de trabalho. Muitos processos de negócio requerem "
326
"uma totalidade de séries de interações com o usuário intercaladas com "
327
"acessos a uma base de dados. Em aplicações web e corporativas não é "
328
"aceitável para uma transação atrapalhe uma interação do usuário. Considere o "
332
#: transactions.xml:185
333
#, fuzzy, no-c-format
335
"The first screen of a dialog opens. The data seen by the user has been "
336
"loaded in a particular <literal>Session</literal> and database transaction. "
337
"The user is free to modify the objects."
339
"A primeira tela de um diálogo abre os dados carregado pelo usuário em "
340
"através de <literal>Session</literal> e transação particulares. O usuário "
341
"está livre modificar os objetos."
344
#: transactions.xml:192
345
#, fuzzy, no-c-format
347
"The user clicks \"Save\" after 5 minutes and expects their modifications to "
348
"be made persistent. The user also expects that they were the only person "
349
"editing this information and that no conflicting modification has occurred."
351
"O usuário clica em \"Salvar\" após 5 minutos e espera suas modificações "
352
"serem persistidas; espera também que ele era a única pessoa que edita esta "
353
"informação e que nenhuma modificação conflitante possa ocorrer."
356
#: transactions.xml:200
357
#, fuzzy, no-c-format
359
"From the point of view of the user, we call this unit of work a long-running "
360
"<emphasis>conversation</emphasis> or <emphasis>application transaction</"
361
"emphasis>. There are many ways to implement this in your application."
363
"Nós chamamos esta unidade de trabalho, do ponto da visão do usuário, "
364
"executando uma longa <emphasis>conversação</emphasis> (ou "
365
"<emphasis>transação da aplicação</emphasis>). Há muitas maneiras de você "
366
"pode implementar em sua aplicação."
369
#: transactions.xml:206
370
#, fuzzy, no-c-format
372
"A first naive implementation might keep the <literal>Session</literal> and "
373
"database transaction open during user think time, with locks held in the "
374
"database to prevent concurrent modification and to guarantee isolation and "
375
"atomicity. This is an anti-pattern, since lock contention would not allow "
376
"the application to scale with the number of concurrent users."
378
"Uma primeira implementação simples pode manter a<literal>Session</literal> e "
379
"a transação aberta durante o tempo de interação do usuário, com bloqueios na "
380
"base de dados para impedir a modificação concorrente e para garantir o "
381
"isolamento e a atomicidade. Esse é naturalmente um anti-pattern, desde que a "
382
"disputa do bloqueio não permitiria o escalonameneto da aplicação com o "
383
"número de usuários concorrentes."
386
#: transactions.xml:214
387
#, fuzzy, no-c-format
389
"You have to use several database transactions to implement the conversation. "
390
"In this case, maintaining isolation of business processes becomes the "
391
"partial responsibility of the application tier. A single conversation "
392
"usually spans several database transactions. It will be atomic if only one "
393
"of these database transactions (the last one) stores the updated data. All "
394
"others simply read data (for example, in a wizard-style dialog spanning "
395
"several request/response cycles). This is easier to implement than it might "
396
"sound, especially if you utilize some of Hibernate's features:"
398
"Claramente, nós temos que usar diversas transações para implementar a "
399
"conversação. Neste caso, Manter o isolamento dos processos de negócio torna-"
400
"se responsabilidade parcial da camada da aplicação. Uma única conversação "
401
"geralmente usa diversas transações. Ela será atômica se somente uma destas "
402
"transações (a última) armazenar os dados atualizados, todas as outras "
403
"simplesmente leram os dados (por exemplo em um diálogo do estilo wizard que "
404
"mede diversos ciclos de requisição/resposta). Isto é mais fácil de "
405
"implementar do que pode parecer, especialmente se você usar as "
406
"características do Hibernate:"
409
#: transactions.xml:227
410
#, fuzzy, no-c-format
412
"<emphasis>Automatic Versioning</emphasis>: Hibernate can perform automatic "
413
"optimistic concurrency control for you. It can automatically detect if a "
414
"concurrent modification occurred during user think time. Check for this at "
415
"the end of the conversation."
417
"<emphasis>Versionamento automático</emphasis> - O Hibernate pode fazer o "
418
"controle automático de concorrência otimista para você, ele pode "
419
"automaticamente detectar se uma modificação concorrente ocorreu durante o "
420
"tempo de interação do usuário. Geralmente nós verificamos somente no fim da "
424
#: transactions.xml:235
425
#, fuzzy, no-c-format
427
"<emphasis>Detached Objects</emphasis>: if you decide to use the "
428
"<emphasis>session-per-request</emphasis> pattern, all loaded instances will "
429
"be in the detached state during user think time. Hibernate allows you to "
430
"reattach the objects and persist the modifications. The pattern is called "
431
"<emphasis>session-per-request-with-detached-objects</emphasis>. Automatic "
432
"versioning is used to isolate concurrent modifications."
434
"<emphasis>Detached Objects</emphasis>- se você se decidir usar o já "
435
"discutido pattern <emphasis>session-per-request</emphasis>, todas as "
436
"instâncias carregadas estarão no estado destacado durante o tempo em que o "
437
"usuário estiver pensando. O Hibernate permite que você reatache os objetos e "
438
"persita as modificações, esse pattern é chamado <emphasis>session-per-"
439
"request-with-detached-objects</emphasis>. É usado versionamento automatico "
440
"para isolar as modificações concorrentes."
443
#: transactions.xml:245
444
#, fuzzy, no-c-format
446
"<emphasis>Extended (or Long) Session</emphasis>: the Hibernate "
447
"<literal>Session</literal> can be disconnected from the underlying JDBC "
448
"connection after the database transaction has been committed and reconnected "
449
"when a new client request occurs. This pattern is known as <emphasis>session-"
450
"per-conversation</emphasis> and makes even reattachment unnecessary. "
451
"Automatic versioning is used to isolate concurrent modifications and the "
452
"<literal>Session</literal> will not be allowed to be flushed automatically, "
455
"<emphasis>Extended (or Long) Session</emphasis> A <literal>Session</literal> "
456
"do Hibernate pode ser desligada da conexão básica do JDBC depois que a "
457
"transação foi commitada e ser reconectado quando uma nova requisição do "
458
"cliente ocorrer. Este pattern é conhecido como <emphasis>session-per-"
459
"conversation</emphasis> e faz o reatamento uniforme desnecessário. "
460
"Versionamento automático é usado para isolar modificações concorrentes e a "
461
"<emphasis>session-per-conversation</emphasis> usualmente não é permitido "
462
"para ser nivelado automaticamente, e sim explicitamente."
465
#: transactions.xml:258
466
#, fuzzy, no-c-format
468
"Both <emphasis>session-per-request-with-detached-objects</emphasis> and "
469
"<emphasis>session-per-conversation</emphasis> have advantages and "
470
"disadvantages. These disadvantages are discussed later in this chapter in "
471
"the context of optimistic concurrency control."
473
"Ambos <emphasis>session-per-request-with-detached-objects</emphasis> e "
474
"<emphasis>session-per-conversation</emphasis> possuem vantagens e "
475
"desvantagens, nos discutiremos mais tarde neste capítulo no contexto do "
476
"controle de concorrência otimista."
479
#: transactions.xml:267
481
msgid "Considering object identity"
482
msgstr "Considerando a identidade do objeto"
485
#: transactions.xml:269
486
#, fuzzy, no-c-format
488
"An application can concurrently access the same persistent state in two "
489
"different <literal>Session</literal>s. However, an instance of a persistent "
490
"class is never shared between two <literal>Session</literal> instances. It "
491
"is for this reason that there are two different notions of identity:"
493
"Uma aplicação pode acessar concorrentemente o mesmo estado persistente em "
494
"duas <literal>Session</literal>s diferentes. Entretanto, uma instância de "
495
"uma classe persistente nunca é compartilhada entre duas instâncias "
496
"<literal>Session</literal>. Por tanto, há duas noções diferentes da "
500
#: transactions.xml:278
502
msgid "Database Identity"
503
msgstr "Identidade da base de dados"
506
#: transactions.xml:281
508
msgid "foo.getId().equals( bar.getId() )"
509
msgstr "foo.getId().equals( bar.getId() )"
512
#: transactions.xml:286
515
msgstr "Identidade da JVM"
518
#: transactions.xml:289
524
#: transactions.xml:295
525
#, fuzzy, no-c-format
527
"For objects attached to a <emphasis>particular</emphasis> <literal>Session</"
528
"literal> (i.e., in the scope of a <literal>Session</literal>), the two "
529
"notions are equivalent and JVM identity for database identity is guaranteed "
530
"by Hibernate. While the application might concurrently access the \"same"
531
"\" (persistent identity) business object in two different sessions, the two "
532
"instances will actually be \"different\" (JVM identity). Conflicts are "
533
"resolved using an optimistic approach and automatic versioning at flush/"
536
"Então para os objetos acoplados a um <literal>Session</literal> em "
537
"<literal>particular </literal> (isto é no escopo de um <literal>Session</"
538
"literal>), as duas noções são equivalentes e a identidade da JVM para a "
539
"identidade da base de dados é garantida pelo Hibernate. Entretanto, quando a "
540
"aplicação pode acessar concorrentemente o \"mesmo\" objeto do negócio "
541
"(identidade persistente) em duas sessões diferentes, as duas instâncias "
542
"serão realmente \"diferentes\" (identidade de JVM). Os conflitos são "
543
"resolvidos usando (versionamento automático) no flush/commit, usando "
544
"abordagem otimista."
547
#: transactions.xml:304
548
#, fuzzy, no-c-format
550
"This approach leaves Hibernate and the database to worry about concurrency. "
551
"It also provides the best scalability, since guaranteeing identity in single-"
552
"threaded units of work means that it does not need expensive locking or "
553
"other means of synchronization. The application does not need to synchronize "
554
"on any business object, as long as it maintains a single thread per "
555
"<literal>Session</literal>. Within a <literal>Session</literal> the "
556
"application can safely use <literal>==</literal> to compare objects."
558
"Este caminho deixa o Hibernate e o banco dedados se preocuparem com a "
559
"concorrência; também fornece uma escalabilidade melhor, garantindo que a "
560
"identidade em unidades de trabalho único-encadeadas não necessite de "
561
"bloqueio dispendioso ou de outros meios de sincronização. A aplicação nunca "
562
"necessita sincronizar qualquer objeto de negócio tão longo que transpasse "
563
"uma única thread por <literal>Session</literal>. Dentro de uma "
564
"<literal>Session</literal> a aplicação pode usar com segurança o "
565
"<literal>==</literal> para comparar objetos."
568
#: transactions.xml:313
569
#, fuzzy, no-c-format
571
"However, an application that uses <literal>==</literal> outside of a "
572
"<literal>Session</literal> might produce unexpected results. This might "
573
"occur even in some unexpected places. For example, if you put two detached "
574
"instances into the same <literal>Set</literal>, both might have the same "
575
"database identity (i.e., they represent the same row). JVM identity, "
576
"however, is by definition not guaranteed for instances in a detached state. "
577
"The developer has to override the <literal>equals()</literal> and "
578
"<literal>hashCode()</literal> methods in persistent classes and implement "
579
"their own notion of object equality. There is one caveat: never use the "
580
"database identifier to implement equality. Use a business key that is a "
581
"combination of unique, usually immutable, attributes. The database "
582
"identifier will change if a transient object is made persistent. If the "
583
"transient instance (usually together with detached instances) is held in a "
584
"<literal>Set</literal>, changing the hashcode breaks the contract of the "
585
"<literal>Set</literal>. Attributes for business keys do not have to be as "
586
"stable as database primary keys; you only have to guarantee stability as "
587
"long as the objects are in the same <literal>Set</literal>. See the "
588
"Hibernate website for a more thorough discussion of this issue. Please note "
589
"that this is not a Hibernate issue, but simply how Java object identity and "
590
"equality has to be implemented."
592
"Com tudo, uma aplicação que usa <literal>==</literal> fora de uma "
593
"<literal>Session</literal>, pode ver resultados inesperados. Isto pode "
594
"ocorrer mesmo em alguns lugares inesperados, por exemplo, se você colocar "
595
"duas instâncias desacopladas em um mesmo <literal>Set</literal>. Ambos podem "
596
"ter a mesma identidade na base de dados (isto é eles representam a mesma "
597
"linha em uma tabela), mas a identidade da JVM pela definição não garantida "
598
"para instâncias em estado desacoplado. O desenvolvedor tem que sobrescrever "
599
"os métodos <literal>equals()</literal> e <literal>hashCode()</literal> em "
600
"classes persistentes e implementar sua própria noção da igualdade do objeto. "
601
"Advertência: nunca use o identificador da base de dados para implementar a "
602
"igualdade, use atributos de negócio, uma combinação única, geralmente "
603
"imutável. O identificador da base de dados mudará se um objeto transiente "
604
"passar para o estado persistente. Se a instância transiente (geralmente "
605
"junto com instâncias desacopladas) for inserida em um <literal>Set</"
606
"literal>, mudar o hashcode quebra o contrato do <literal>Set</literal>. "
607
"Atributos para chaves de negócio não têm que ser tão estável quanto às "
608
"chaves primárias da base de dados, você somente tem que garantir a "
609
"estabilidade durante o tempo que os objetos estiverem no mesmo Set. Veja o "
610
"website do Hibernate para uma discussão mais completa sobre o assunto. Note "
611
"também que esta não é uma caracteristica do Hibernate, mas simplesmente como "
612
"a identidade e a igualdade do objeto de Java têm que ser implementadas."
615
#: transactions.xml:334
617
msgid "Common issues"
618
msgstr "Edições comuns"
621
#: transactions.xml:336
622
#, fuzzy, no-c-format
624
"Do not use the anti-patterns <emphasis>session-per-user-session</emphasis> "
625
"or <emphasis>session-per-application</emphasis> (there are, however, rare "
626
"exceptions to this rule). Some of the following issues might also arise "
627
"within the recommended patterns, so ensure that you understand the "
628
"implications before making a design decision:"
630
"Nunca use o anti-patterns <emphasis>session-per-user-session</emphasis> ou "
631
"<emphasis>session-per-application</emphasis> (naturalmente, há umas exceções "
632
"raras a essa regra). Note que algumas das seguintes edições podem também "
633
"aparecer com patterns recomendados, certifique-se que tenha compreendido as "
634
"implicações antes de fazer uma decisão de projeto:"
637
#: transactions.xml:345
638
#, fuzzy, no-c-format
640
"A <literal>Session</literal> is not thread-safe. Things that work "
641
"concurrently, like HTTP requests, session beans, or Swing workers, will "
642
"cause race conditions if a <literal>Session</literal> instance is shared. If "
643
"you keep your Hibernate <literal>Session</literal> in your "
644
"<literal>HttpSession</literal> (this is discussed later in the chapter), you "
645
"should consider synchronizing access to your Http session. Otherwise, a user "
646
"that clicks reload fast enough can use the same <literal>Session</literal> "
647
"in two concurrently running threads."
649
"Uma <literal>Session</literal> não é threadsafe. As coisas que são supostas "
650
"para trabalhar concorrentemente, como requisições HTTP, session beans, ou "
651
"Swing, causarão condições de disputa se uma instância <literal>Session</"
652
"literal> for compartilhada. Se você mantiver sua <literal>Session</literal> "
653
"do Hibernate em seu <literal>HttpSession</literal> (discutido mais tarde), "
654
"você deve considerar sincronizar o acesso a sua sessão do HTTP. Caso "
655
"contrário, um usuário que clica em reload várias muito rapidamente pode usar "
656
"o mesmo <literal>Session</literal> em duas threads executando "
660
#: transactions.xml:356
661
#, fuzzy, no-c-format
663
"An exception thrown by Hibernate means you have to rollback your database "
664
"transaction and close the <literal>Session</literal> immediately (this is "
665
"discussed in more detail later in the chapter). If your <literal>Session</"
666
"literal> is bound to the application, you have to stop the application. "
667
"Rolling back the database transaction does not put your business objects "
668
"back into the state they were at the start of the transaction. This means "
669
"that the database state and the business objects will be out of sync. "
670
"Usually this is not a problem, because exceptions are not recoverable and "
671
"you will have to start over after rollback anyway."
673
"Uma exceção lançada pelo Hibernate significa que você tem que dar rollback "
674
"na sua transação no banco de dados e fechar a <literal>Session</literal> "
675
"imediatamente (discutido mais tarde em maiores detalhes). Se sua "
676
"<literal>Session</literal> é limitado pela aplicação, você tem que parar a "
677
"aplicação. Dando rollback na transação no banco de dados não põe seus "
678
"objetos do negócio em um estado anterior que estavam no início da transação. "
679
"Isto significa que o estado da base de dados e os objetos de negócio perdem "
680
"a sincronização. Geralmente não é um problema porque as exceções não são "
681
"recuperáveis e você tem que iniciar após o rollback de qualquer maneira."
684
#: transactions.xml:368
685
#, fuzzy, no-c-format
687
"The <literal>Session</literal> caches every object that is in a persistent "
688
"state (watched and checked for dirty state by Hibernate). If you keep it "
689
"open for a long time or simply load too much data, it will grow endlessly "
690
"until you get an OutOfMemoryException. One solution is to call <literal>clear"
691
"()</literal> and <literal>evict()</literal> to manage the <literal>Session</"
692
"literal> cache, but you should consider a Stored Procedure if you need mass "
693
"data operations. Some solutions are shown in <xref linkend=\"batch\"/>. "
694
"Keeping a <literal>Session</literal> open for the duration of a user session "
695
"also means a higher probability of stale data."
697
"O <literal>Session</literal> guarda em cache cada objeto que está no estado "
698
"persistente (guardado e checado para estado \"sujo\" pelo Hibernate). Isto "
699
"significa que ele cresce infinitamente até que você obtenha uma "
700
"OutOfMemoryException, se você o mantiver aberto por muito tempo ou "
701
"simplesmente carregar dados demais. Uma solução é chamar <literal>clear()</"
702
"literal> e <literal>evict()</literal> para controlar o cache da "
703
"<literal>Session</literal>, mas você deve considerar uma Store Procedure se "
704
"precisar de operações que envolvam grande volume de dados. Algumas soluções "
705
"são mostradas no <xref linkend=\"batch\"/>. Manter uma <literal>Session</"
706
"literal> aberta durante uma sessão do usuário significa também uma "
707
"probabilidade elevada de se acabar com dados velhos."
710
#: transactions.xml:386
712
msgid "Database transaction demarcation"
713
msgstr "Demarcação de transações de bancos de dados"
716
#: transactions.xml:388
717
#, fuzzy, no-c-format
719
"Database, or system, transaction boundaries are always necessary. No "
720
"communication with the database can occur outside of a database transaction "
721
"(this seems to confuse many developers who are used to the auto-commit "
722
"mode). Always use clear transaction boundaries, even for read-only "
723
"operations. Depending on your isolation level and database capabilities this "
724
"might not be required, but there is no downside if you always demarcate "
725
"transactions explicitly. Certainly, a single database transaction is going "
726
"to perform better than many small transactions, even for reading data."
728
"Os limites de uma transação de banco de dados (ou sistema) são sempre "
729
"necessários. Nenhuma comunicação com o banco de dados pode ocorrer fora de "
730
"uma transação de banco de dados (isto parece confundir muitos "
731
"desenvolvedores que estão usados modo auto-commit). Sempre use os limites "
732
"desobstruídos da transação, até mesmo para operações somente leitura. "
733
"Dependendo de seu nível de isolamento e capacidade da base de dados isto "
734
"pode não ser requerido, mas não há nenhum aspecto negativo se você demarca "
735
"sempre transações explicitamente. Certamente, uma única transação será "
736
"melhor executada do que muitas transações pequenas, até mesmo para dados de "
740
#: transactions.xml:398
741
#, fuzzy, no-c-format
743
"A Hibernate application can run in non-managed (i.e., standalone, simple "
744
"Web- or Swing applications) and managed J2EE environments. In a non-managed "
745
"environment, Hibernate is usually responsible for its own database "
746
"connection pool. The application developer has to manually set transaction "
747
"boundaries (begin, commit, or rollback database transactions) themselves. A "
748
"managed environment usually provides container-managed transactions (CMT), "
749
"with the transaction assembly defined declaratively (in deployment "
750
"descriptors of EJB session beans, for example). Programmatic transaction "
751
"demarcation is then no longer necessary."
753
"Uma aplicação do Hibernate pode funcionar em ambientes não gerenciados (isto "
754
"é aplicações standalone, Web simples ou Swing) e ambientes gerenciados J2EE. "
755
"Em um ambiente não gerenciado, o Hibernate é geralmente responsável pelo seu "
756
"próprio pool de conexões. O desenvolvedor tem que manualmente ajustar "
757
"limites das transaçãos, ou seja, começar, commitar, ou dar rollback nas "
758
"transações ele mesmo. Um ambiente gerenciado fornece transações gerenciadas "
759
"por contêiner (CMT - container-managed transactions), com um conjunto da "
760
"transações definido declarativamente em descritores de deployment de EJB "
761
"session beans, por exemplo. A demarcação programática é então já não é "
765
#: transactions.xml:408
766
#, fuzzy, no-c-format
768
"However, it is often desirable to keep your persistence layer portable "
769
"between non-managed resource-local environments, and systems that can rely "
770
"on JTA but use BMT instead of CMT. In both cases use programmatic "
771
"transaction demarcation. Hibernate offers a wrapper API called "
772
"<literal>Transaction</literal> that translates into the native transaction "
773
"system of your deployment environment. This API is actually optional, but we "
774
"strongly encourage its use unless you are in a CMT session bean."
776
"Entretanto, é freqüentemente desejável manter sua camada de persistência "
777
"portável entre ambientes de recurso locais não gerenciados e sistemas que "
778
"podem confiar em JTA, mas usar BMT em vez de CMT. Em ambos os casos você "
779
"usaria demarcação de transação programática. O Hibernate oferece uma API "
780
"chamada Transaction que traduz dentro do sistema de transação nativa de seu "
781
"ambiente de deployment. Esta API é realmente opcional, mas nós encorajamos "
782
"fortemente seu uso a menos que você estiver em um CMT session bean."
785
#: transactions.xml:417
786
#, fuzzy, no-c-format
788
"Ending a <literal>Session</literal> usually involves four distinct phases:"
790
"Geralmente, finalizar um <literal>Session</literal>envolve quatro fases "
794
#: transactions.xml:423
796
msgid "flush the session"
797
msgstr "flush da sessão"
800
#: transactions.xml:428
802
msgid "commit the transaction"
803
msgstr "commitar a transação"
806
#: transactions.xml:433
808
msgid "close the session"
809
msgstr "fechar a sessão"
812
#: transactions.xml:438
814
msgid "handle exceptions"
815
msgstr "tratar as exceções"
818
#: transactions.xml:444
819
#, fuzzy, no-c-format
821
"We discussed Flushing the session earlier, so we will now have a closer look "
822
"at transaction demarcation and exception handling in both managed and non-"
823
"managed environments."
825
"A limpeza da sessão já foi bem discutida, agora nós daremos uma olhada na "
826
"demarcação da transação e na manipulação de exceção em ambientes controlados "
830
#: transactions.xml:451
832
msgid "Non-managed environment"
833
msgstr "Ambiente não gerenciado"
836
#: transactions.xml:453
837
#, fuzzy, no-c-format
839
"If a Hibernate persistence layer runs in a non-managed environment, database "
840
"connections are usually handled by simple (i.e., non-DataSource) connection "
841
"pools from which Hibernate obtains connections as needed. The session/"
842
"transaction handling idiom looks like this:"
844
"Se uma camada de persistência do Hibernate roda em um ambiente não "
845
"gerenciado, as conexões do banco de dados são geralmente tratadas pelos "
846
"pools de conexões simples (isto é, não baseados em DataSource) dos quais o "
847
"Hibernate obtém as conexões assim que necessita. A maneira de se manipular "
848
"uma sessão/transação é mais ou menos assim:"
850
#. Tag: programlisting
851
#: transactions.xml:460
854
"<![CDATA[// Non-managed environment idiom\n"
855
"Session sess = factory.openSession();\n"
856
"Transaction tx = null;\n"
858
" tx = sess.beginTransaction();\n"
865
"catch (RuntimeException e) {\n"
866
" if (tx != null) tx.rollback();\n"
867
" throw e; // or display error message\n"
875
#: transactions.xml:462
876
#, fuzzy, no-c-format
878
"You do not have to <literal>flush()</literal> the <literal>Session</literal> "
879
"explicitly: the call to <literal>commit()</literal> automatically triggers "
880
"the synchronization depending on the <link linkend=\"objectstate-flushing"
881
"\">FlushMode</link> for the session. A call to <literal>close()</literal> "
882
"marks the end of a session. The main implication of <literal>close()</"
883
"literal> is that the JDBC connection will be relinquished by the session. "
884
"This Java code is portable and runs in both non-managed and JTA environments."
886
"Você não pode chamar <literal>flush()</literal> do <literal>Session()</"
887
"literal> explicitamente - a chamada ao <literal>commit()</literal> dispara "
888
"automaticamente a sincronização para a sessão (dependendo do <xref linkend="
889
"\"objectstate-flushing\"> FlushMode</xref>). Uma chamada ao <literal>close()"
890
"</literal> marca o fim de uma sessão. A principal implicação do "
891
"<literal>close()</literal> é que a conexão JDBC será abandonada pela sessão. "
892
"Este código Java é portável e funciona em ambientes não gerenciado e de JTA."
895
#: transactions.xml:471
896
#, fuzzy, no-c-format
898
"As outlined earlier, a much more flexible solution is Hibernate's built-in "
899
"\"current session\" context management:"
901
"Uma solução muito mais flexível é gerência integrada de contexto da \"sessão "
902
"atual\" do Hibernate, como descrito anteriormente:"
904
#. Tag: programlisting
905
#: transactions.xml:476
908
"<![CDATA[// Non-managed environment idiom with getCurrentSession()\n"
910
" factory.getCurrentSession().beginTransaction();\n"
915
" factory.getCurrentSession().getTransaction().commit();\n"
917
"catch (RuntimeException e) {\n"
918
" factory.getCurrentSession().getTransaction().rollback();\n"
919
" throw e; // or display error message\n"
924
#: transactions.xml:478
925
#, fuzzy, no-c-format
927
"You will not see these code snippets in a regular application; fatal "
928
"(system) exceptions should always be caught at the \"top\". In other words, "
929
"the code that executes Hibernate calls in the persistence layer, and the "
930
"code that handles <literal>RuntimeException</literal> (and usually can only "
931
"clean up and exit), are in different layers. The current context management "
932
"by Hibernate can significantly simplify this design by accessing a "
933
"<literal>SessionFactory</literal>. Exception handling is discussed later in "
936
"Você muito provavelmente nunca verá estes fragmentos de código em uma "
937
"aplicação regular; as exceções fatais (do sistema) devem sempre ser pegas no "
938
"\"alto\". Ou seja, o código que executa chamadas do Hibernate (na camada de "
939
"persistência) e o código que trata <literal>RuntimeException</literal> (e "
940
"geralmente pode somente limpar acima e na saída) estão em camadas "
941
"diferentes. O gerenciamento do contexto atual feito pelo Hibernate pode "
942
"significativamente simplificar este projeto, como tudo que você necessita é "
943
"do acesso a um <literal>SessionFactory</literal>. A manipulação de exceção é "
944
"discutida mais tarde neste capítulo."
947
#: transactions.xml:488
948
#, fuzzy, no-c-format
950
"You should select <literal>org.hibernate.transaction.JDBCTransactionFactory</"
951
"literal>, which is the default, and for the second example select <literal>"
952
"\"thread\"</literal> as your <literal>hibernate."
953
"current_session_context_class</literal>."
955
"Note que você deve selecionar <literal>org.hibernate.transaction."
956
"JDBCTransactionFactory</literal> (que é o padrão) e para o segundo exemplo "
957
"<literal>\"thread\"</literal> como seu <literal>hibernate."
958
"current_session_context_class</literal>."
961
#: transactions.xml:497
967
#: transactions.xml:499
968
#, fuzzy, no-c-format
970
"If your persistence layer runs in an application server (for example, behind "
971
"EJB session beans), every datasource connection obtained by Hibernate will "
972
"automatically be part of the global JTA transaction. You can also install a "
973
"standalone JTA implementation and use it without EJB. Hibernate offers two "
974
"strategies for JTA integration."
976
"Se sua camada de persistência funcionar em um servidor de aplicação (por "
977
"exemplo, dentro dos EJB session beans), cada conexão do datasource obtida "
978
"pelo Hibernate automaticamente fará parte da transação global de JTA. Você "
979
"pode também instalar uma implementação standalone de JTA e usá-la sem EJB. O "
980
"Hibernate oferece duas estratégias para a integração de JTA."
983
#: transactions.xml:506
984
#, fuzzy, no-c-format
986
"If you use bean-managed transactions (BMT), Hibernate will tell the "
987
"application server to start and end a BMT transaction if you use the "
988
"<literal>Transaction</literal> API. The transaction management code is "
989
"identical to the non-managed environment."
991
"Se você usar bean-managed transactions (BMT - transações gerenciadas por "
992
"bean) o Hibernate dirá ao servidor de aplicação para começar e para terminar "
993
"uma transação de BMT se você usar a API Transaction. Assim, o código de "
994
"gerência de transação é idêntico ao ambiente não gerenciado."
996
#. Tag: programlisting
997
#: transactions.xml:512
1000
"<![CDATA[// BMT idiom\n"
1001
"Session sess = factory.openSession();\n"
1002
"Transaction tx = null;\n"
1004
" tx = sess.beginTransaction();\n"
1006
" // do some work\n"
1011
"catch (RuntimeException e) {\n"
1012
" if (tx != null) tx.rollback();\n"
1013
" throw e; // or display error message\n"
1021
#: transactions.xml:514
1022
#, fuzzy, no-c-format
1024
"If you want to use a transaction-bound <literal>Session</literal>, that is, "
1025
"the <literal>getCurrentSession()</literal> functionality for easy context "
1026
"propagation, use the JTA <literal>UserTransaction</literal> API directly:"
1028
"Se você quiser usar um <literal>Session</literal> limitada por transação, "
1029
"isto é, a funcionalidade do <literal>getCurrentSession()</literal> para a "
1030
"propagação fácil do contexto, você terá que usar diretamente a API JTA "
1031
"<literal>UserTransaction</literal>:"
1033
#. Tag: programlisting
1034
#: transactions.xml:520
1037
"<![CDATA[// BMT idiom with getCurrentSession()\n"
1039
" UserTransaction tx = (UserTransaction)new InitialContext()\n"
1040
" .lookup(\"java:comp/UserTransaction\");\n"
1044
" // Do some work on Session bound to transaction\n"
1045
" factory.getCurrentSession().load(...);\n"
1046
" factory.getCurrentSession().persist(...);\n"
1050
"catch (RuntimeException e) {\n"
1052
" throw e; // or display error message\n"
1057
#: transactions.xml:522
1058
#, fuzzy, no-c-format
1060
"With CMT, transaction demarcation is completed in session bean deployment "
1061
"descriptors, not programmatically. The code is reduced to:"
1063
"Com CMT, a demarcação da transação é feita em descritores de deployment do "
1064
"session beans, não programaticamente, conseqüentemente, o código é reduzido "
1067
#. Tag: programlisting
1068
#: transactions.xml:527
1071
"<![CDATA[// CMT idiom\n"
1072
" Session sess = factory.getCurrentSession();\n"
1074
" // do some work\n"
1080
#: transactions.xml:529
1081
#, fuzzy, no-c-format
1083
"In a CMT/EJB, even rollback happens automatically. An unhandled "
1084
"<literal>RuntimeException</literal> thrown by a session bean method tells "
1085
"the container to set the global transaction to rollback. <emphasis>You do "
1086
"not need to use the Hibernate <literal>Transaction</literal> API at all with "
1087
"BMT or CMT, and you get automatic propagation of the \"current\" Session "
1088
"bound to the transaction.</emphasis>"
1090
"Em um CMT/EJB mesmo um rollback acontece automaticamente, desde que uma "
1091
"exeção <literal>RuntimeException</literal> não tratável seja lançada por um "
1092
"método de um session bean que informa ao contêiner ajustar a transação "
1093
"global ao rollback. <emphasis>Isto significa que você não necessita usar a "
1094
"API <literal>Transaction</literal> do Hibernate em tudo com BMT ou CMT e "
1095
"você obtém a propagação automática do Session \"atual\" limitada à transação."
1099
#: transactions.xml:537
1100
#, fuzzy, no-c-format
1102
"When configuring Hibernate's transaction factory, choose <literal>org."
1103
"hibernate.transaction.JTATransactionFactory</literal> if you use JTA "
1104
"directly (BMT), and <literal>org.hibernate.transaction."
1105
"CMTTransactionFactory</literal> in a CMT session bean. Remember to also set "
1106
"<literal>hibernate.transaction.manager_lookup_class</literal>. Ensure that "
1107
"your <literal>hibernate.current_session_context_class</literal> is either "
1108
"unset (backwards compatibility), or is set to <literal>\"jta\"</literal>."
1110
"Veja que você deverá escolher <literal>org.hibernate.transaction."
1111
"JTATransactionFactory</literal> se você usar o JTA diretamente (BMT) e "
1112
"<literal>org.hibernate.transaction.CMTTransactionFactory</literal> em um CMT "
1113
"session bean, quando você configura a fábrica de transação do Hibernate. "
1114
"Lembre-se também de configurar o <literal>hibernate.transaction."
1115
"manager_lookup_class</literal>. Além disso, certifique-se que seu "
1116
"<literal>hibernate.current_session_context_class</literal> ou não é "
1117
"configurado (compatibilidade com o legado) ou é definido para <literal>\"jta"
1121
#: transactions.xml:546
1122
#, fuzzy, no-c-format
1124
"The <literal>getCurrentSession()</literal> operation has one downside in a "
1125
"JTA environment. There is one caveat to the use of <literal>after_statement</"
1126
"literal> connection release mode, which is then used by default. Due to a "
1127
"limitation of the JTA spec, it is not possible for Hibernate to "
1128
"automatically clean up any unclosed <literal>ScrollableResults</literal> or "
1129
"<literal>Iterator</literal> instances returned by <literal>scroll()</"
1130
"literal> or <literal>iterate()</literal>. You <emphasis>must</emphasis> "
1131
"release the underlying database cursor by calling <literal>ScrollableResults."
1132
"close()</literal> or <literal>Hibernate.close(Iterator)</literal> explicitly "
1133
"from a <literal>finally</literal> block. Most applications can easily avoid "
1134
"using <literal>scroll()</literal> or <literal>iterate()</literal> from the "
1137
"A operação <literal>getCurrentSession()</literal> tem um aspecto negativo em "
1138
"um ambiente JTA. Há uma advertência para o uso do método liberado de conexão "
1139
"<literal>after_statement</literal>, o qual é usado então por padrão. Devido "
1140
"a uma limitação simples da especificação JTA, não é possível para o "
1141
"Hibernate automaticamente limpar quaisquer instâncias "
1142
"<literal>ScrollableResults</literal> ou <literal>Iterator</literal> abertas "
1143
"retornadas pelo <literal>scroll()</literal> ou <literal>iterate()</literal>. "
1144
"Você <emphasis>deve</emphasis> liberar o cursor subjacente da base de dados "
1145
"chamando <literal>ScrollableResults.close()</literal> ou <literal>Hibernate."
1146
"close(Iterator)</literal> explicitamente de um bloco <literal>finally</"
1147
"literal>. (Claro que a maioria de aplicações podem facilmente evitar o uso "
1148
"do <literal>scroll()</literal> ou do <literal>iterate()</literal> em todo "
1149
"código provindo do JTA ou do CMT.)"
1152
#: transactions.xml:562
1154
msgid "Exception handling"
1155
msgstr "Tratamento de Exceção"
1158
#: transactions.xml:564
1159
#, fuzzy, no-c-format
1161
"If the <literal>Session</literal> throws an exception, including any "
1162
"<literal>SQLException</literal>, immediately rollback the database "
1163
"transaction, call <literal>Session.close()</literal> and discard the "
1164
"<literal>Session</literal> instance. Certain methods of <literal>Session</"
1165
"literal> will <emphasis>not</emphasis> leave the session in a consistent "
1166
"state. No exception thrown by Hibernate can be treated as recoverable. "
1167
"Ensure that the <literal>Session</literal> will be closed by calling "
1168
"<literal>close()</literal> in a <literal>finally</literal> block."
1170
"Se a <literal>Session</literal> levantar uma exceção (incluindo qualquer "
1171
"<literal>SQLException</literal>), você deve imediatamente dar um rollback na "
1172
"transação do banco, chamando <literal>Session.close()</literal> e "
1173
"descartando a instância da <literal>Session</literal>. Certos métodos da "
1174
"<literal>Session</literal><literal>não</literal> deixarão a sessão em um "
1175
"estado inconsistente. Nenhuma exceção lançada pelo Hibernate pode ser "
1176
"recuperada. Certifique-se que a <literal>Session</literal> será fechada "
1177
"chamando <literal>close()</literal> no bloco <literal>finally</literal>."
1180
#: transactions.xml:575
1181
#, fuzzy, no-c-format
1183
"The <literal>HibernateException</literal>, which wraps most of the errors "
1184
"that can occur in a Hibernate persistence layer, is an unchecked exception. "
1185
"It was not in older versions of Hibernate. In our opinion, we should not "
1186
"force the application developer to catch an unrecoverable exception at a low "
1187
"layer. In most systems, unchecked and fatal exceptions are handled in one of "
1188
"the first frames of the method call stack (i.e., in higher layers) and "
1189
"either an error message is presented to the application user or some other "
1190
"appropriate action is taken. Note that Hibernate might also throw other "
1191
"unchecked exceptions that are not a <literal>HibernateException</literal>. "
1192
"These are not recoverable and appropriate action should be taken."
1194
"A exceção <literal>HibernateException</literal>, a qual envolve a maioria "
1195
"dos erros que podem ocorrer em uma camada de persistência do Hibernate, é "
1196
"uma exceção unchecked ( não estava em umas versões mais antigas de "
1197
"Hibernate). Em nossa opinião, nós não devemos forçar o desenvolvedor a "
1198
"tratar uma exceção irrecuperável em uma camada mais baixa. Na maioria dos "
1199
"sistemas, as exceções unchecked e fatais são tratadas em um dos primeiros "
1200
"frames da pilha da chamada do método (isto é, em umas camadas mais elevadas) "
1201
"e uma mensagem de erro é apresentada ao usuário da aplicação (ou a alguma "
1202
"outra ação apropriada é feita). Note que Hibernate pode também lançar outras "
1203
"exceções unchecked que não são um <literal>HibernateException</literal>. "
1204
"Estas, também são, irrecuperáveis e uma ação apropriada deve ser tomada."
1207
#: transactions.xml:587
1208
#, fuzzy, no-c-format
1210
"Hibernate wraps <literal>SQLException</literal>s thrown while interacting "
1211
"with the database in a <literal>JDBCException</literal>. In fact, Hibernate "
1212
"will attempt to convert the exception into a more meaningful subclass of "
1213
"<literal>JDBCException</literal>. The underlying <literal>SQLException</"
1214
"literal> is always available via <literal>JDBCException.getCause()</"
1215
"literal>. Hibernate converts the <literal>SQLException</literal> into an "
1216
"appropriate <literal>JDBCException</literal> subclass using the "
1217
"<literal>SQLExceptionConverter</literal> attached to the "
1218
"<literal>SessionFactory</literal>. By default, the "
1219
"<literal>SQLExceptionConverter</literal> is defined by the configured "
1220
"dialect. However, it is also possible to plug in a custom implementation. "
1221
"See the javadocs for the <literal>SQLExceptionConverterFactory</literal> "
1222
"class for details. The standard <literal>JDBCException</literal> subtypes "
1225
"O Hibernate envolve <literal>SQLException</literal>s lançadas ao interagir "
1226
"com a base de dados em um <literal>JDBCException</literal>. Na realidade, o "
1227
"Hibernate tentará converter a exceção em em uma sub classe mais "
1228
"significativa da <literal>JDBCException</literal>. A <literal>SQLException</"
1229
"literal> subjacente está sempre disponível através de <literal>JDBCException."
1230
"getCause()</literal>. O Hibernate converte a <literal>SQLException</literal> "
1231
"em uma sub classe <literal>JDBCException</literal> apropriada usando "
1232
"<literal>SQLExceptionConverter</literal> associado ao SessionFactory. Por "
1233
"padrão, o <literal>SQLExceptionConverter</literal> é definido pelo dialeto "
1234
"configurado; entretanto, é também possível conectar em uma implementação "
1235
"customizada (veja o javadoc para mais detalhes da classe "
1236
"<literal>SQLExceptionConverterFactory</literal>). Os subtipos padrão de "
1237
"<literal>JDBCException</literal> são:"
1240
#: transactions.xml:603
1241
#, fuzzy, no-c-format
1243
"<literal>JDBCConnectionException</literal>: indicates an error with the "
1244
"underlying JDBC communication."
1246
"<literal>JDBCConnectionException</literal> - indica um erro com a "
1247
"comunicação subjacente de JDBC."
1250
#: transactions.xml:609
1251
#, fuzzy, no-c-format
1253
"<literal>SQLGrammarException</literal>: indicates a grammar or syntax "
1254
"problem with the issued SQL."
1256
"<literal>SQLGrammarException</literal> - indica um problema da gramática ou "
1257
"da sintaxe com o SQL emitido."
1260
#: transactions.xml:615
1261
#, fuzzy, no-c-format
1263
"<literal>ConstraintViolationException</literal>: indicates some form of "
1264
"integrity constraint violation."
1266
"<literal>ConstraintViolationException</literal> - indica algum forma de "
1267
"violação de confinamento de integridade."
1270
#: transactions.xml:621
1271
#, fuzzy, no-c-format
1273
"<literal>LockAcquisitionException</literal>: indicates an error acquiring a "
1274
"lock level necessary to perform the requested operation."
1276
"<literal>LockAcquisitionException</literal> - indica um erro ao adquirir um "
1277
"nível de bloqueio necessário para realizar a operação de requisição."
1280
#: transactions.xml:627
1281
#, fuzzy, no-c-format
1283
"<literal>GenericJDBCException</literal>: a generic exception which did not "
1284
"fall into any of the other categories."
1286
"<literal>GenericJDBCException</literal> - uma exceção genérica que não cai "
1287
"em algumas das outras categorias."
1290
#: transactions.xml:637
1292
msgid "Transaction timeout"
1293
msgstr "Timeout de Transação"
1296
#: transactions.xml:639
1297
#, fuzzy, no-c-format
1299
"An important feature provided by a managed environment like EJB, that is "
1300
"never provided for non-managed code, is transaction timeout. Transaction "
1301
"timeouts ensure that no misbehaving transaction can indefinitely tie up "
1302
"resources while returning no response to the user. Outside a managed (JTA) "
1303
"environment, Hibernate cannot fully provide this functionality. However, "
1304
"Hibernate can at least control data access operations, ensuring that "
1305
"database level deadlocks and queries with huge result sets are limited by a "
1306
"defined timeout. In a managed environment, Hibernate can delegate "
1307
"transaction timeout to JTA. This functionality is abstracted by the "
1308
"Hibernate <literal>Transaction</literal> object."
1310
"Uma característica extremamente importante fornecida por um ambiente "
1311
"gerenciado como EJB e que nunca é fornecido pelo código não gerenciado é o "
1312
"timeout de transação. Timeouts de transação asseguram que nenhuma transação "
1313
"possa reter indefinidamente recursos enquanto não retorna nenhuma resposta "
1314
"ao usuário. Fora de um ambiente controlado (JTA), o Hibernate não pode "
1315
"fornecer inteiramente esta funcionalidade. Entretanto, o Hibernate pode "
1316
"afinal controlar as operações do acesso a dados, assegurando que o nível de "
1317
"deadlocks e queries do banco de dados com imensos resultados definidos sejam "
1318
"limitados pelo timeout. Em um ambiente gerenciado, o Hibernate pode delegar "
1319
"o timeout da transação ao JTA. Esta funcionalidade é abstraída pelo objeto "
1320
"<literal>Transaction</literal> do Hibernate."
1322
#. Tag: programlisting
1323
#: transactions.xml:652
1327
"Session sess = factory.openSession();\n"
1329
" //set transaction timeout to 3 seconds\n"
1330
" sess.getTransaction().setTimeout(3);\n"
1331
" sess.getTransaction().begin();\n"
1333
" // do some work\n"
1336
" sess.getTransaction().commit()\n"
1338
"catch (RuntimeException e) {\n"
1339
" sess.getTransaction().rollback();\n"
1340
" throw e; // or display error message\n"
1348
#: transactions.xml:654
1349
#, fuzzy, no-c-format
1351
"<literal>setTimeout()</literal> cannot be called in a CMT bean, where "
1352
"transaction timeouts must be defined declaratively."
1354
"Veja que <literal>setTimeout()</literal> não pode ser chamado em um CMT "
1355
"bean, onde os timeouts das transações devem ser definidos declarativamente."
1358
#: transactions.xml:664
1360
msgid "Optimistic concurrency control"
1361
msgstr "Controle de concorrência otimista"
1364
#: transactions.xml:666
1365
#, fuzzy, no-c-format
1367
"The only approach that is consistent with high concurrency and high "
1368
"scalability, is optimistic concurrency control with versioning. Version "
1369
"checking uses version numbers, or timestamps, to detect conflicting updates "
1370
"and to prevent lost updates. Hibernate provides three possible approaches to "
1371
"writing application code that uses optimistic concurrency. The use cases we "
1372
"discuss are in the context of long conversations, but version checking also "
1373
"has the benefit of preventing lost updates in single database transactions."
1375
"O único caminho que é consistente com a elevada concorrência e "
1376
"escalabilidade é controle de concorrência otimista com versionamento. "
1377
"Checagem de versão usa número de versão, ou timestamps, para detectar "
1378
"conflitos de atualizações (e para impedir atualizações perdidas). O "
1379
"Hibernate fornece três caminhos possíveis para escrever aplicações que usam "
1380
"concorrência otimista. Os casos de uso que nós mostramos estão no contexto "
1381
"de conversações longas, mas a checagem de versão também tem o benefício de "
1382
"impedir atualizações perdidas em únicas transações."
1385
#: transactions.xml:677
1387
msgid "Application version checking"
1388
msgstr "Checagem de versão da aplicação"
1391
#: transactions.xml:679
1392
#, fuzzy, no-c-format
1394
"In an implementation without much help from Hibernate, each interaction with "
1395
"the database occurs in a new <literal>Session</literal> and the developer is "
1396
"responsible for reloading all persistent instances from the database before "
1397
"manipulating them. The application is forced to carry out its own version "
1398
"checking to ensure conversation transaction isolation. This approach is the "
1399
"least efficient in terms of database access. It is the approach most similar "
1402
"Em uma implementação sem muita ajuda do Hibernate, cada interação com o "
1403
"banco de dados ocorre em uma nova <literal>Session</literal> e o "
1404
"desenvolvedor é responsável para recarregar todas as instâncias persistentes "
1405
"da base de dados antes de manipulá-las. Este caminho força a aplicação a "
1406
"realizar sua própria checagem de versão para assegurar a conversação do "
1407
"isolamento da transação. Este caminho é menos eficiente em termos de acesso "
1408
"ao banco de dados. É a caminho mais similar a EJBs entity."
1410
#. Tag: programlisting
1411
#: transactions.xml:688
1414
"<![CDATA[// foo is an instance loaded by a previous Session\n"
1415
"session = factory.openSession();\n"
1416
"Transaction t = session.beginTransaction();\n"
1418
"int oldVersion = foo.getVersion();\n"
1419
"session.load( foo, foo.getKey() ); // load the current state\n"
1420
"if ( oldVersion != foo.getVersion() ) throw new StaleObjectStateException"
1422
"foo.setProperty(\"bar\");\n"
1425
"session.close();]]>"
1429
#: transactions.xml:690
1432
"The <literal>version</literal> property is mapped using <literal><"
1433
"version></literal>, and Hibernate will automatically increment it during "
1434
"flush if the entity is dirty."
1436
"A propriedade <literal>version</literal> é mapeada usando <literal><"
1437
"version></literal>, e o Hibernate vai incrementá-lo-á automaticamente "
1438
"durante o flush se a entidade estiver alterada."
1441
#: transactions.xml:696
1442
#, fuzzy, no-c-format
1444
"If you are operating in a low-data-concurrency environment, and do not "
1445
"require version checking, you can use this approach and skip the version "
1446
"check. In this case, <emphasis>last commit wins</emphasis> is the default "
1447
"strategy for long conversations. Be aware that this might confuse the users "
1448
"of the application, as they might experience lost updates without error "
1449
"messages or a chance to merge conflicting changes."
1451
"Claro, se você se estiver operando em um ambiente de baixa concorrência de "
1452
"dados e não requerer a checagem de versão, você pode usar este caminho e "
1453
"apenas saltar a checagem de versão. Nesse caso, o <emphasis>ultimo commit "
1454
"realizdo </emphasis> é a estratégia padrão para suas conversações longas. "
1455
"Mantenha em mente que isto pode confundir os usuários da aplicação, assim "
1456
"como eles podem experimentar atualizações perdidas sem mensagens de erro ou "
1457
"uma possibilidade ajustar mudanças de conflito."
1460
#: transactions.xml:705
1461
#, fuzzy, no-c-format
1463
"Manual version checking is only feasible in trivial circumstances and not "
1464
"practical for most applications. Often not only single instances, but "
1465
"complete graphs of modified objects, have to be checked. Hibernate offers "
1466
"automatic version checking with either an extended <literal>Session</"
1467
"literal> or detached instances as the design paradigm."
1469
"Claro que, checagem manual da versão é somente praticável em circunstâncias "
1470
"triviais e não para a maioria de aplicações. Freqüentemente, os grafos "
1471
"completos de objetos modificados têm que ser verificados, não somente únicas "
1472
"instâncias. O Hibernate oferece checagem de versão automática com uma "
1473
"<literal>Session</literal> estendida ou instâncias desatachadas como o "
1474
"paradigma do projeto."
1477
#: transactions.xml:716
1479
msgid "Extended session and automatic versioning"
1480
msgstr "Sessão estendida e versionamento automático"
1483
#: transactions.xml:718
1484
#, fuzzy, no-c-format
1486
"A single <literal>Session</literal> instance and its persistent instances "
1487
"that are used for the whole conversation are known as <emphasis>session-per-"
1488
"conversation</emphasis>. Hibernate checks instance versions at flush time, "
1489
"throwing an exception if concurrent modification is detected. It is up to "
1490
"the developer to catch and handle this exception. Common options are the "
1491
"opportunity for the user to merge changes or to restart the business "
1492
"conversation with non-stale data."
1494
"Uma única instância de <literal>Session</literal> e suas instâncias "
1495
"persistentes são usadas para a conversação inteira, isto é conhecido como "
1496
"<emphasis>session-per-conversation</emphasis>. O Hibernate verifica versões "
1497
"da instância no momento dio flush, lançando uma exceção se a modificação "
1498
"concorrente for detectada. Até o desenvolvedor pegar e tratar essa exceção "
1499
"(as opções comuns são a oportunidade para que o usuário intercale as "
1500
"mudanças ou reinicie a conversação do negócio com dados não antigos)."
1503
#: transactions.xml:727
1504
#, fuzzy, no-c-format
1506
"The <literal>Session</literal> is disconnected from any underlying JDBC "
1507
"connection when waiting for user interaction. This approach is the most "
1508
"efficient in terms of database access. The application does not version "
1509
"check or reattach detached instances, nor does it have to reload instances "
1510
"in every database transaction."
1512
"The <literal>Session</literal> is disconnected from any underlying JDBC "
1513
"connection when waiting for user interaction. This approach is the most "
1514
"efficient in terms of database access. The application need not concern "
1515
"itself with version checking or with reattaching detached instances, nor "
1516
"does it have to reload instances in every database transaction. A "
1517
"<literal>Session</literal> é desconectada de toda a conexão JDBC subjacente "
1518
"enquanto espera a interação do usuário. Este caminho é a mais eficiente em "
1519
"termos de acesso a bancos de dados. A aplicação não necessita concernir-se "
1520
"com a checagem de versão ou com as instâncias destacadas reatadas, nem tem "
1521
"que recarregar instâncias em cada transação."
1523
#. Tag: programlisting
1524
#: transactions.xml:735
1527
"<![CDATA[// foo is an instance loaded earlier by the old session\n"
1528
"Transaction t = session.beginTransaction(); // Obtain a new JDBC connection, "
1529
"start transaction\n"
1531
"foo.setProperty(\"bar\");\n"
1533
"session.flush(); // Only for last transaction in conversation\n"
1534
"t.commit(); // Also return JDBC connection\n"
1535
"session.close(); // Only for last transaction in conversation]]>"
1539
#: transactions.xml:736
1540
#, fuzzy, no-c-format
1542
"The <literal>foo</literal> object knows which <literal>Session</literal> it "
1543
"was loaded in. Beginning a new database transaction on an old session "
1544
"obtains a new connection and resumes the session. Committing a database "
1545
"transaction disconnects a session from the JDBC connection and returns the "
1546
"connection to the pool. After reconnection, to force a version check on data "
1547
"you are not updating, you can call <literal>Session.lock()</literal> with "
1548
"<literal>LockMode.READ</literal> on any objects that might have been updated "
1549
"by another transaction. You do not need to lock any data that you "
1550
"<emphasis>are</emphasis> updating. Usually you would set <literal>FlushMode."
1551
"MANUAL</literal> on an extended <literal>Session</literal>, so that only the "
1552
"last database transaction cycle is allowed to actually persist all "
1553
"modifications made in this conversation. Only this last database transaction "
1554
"will include the <literal>flush()</literal> operation, and then "
1555
"<literal>close()</literal> the session to end the conversation."
1557
"O objeto <literal>foo</literal> sabe que <literal>Session</literal> já foi "
1558
"carregada. Começando uma nova transação em uma sessão velha obtém uma "
1559
"conexão nova e recomeça a sessão. Commitando uma transação desconecta uma "
1560
"sessão da conexão JDBC e retorna a conexão ao pool. Após a reconexão, forçar "
1561
"uma checagem de versão em dados que você não está atualizando, você pode "
1562
"chamar <literal>Session.lock()</literal> com o <literal>LockMode.READ</"
1563
"literal> em todos os objetos que possam ter sido atualizados por uma outra "
1564
"transação. Você não necessita bloquear nenhum dado para atualizar. "
1565
"Geralmente você configuraria <literal>FlushMode.MANUAL</literal> em uma "
1566
"<literal>Session</literal> estendida, de modo que somente o último ciclo da "
1567
"transação tenha permissão de persistir todas as modificações feitas nesta "
1568
"conversação. Disso, somente esta última transação incluiria a operação "
1569
"<literal>flush()</literal> e então chamar também <literal>close()</literal> "
1570
"da sessão para terminar a conversação."
1573
#: transactions.xml:751
1574
#, fuzzy, no-c-format
1576
"This pattern is problematic if the <literal>Session</literal> is too big to "
1577
"be stored during user think time (for example, an <literal>HttpSession</"
1578
"literal> should be kept as small as possible). As the <literal>Session</"
1579
"literal> is also the first-level cache and contains all loaded objects, we "
1580
"can probably use this strategy only for a few request/response cycles. Use a "
1581
"<literal>Session</literal> only for a single conversation as it will soon "
1584
"Este pattern é problemático se a <literal>Session</literal> for "
1585
"demasiadamente grande para ser armazenado durante o tempo que usuário "
1586
"pensar, por exemplo um <literal>HttpSession</literal> estiver mantido tão "
1587
"pequeno quanto possível. Como o <literal>Session</literal> é também cache de "
1588
"primeiro nível (imperativo) e contém todos os objetos carregados, nós "
1589
"podemos provavelmente usar esta estratégia somente para alguns ciclos de "
1590
"requisição/resposta. Você deve usar a <literal>Session</literal> somente "
1591
"para uma única conversação, porque ela logo também estará com dados velhos."
1594
#: transactions.xml:762
1600
#: transactions.xml:763
1601
#, fuzzy, no-c-format
1603
"Earlier versions of Hibernate required explicit disconnection and "
1604
"reconnection of a <literal>Session</literal>. These methods are deprecated, "
1605
"as beginning and ending a transaction has the same effect."
1607
"(Note que versões mais atuais de Hibernate requerem a desconexão e o "
1608
"reconexão explícitas de uma <literal>Session</literal>. Estes métodos são "
1609
"desatualizados, como o início e término de uma transação tem o mesmo efeito.)"
1612
#: transactions.xml:769
1613
#, fuzzy, no-c-format
1615
"Keep the disconnected <literal>Session</literal> close to the persistence "
1616
"layer. Use an EJB stateful session bean to hold the <literal>Session</"
1617
"literal> in a three-tier environment. Do not transfer it to the web layer, "
1618
"or even serialize it to a separate tier, to store it in the "
1619
"<literal>HttpSession</literal>."
1621
"Note também que você deve manter a <literal>Session</literal> desconectada "
1622
"fechada para a camada de persistência. Ou seja, use um EJB stateful session "
1623
"bean para prender a <literal>Session</literal> em um ambiente do três "
1624
"camadas e não o transferir à camada web (ou até serializá-lo para uma camada "
1625
"separada) para armazená-lo no <literal>HttpSession</literal>."
1628
#: transactions.xml:777
1629
#, fuzzy, no-c-format
1631
"The extended session pattern, or <emphasis>session-per-conversation</"
1632
"emphasis>, is more difficult to implement with automatic current session "
1633
"context management. You need to supply your own implementation of the "
1634
"<literal>CurrentSessionContext</literal> for this. See the Hibernate Wiki "
1637
"O pattern sessão estendida, ou <emphasis>session-per-conversation</"
1638
"emphasis>, é mais difícil de implementar com gerenciamento automático de "
1639
"sessão atual. Você precisa fornecer sua própria implementação do "
1640
"<literal>CurrentSessionContext</literal> para isto (veja o Hibernate Wiki "
1644
#: transactions.xml:787
1646
msgid "Detached objects and automatic versioning"
1647
msgstr "Objetos destacados e versionamento automático"
1650
#: transactions.xml:789
1653
"Each interaction with the persistent store occurs in a new <literal>Session</"
1654
"literal>. However, the same persistent instances are reused for each "
1655
"interaction with the database. The application manipulates the state of "
1656
"detached instances originally loaded in another <literal>Session</literal> "
1657
"and then reattaches them using <literal>Session.update()</literal>, "
1658
"<literal>Session.saveOrUpdate()</literal>, or <literal>Session.merge()</"
1661
"Cada interação com o armazenamento persistente ocorre em uma "
1662
"<literal>Session</literal> nova. Entretanto, as mesmas instâncias "
1663
"persistentes são reusadas para cada interação com o banco de dados. A "
1664
"aplicação manipula o estado das instâncias desatachadas originalmente "
1665
"carregadas em um outro <literal>Session</literal> e reata-os então usando "
1666
"<literal>Session.update()</literal>, <literal>Session.saveOrUpdate()</"
1667
"literal> ou <literal>Session.merge()</literal>."
1669
#. Tag: programlisting
1670
#: transactions.xml:797
1673
"<![CDATA[// foo is an instance loaded by a previous Session\n"
1674
"foo.setProperty(\"bar\");\n"
1675
"session = factory.openSession();\n"
1676
"Transaction t = session.beginTransaction();\n"
1677
"session.saveOrUpdate(foo); // Use merge() if \"foo\" might have been loaded "
1680
"session.close();]]>"
1684
#: transactions.xml:799
1685
#, fuzzy, no-c-format
1687
"Again, Hibernate will check instance versions during flush, throwing an "
1688
"exception if conflicting updates occurred."
1690
"Outra vez, o Hibernate verificará versões da instância durante o flush, "
1691
"lançando uma exceção se ocorrer conflitos de atualizações."
1694
#: transactions.xml:804
1695
#, fuzzy, no-c-format
1697
"You can also call <literal>lock()</literal> instead of <literal>update()</"
1698
"literal>, and use <literal>LockMode.READ</literal> (performing a version "
1699
"check and bypassing all caches) if you are sure that the object has not been "
1702
"Você pode também chamar o <literal>lock()</literal> em vez de <literal>update"
1703
"()</literal> e usar <literal>LockMode.READ</literal> (executando uma "
1704
"checagem de versão, ignorando todos os caches) se você estiver certo de que "
1705
"o objeto não foi modificado."
1708
#: transactions.xml:813
1710
msgid "Customizing automatic versioning"
1711
msgstr "Versionamento automático customizado"
1714
#: transactions.xml:815
1715
#, fuzzy, no-c-format
1717
"You can disable Hibernate's automatic version increment for particular "
1718
"properties and collections by setting the <literal>optimistic-lock</literal> "
1719
"mapping attribute to <literal>false</literal>. Hibernate will then no longer "
1720
"increment versions if the property is dirty."
1722
"Você pode desabilitar o incremento da versão automática de Hibernate para "
1723
"propriedades e coleções particulares configurando o mapeamento do atributo "
1724
"<literal>optimistic-lock</literal> para false. O Hibernate então não irá "
1725
"incrementa versões se a propriedade estiver modificada."
1728
#: transactions.xml:822
1729
#, fuzzy, no-c-format
1731
"Legacy database schemas are often static and cannot be modified. Or, other "
1732
"applications might access the same database and will not know how to handle "
1733
"version numbers or even timestamps. In both cases, versioning cannot rely on "
1734
"a particular column in a table. To force a version check with a comparison "
1735
"of the state of all fields in a row but without a version or timestamp "
1736
"property mapping, turn on <literal>optimistic-lock=\"all\"</literal> in the "
1737
"<literal><class></literal> mapping. This conceptually only works if "
1738
"Hibernate can compare the old and the new state (i.e., if you use a single "
1739
"long <literal>Session</literal> and not session-per-request-with-detached-"
1742
"Os esquemas da base de dados legada são freqüentemente estáticos e não podem "
1743
"ser modificados. Ou outras aplicações puderam também acessar a mesma base de "
1744
"dados e não sabem tratar a versão dos números ou timestamps. Em ambos os "
1745
"casos, o versionamento não pode confiar em uma coluna particular em uma "
1746
"tabela. Para forçar uma checagem de versão sem uma versão ou mapeamento da "
1747
"propriedade do timestamp com uma comparação do estado de todos os campos em "
1748
"uma linha, configure <literal>optimistic-lock=\"all\"</literal> no "
1749
"mapeamento <literal><class></literal>. Note que isto conceitualmente é "
1750
"somente feito em trabalhos se Hibernate puder comparar o estado velho e "
1751
"novo, isto é, se você usa um único <literal>Session</literal> longo e não "
1752
"session-per-request-with-detached-objects."
1755
#: transactions.xml:834
1756
#, fuzzy, no-c-format
1758
"Concurrent modification can be permitted in instances where the changes that "
1759
"have been made do not overlap. If you set <literal>optimistic-lock=\"dirty"
1760
"\"</literal> when mapping the <literal><class></literal>, Hibernate "
1761
"will only compare dirty fields during flush."
1763
"Às vezes a modificação concorrente pode ser permitida tão longa quanto às "
1764
"mudanças que tiveram sido feitas que não sobrepuseram. Se você configurar "
1765
"<literal>optimistic-lock=\"dirty\"</literal> ao mapear o <literal><"
1766
"class></literal>, o Hibernate comparará somente campos modificados "
1770
#: transactions.xml:840
1771
#, fuzzy, no-c-format
1773
"In both cases, with dedicated version/timestamp columns or with a full/dirty "
1774
"field comparison, Hibernate uses a single <literal>UPDATE</literal> "
1775
"statement, with an appropriate <literal>WHERE</literal> clause, per entity "
1776
"to execute the version check and update the information. If you use "
1777
"transitive persistence to cascade reattachment to associated entities, "
1778
"Hibernate may execute unnecessary updates. This is usually not a problem, "
1779
"but <emphasis>on update</emphasis> triggers in the database might be "
1780
"executed even when no changes have been made to detached instances. You can "
1781
"customize this behavior by setting <literal>select-before-update=\"true\"</"
1782
"literal> in the <literal><class></literal> mapping, forcing Hibernate "
1783
"to <literal>SELECT</literal> the instance to ensure that changes did occur "
1784
"before updating the row."
1786
"Em ambos os casos, com as colunas dedicadas da versão/timestamp ou com "
1787
"comparação do campo cheio/modificados, o Hibernate usa uma única declaração "
1788
"UPDATE (com uma cláusula WHERE apropriada ) por entidade para executar a "
1789
"checagem da versão e atualizar a informação. Se você usa a persistência "
1790
"transitiva para cascatear o reatamento das entidades associadas, o Hibernate "
1791
"pode executar atualizações desnecessárias. Isso não é geralmente um "
1792
"problema, mas triggers <emphasis>on update</emphasis> em um banco de dados "
1793
"podem ser executados mesmo quando nenhuma mudança foi feita nas instâncias "
1794
"destacadas. Você pode customizar este comportamento configurando "
1795
"<literal>select-before-update=\"true\"</literal> no mapeamento <literal><"
1796
"class></literal>, forçando o Hibernate a dá um SELECT nas instâncias para "
1797
"assegurar-se esse as mudanças ocorreram realmente, antes de atualizar a "
1801
#: transactions.xml:858
1802
#, fuzzy, no-c-format
1803
msgid "Pessimistic locking"
1804
msgstr "Locking pessimista"
1807
#: transactions.xml:860
1808
#, fuzzy, no-c-format
1810
"It is not intended that users spend much time worrying about locking "
1811
"strategies. It is usually enough to specify an isolation level for the JDBC "
1812
"connections and then simply let the database do all the work. However, "
1813
"advanced users may wish to obtain exclusive pessimistic locks or re-obtain "
1814
"locks at the start of a new transaction."
1816
"Não se pretende que os usuários gastam muitas horas se preocupando com suas "
1817
"estratégias de locking. Geralmente é o bastante para especificar um nível de "
1818
"isolamento para as conexões JDBC e então deixar simplesmente o banco de "
1819
"dados fazer todo o trabalho. Entretanto, os usuários avançados podem às "
1820
"vezes desejar obter locks pessimistas exclusivos, ou re-obter locks no "
1821
"início de uma nova transação."
1824
#: transactions.xml:867
1825
#, fuzzy, no-c-format
1827
"Hibernate will always use the locking mechanism of the database; it never "
1828
"lock objects in memory."
1830
"O Hibernate usará sempre o mecanismo de lock da base de dados, nunca trava "
1831
"objetos na memória!"
1834
#: transactions.xml:872
1835
#, fuzzy, no-c-format
1837
"The <literal>LockMode</literal> class defines the different lock levels that "
1838
"can be acquired by Hibernate. A lock is obtained by the following mechanisms:"
1840
"A classe <literal>LockMode</literal> define os diferentes níveis de lock que "
1841
"o Hibernate pode adquirir. Um lock é obtido pelos seguintes mecanismos:"
1844
#: transactions.xml:879
1847
"<literal>LockMode.WRITE</literal> is acquired automatically when Hibernate "
1848
"updates or inserts a row."
1850
"<literal>LockMode.WRITE</literal> é adquirido automaticamente quando o "
1851
"Hibernate atualiza ou insere uma linha."
1854
#: transactions.xml:885
1855
#, fuzzy, no-c-format
1857
"<literal>LockMode.UPGRADE</literal> can be acquired upon explicit user "
1858
"request using <literal>SELECT ... FOR UPDATE</literal> on databases which "
1859
"support that syntax."
1861
"<literal>LockMode.UPGRADE</literal> pode ser adquirido explicitamente pelo "
1862
"usuário usando <literal>SELECT ... FOR UPDATE</literal> em um banco de dados "
1863
"que suporte esse sintaxe."
1866
#: transactions.xml:891
1867
#, fuzzy, no-c-format
1869
"<literal>LockMode.UPGRADE_NOWAIT</literal> can be acquired upon explicit "
1870
"user request using a <literal>SELECT ... FOR UPDATE NOWAIT</literal> under "
1873
"<literal>LockMode.UPGRADE_NOWAIT</literal> pode ser adquirido explicitamente "
1874
"pelo usuário usando <literal>SELECT ... FOR UPDATE NOWAIT</literal> no "
1878
#: transactions.xml:897
1879
#, fuzzy, no-c-format
1881
"<literal>LockMode.READ</literal> is acquired automatically when Hibernate "
1882
"reads data under Repeatable Read or Serializable isolation level. It can be "
1883
"re-acquired by explicit user request."
1885
"<literal>LockMode.READ</literal> é adquirido automaticamente quando o "
1886
"Hibernate lê dados em um nível Repeatable Read ou Serializable isolation. "
1887
"Pode ser readquirido explicitamente pelo usuário."
1890
#: transactions.xml:904
1893
"<literal>LockMode.NONE</literal> represents the absence of a lock. All "
1894
"objects switch to this lock mode at the end of a <literal>Transaction</"
1895
"literal>. Objects associated with the session via a call to <literal>update()"
1896
"</literal> or <literal>saveOrUpdate()</literal> also start out in this lock "
1899
"<literal>LockMode.NONE</literal> representa a ausência do lock. Todos os "
1900
"objetos mudam para esse estado de lock no final da <literal>Transaction</"
1901
"literal>. Objetos associados com a sessão através do método <literal>update()"
1902
"</literal> ou <literal>saveOrUpdate()</literal> também são inicializados com "
1906
#: transactions.xml:913
1909
"The \"explicit user request\" is expressed in one of the following ways:"
1911
"O lock obtido \"explicitamente pelo usuário\" se dá em uma das seguintes "
1915
#: transactions.xml:919
1918
"A call to <literal>Session.load()</literal>, specifying a <literal>LockMode</"
1921
"Uma chamada a <literal>Session.load()</literal>, especificando o "
1922
"<literal>LockMode</literal>."
1925
#: transactions.xml:924
1927
msgid "A call to <literal>Session.lock()</literal>."
1928
msgstr "Uma chamada a <literal>Session.lock()</literal>."
1931
#: transactions.xml:929
1933
msgid "A call to <literal>Query.setLockMode()</literal>."
1934
msgstr "Uma chamada a <literal>Query.setLockMode()</literal>."
1937
#: transactions.xml:935
1940
"If <literal>Session.load()</literal> is called with <literal>UPGRADE</"
1941
"literal> or <literal>UPGRADE_NOWAIT</literal>, and the requested object was "
1942
"not yet loaded by the session, the object is loaded using "
1943
"<literal>SELECT ... FOR UPDATE</literal>. If <literal>load()</literal> is "
1944
"called for an object that is already loaded with a less restrictive lock "
1945
"than the one requested, Hibernate calls <literal>lock()</literal> for that "
1948
"Se uma <literal>Session.load()</literal> é invocada com <literal>UPGRADE</"
1949
"literal> ou <literal>UPGRADE_NOWAIT</literal>, e o objeto requisitado ainda "
1950
"não foi carregado pela sessão, o objeto é carregado usando "
1951
"<literal>SELECT ... FOR UPDATE</literal>. Se <literal>load()</literal> for "
1952
"chamado para um objeto que já foi carregado com um lock menos restritivo que "
1953
"o novo lock solicitado, o Hibernate invoca o método <literal>lock()</"
1954
"literal> para aquele objeto."
1957
#: transactions.xml:944
1958
#, fuzzy, no-c-format
1960
"<literal>Session.lock()</literal> performs a version number check if the "
1961
"specified lock mode is <literal>READ</literal>, <literal>UPGRADE</literal> "
1962
"or <literal>UPGRADE_NOWAIT</literal>. In the case of <literal>UPGRADE</"
1963
"literal> or <literal>UPGRADE_NOWAIT</literal>, <literal>SELECT ... FOR "
1964
"UPDATE</literal> is used."
1966
"O método <literal>Session.lock()</literal> executa uma verificação no número "
1967
"da versão se o modo de lock especificado for <literal>READ</literal>, "
1968
"<literal>UPGRADE</literal> ou <literal>UPGRADE_NOWAIT</literal>.. (No caso "
1969
"do <literal>UPGRADE</literal> ou <literal>UPGRADE_NOWAIT</literal>, é usado "
1970
"<literal>SELECT ... FOR UPDATE</literal>.)"
1973
#: transactions.xml:951
1974
#, fuzzy, no-c-format
1976
"If the requested lock mode is not supported by the database, Hibernate uses "
1977
"an appropriate alternate mode instead of throwing an exception. This ensures "
1978
"that applications are portable."
1980
"Se o banco de dados não suportar o lock mode solicitado, o Hibernate vai "
1981
"usar um modo alternativo apropriado (ao invés de lançar uma exceção). Isso "
1982
"garante que a aplicação vai ser portável."
1985
#: transactions.xml:960
1986
#, fuzzy, no-c-format
1987
msgid "Connection release modes"
1988
msgstr "Modos de liberar a Connection"
1991
#: transactions.xml:962
1992
#, fuzzy, no-c-format
1994
"One of the legacies of Hibernate 2.x JDBC connection management meant that a "
1995
"<literal>Session</literal> would obtain a connection when it was first "
1996
"required and then maintain that connection until the session was closed. "
1997
"Hibernate 3.x introduced the notion of connection release modes that would "
1998
"instruct a session how to handle its JDBC connections. The following "
1999
"discussion is pertinent only to connections provided through a configured "
2000
"<literal>ConnectionProvider</literal>. User-supplied connections are outside "
2001
"the breadth of this discussion. The different release modes are identified "
2002
"by the enumerated values of <literal>org.hibernate.ConnectionReleaseMode</"
2005
"O comportamento legado do Hibernate (2.x) em consideração ao gerenciamento "
2006
"da conexão via JDBC fez com que a <literal>Session</literal> precisasse "
2007
"obter uma conexão quando ela precisasse pela primeira vez e depois manter a "
2008
"conexão enquanto a sessão não fosse fechada. O Hibernate 3.x introduz a "
2009
"idéia de modos de liberar a sessão, para informar a sessão a forma como deve "
2010
"manusear a sua conexão JDBC. Veja que essa discussão só é pertinente para "
2011
"conexões fornecidas com um <literal>ConnectionProvider</literal> "
2012
"configurado; conexões fornecidas pelo usuário estão fora do escopo dessa "
2013
"discussão. Os diferentes modos de liberação estão definidos pelos valores da "
2014
"enumeração <literal>org.hibernate.ConnectionReleaseMode</literal>:"
2017
#: transactions.xml:976
2018
#, fuzzy, no-c-format
2020
"<literal>ON_CLOSE</literal>: is the legacy behavior described above. The "
2021
"Hibernate session obtains a connection when it first needs to perform some "
2022
"JDBC access and maintains that connection until the session is closed."
2024
"<literal>ON_CLOSE</literal> - essencialmente é o modo legado descrito acima. "
2025
"A sessão do Hibernate obtêm a conexão quando precisar executar alguma "
2026
"operação JDBC pela primeira vez e mantem enquanto a conexão não for fechada."
2029
#: transactions.xml:983
2030
#, fuzzy, no-c-format
2032
"<literal>AFTER_TRANSACTION</literal>: releases connections after a "
2033
"<literal>org.hibernate.Transaction</literal> has been completed."
2035
"<literal>AFTER_TRANSACTION</literal> – informa que a conexão deve ser "
2036
"liberada após a conclusão de uma <literal>org.hibernate.Transaction</"
2040
#: transactions.xml:989
2041
#, fuzzy, no-c-format
2043
"<literal>AFTER_STATEMENT</literal> (also referred to as aggressive release): "
2044
"releases connections after every statement execution. This aggressive "
2045
"releasing is skipped if that statement leaves open resources associated with "
2046
"the given session. Currently the only situation where this occurs is through "
2047
"the use of <literal>org.hibernate.ScrollableResults</literal>."
2049
"<literal>AFTER_STATEMENT</literal> (também conhecida com liberação "
2050
"agressiva) – informa que a conexão deve ser liberada após a execução de cada "
2051
"statement. A liberação agressiva não ocorre se o statement deixa pra trás "
2052
"algum recurso aberto associado com a sessão obtida; atualmente, a única "
2053
"situação em que isso é possível é com o uso de <literal>org.hibernate."
2054
"ScrollableResults</literal>."
2057
#: transactions.xml:999
2058
#, fuzzy, no-c-format
2060
"The configuration parameter <literal>hibernate.connection.release_mode</"
2061
"literal> is used to specify which release mode to use. The possible values "
2064
"O parâmetro de configuração <literal>hibernate.connection.release_mode</"
2065
"literal> é usado para especificar qual modo de liberação deve ser usado. "
2066
"Opções disponíveis:"
2069
#: transactions.xml:1006
2070
#, fuzzy, no-c-format
2072
"<literal>auto</literal> (the default): this choice delegates to the release "
2073
"mode returned by the <literal>org.hibernate.transaction.TransactionFactory."
2074
"getDefaultReleaseMode()</literal> method. For JTATransactionFactory, this "
2075
"returns ConnectionReleaseMode.AFTER_STATEMENT; for JDBCTransactionFactory, "
2076
"this returns ConnectionReleaseMode.AFTER_TRANSACTION. Do not change this "
2077
"default behavior as failures due to the value of this setting tend to "
2078
"indicate bugs and/or invalid assumptions in user code."
2080
"<literal>auto</literal> (padrão) – essa opção delega ao modo de liberação "
2081
"retornado pelo método <literal>org.hibernate.transaction.TransactionFactory."
2082
"getDefaultReleaseMode()</literal>. Para JTATransactionFactory, ele retorna "
2083
"ConnectionReleaseMode.AFTER_STATEMENT; para JDBCTransactionFactory, ele "
2084
"retorna ConnectionReleaseMode.AFTER_TRANSACTION. Raramente é uma boa idéia "
2085
"alterar padrão, como frequencia ao se fazer isso temos falhas que parecem "
2086
"bugs e/ou suposições inválidas no código do usuário."
2089
#: transactions.xml:1016
2090
#, fuzzy, no-c-format
2092
"<literal>on_close</literal>: uses ConnectionReleaseMode.ON_CLOSE. This "
2093
"setting is left for backwards compatibility, but its use is discouraged."
2095
"<literal>on_close</literal> - indica o uso da ConnectionReleaseMode."
2096
"ON_CLOSE. Essa opção foi deixada para manter a compatibilidade, mas seu uso "
2097
"é fortemente desencorajado."
2100
#: transactions.xml:1022
2101
#, fuzzy, no-c-format
2103
"<literal>after_transaction</literal>: uses ConnectionReleaseMode."
2104
"AFTER_TRANSACTION. This setting should not be used in JTA environments. Also "
2105
"note that with ConnectionReleaseMode.AFTER_TRANSACTION, if a session is "
2106
"considered to be in auto-commit mode, connections will be released as if the "
2107
"release mode were AFTER_STATEMENT."
2109
"<literal>after_transaction</literal> – indica o uso da ConnectionReleaseMode."
2110
"AFTER_TRANSACTION. Essa opção nada deve ser usada com ambientes JTA. Também "
2111
"note que no caso da ConnectionReleaseMode.AFTER_TRANSACTION, se a sessão foi "
2112
"colocada no modo auto-commit a conexão vai ser liberada de forma similar ao "
2113
"modo AFTER_STATEMENT."
2116
#: transactions.xml:1030
2117
#, fuzzy, no-c-format
2119
"<literal>after_statement</literal>: uses ConnectionReleaseMode."
2120
"AFTER_STATEMENT. Additionally, the configured <literal>ConnectionProvider</"
2121
"literal> is consulted to see if it supports this setting "
2122
"(<literal>supportsAggressiveRelease()</literal>). If not, the release mode "
2123
"is reset to ConnectionReleaseMode.AFTER_TRANSACTION. This setting is only "
2124
"safe in environments where we can either re-acquire the same underlying JDBC "
2125
"connection each time you make a call into <literal>ConnectionProvider."
2126
"getConnection()</literal> or in auto-commit environments where it does not "
2127
"matter if we re-establish the same connection."
2129
"<literal>after_statement</literal> – indica o uso ConnectionReleaseMode."
2130
"AFTER_STATEMENT. Adicionalmente, o <literal>ConnectionProvider</literal> "
2131
"configurado é consultado para verificar se suporta essa configuração "
2132
"((<literal>supportsAggressiveRelease()</literal>). Se não suportar, o modo "
2133
"de liberação é redefinido como ConnectionRelease-Mode.AFTER_TRANSACTION. "
2134
"Essa configuração só é segura em ambientes onde podemos readquirir a mesma "
2135
"conexão JDBC toda vez que o método <literal>ConnectionProvider.getConnection"
2136
"()</literal> for chamado ou em um ambiente auto-commit onde não importa se "
2137
"nós recuperamos a mesma conexão."