📄 transactions.po
字号:
"However, an application that uses <literal>==</literal> outside of a ""<literal>Session</literal>, might see unexpected results. This might occur ""even in some unexpected places, for example, if you put two detached ""instances into the same <literal>Set</literal>. Both might have the same ""database identity (i.e. they represent the same row), but JVM identity is by ""definition not guaranteed for instances in detached state. The developer has ""to override the <literal>equals()</literal> and <literal>hashCode()</""literal> methods in persistent classes and implement his own notion of ""object equality. There is one caveat: Never use the database identifier to ""implement equality, use a business key, a combination of unique, usually ""immutable, attributes. The database identifier will change if a transient ""object is made persistent. If the transient instance (usually together with ""detached instances) is held in a <literal>Set</literal>, changing the ""hashcode breaks the contract of the <literal>Set</literal>. Attributes for ""business keys don't have to be as stable as database primary keys, you only ""have to guarantee stability as long as the objects are in the same ""<literal>Set</literal>. See the Hibernate website for a more thorough ""discussion of this issue. Also note that this is not a Hibernate issue, but ""simply how Java object identity and equality has to be implemented."msgstr """Com tudo, uma aplicação que usa <literal>==</literal> fora de uma ""<literal>Session</literal>, pode ver resultados inesperados. Isto pode ""ocorrer mesmo em alguns lugares inesperados, por exemplo, se você colocar ""duas instâncias desacopladas em um mesmo <literal>Set</literal>. Ambos podem ""ter a mesma identidade na base de dados (isto é eles representam a mesma ""linha em uma tabela), mas a identidade da JVM pela definição não garantida ""para instâncias em estado desacoplado. O desenvolvedor tem que sobrescrever ""os métodos <literal>equals()</literal> e <literal>hashCode()</literal> em ""classes persistentes e implementar sua própria noção da igualdade do objeto. ""Advertência: nunca use o identificador da base de dados para implementar a ""igualdade, use atributos de negócio, uma combinação única, geralmente ""imutável. O identificador da base de dados mudará se um objeto transiente ""passar para o estado persistente. Se a instância transiente (geralmente ""junto com instâncias desacopladas) for inserida em um <literal>Set</""literal>, mudar o hashcode quebra o contrato do <literal>Set</literal>. ""Atributos para chaves de negócio não têm que ser tão estável quanto às ""chaves primárias da base de dados, você somente tem que garantir a ""estabilidade durante o tempo que os objetos estiverem no mesmo Set. Veja o ""website do Hibernate para uma discussão mais completa sobre o assunto. Note ""também que esta não é uma caracteristica do Hibernate, mas simplesmente como ""a identidade e a igualdade do objeto de Java têm que ser implementadas."#. Tag: title#: transactions.xml:296#, no-c-formatmsgid "Common issues"msgstr "Edições comuns"#. Tag: para#: transactions.xml:298#, no-c-formatmsgid """Never use the anti-patterns <emphasis>session-per-user-session</emphasis> or ""<emphasis>session-per-application</emphasis> (of course, there are rare ""exceptions to this rule). Note that some of the following issues might also ""appear with the recommended patterns, make sure you understand the ""implications before making a design decision:"msgstr """Nunca use o anti-patterns <emphasis>session-per-user-session</emphasis> ou ""<emphasis>session-per-application</emphasis> (naturalmente, há umas exceções ""raras a essa regra). Note que algumas das seguintes edições podem também ""aparecer com patterns recomendados, certifique-se que tenha compreendido as ""implicações antes de fazer uma decisão de projeto:"#. Tag: para#: transactions.xml:307#, no-c-formatmsgid """A <literal>Session</literal> is not thread-safe. Things which are supposed ""to work concurrently, like HTTP requests, session beans, or Swing workers, ""will cause race conditions if a <literal>Session</literal> instance would be ""shared. If you keep your Hibernate <literal>Session</literal> in your ""<literal>HttpSession</literal> (discussed later), you should consider ""synchronizing access to your Http session. Otherwise, a user that clicks ""reload fast enough may use the same <literal>Session</literal> in two ""concurrently running threads."msgstr """Uma <literal>Session</literal> não é threadsafe. As coisas que são supostas ""para trabalhar concorrentemente, como requisições HTTP, session beans, ou ""Swing, causarão condições de disputa se uma instância <literal>Session</""literal> for compartilhada. Se você mantiver sua <literal>Session</literal> ""do Hibernate em seu <literal>HttpSession</literal> (discutido mais tarde), ""você deve considerar sincronizar o acesso a sua sessão do HTTP. Caso ""contrário, um usuário que clica em reload várias muito rapidamente pode usar ""o mesmo <literal>Session</literal> em duas threads executando ""concorrentemente."#. Tag: para#: transactions.xml:318#, no-c-formatmsgid """An exception thrown by Hibernate means you have to rollback your database ""transaction and close the <literal>Session</literal> immediately (discussed ""later in more detail). If your <literal>Session</literal> is bound to the ""application, you have to stop the application. Rolling back the database ""transaction doesn't put your business objects back into the state they were ""at the start of the transaction. This means the database state and the ""business objects do get out of sync. Usually this is not a problem, because ""exceptions are not recoverable and you have to start over after rollback ""anyway."msgstr """Uma exceção lançada pelo Hibernate significa que você tem que dar rollback ""na sua transação no banco de dados e fechar a <literal>Session</literal> ""imediatamente (discutido mais tarde em maiores detalhes). Se sua ""<literal>Session</literal> é limitado pela aplicação, você tem que parar a ""aplicação. Dando rollback na transação no banco de dados não põe seus ""objetos do negócio em um estado anterior que estavam no início da transação. ""Isto significa que o estado da base de dados e os objetos de negócio perdem ""a sincronização. Geralmente não é um problema porque as exceções não são ""recuperáveis e você tem que iniciar após o rollback de qualquer maneira."#. Tag: para#: transactions.xml:330#, no-c-formatmsgid """The <literal>Session</literal> caches every object that is in persistent ""state (watched and checked for dirty state by Hibernate). This means it ""grows endlessly until you get an OutOfMemoryException, if you keep it open ""for a long time or simply load too much data. One solution for this is to ""call <literal>clear()</literal> and <literal>evict()</literal> to manage the ""<literal>Session</literal> cache, but you most likely should consider a ""Stored Procedure if you need mass data operations. Some solutions are shown ""in <xref linkend=\"batch\"/>. Keeping a <literal>Session</literal> open for ""the duration of a user session also means a high probability of stale data."msgstr """O <literal>Session</literal> guarda em cache cada objeto que está no estado ""persistente (guardado e checado para estado \"sujo\" pelo Hibernate). Isto ""significa que ele cresce infinitamente até que você obtenha uma ""OutOfMemoryException, se você o mantiver aberto por muito tempo ou ""simplesmente carregar dados demais. Uma solução é chamar <literal>clear()</""literal> e <literal>evict()</literal> para controlar o cache da ""<literal>Session</literal>, mas você deve considerar uma Store Procedure se ""precisar de operações que envolvam grande volume de dados. Algumas soluções ""são mostradas no <xref linkend=\"batch\"/>. Manter uma <literal>Session</""literal> aberta durante uma sessão do usuário significa também uma ""probabilidade elevada de se acabar com dados velhos."#. Tag: title#: transactions.xml:348#, no-c-formatmsgid "Database transaction demarcation"msgstr "Demarcação de transações de bancos de dados"#. Tag: para#: transactions.xml:350#, no-c-formatmsgid """Datatabase (or system) transaction boundaries are always necessary. No ""communication with the database can occur outside of a database transaction ""(this seems to confuse many developers who are used to the auto-commit ""mode). Always use clear transaction boundaries, even for read-only ""operations. Depending on your isolation level and database capabilities this ""might not be required but there is no downside if you always demarcate ""transactions explicitly. Certainly, a single database transaction is going ""to perform better than many small transactions, even for reading data."msgstr """Os limites de uma transação de banco de dados (ou sistema) são sempre ""necessários. Nenhuma comunicação com o banco de dados pode ocorrer fora de ""uma transação de banco de dados (isto parece confundir muitos ""desenvolvedores que estão usados modo auto-commit). Sempre use os limites ""desobstruídos da transação, até mesmo para operações somente leitura. ""Dependendo de seu nível de isolamento e capacidade da base de dados isto ""pode não ser requerido, mas não há nenhum aspecto negativo se você demarca ""sempre transações explicitamente. Certamente, uma única transação será ""melhor executada do que muitas transações pequenas, até mesmo para dados de ""leitura."#. Tag: para#: transactions.xml:360#, no-c-formatmsgid """A Hibernate application can run in non-managed (i.e. standalone, simple Web- ""or Swing applications) and managed J2EE environments. In a non-managed ""environment, Hibernate is usually responsible for its own database ""connection pool. The application developer has to manually set transaction ""boundaries, in other words, begin, commit, or rollback database transactions ""himself. A managed environment usually provides container-managed ""transactions (CMT), with the transaction assembly defined declaratively in ""deployment descriptors of EJB session beans, for example. Programmatic ""transaction demarcation is then no longer necessary."msgstr """Uma aplicação do Hibernate pode funcionar em ambientes não gerenciados (isto ""é aplicações standalone, Web simples ou Swing) e ambientes gerenciados J2EE. ""Em um ambiente não gerenciado, o Hibernate é geralmente responsável pelo seu ""próprio pool de conexões. O desenvolvedor tem que manualmente ajustar ""limites das transaçãos, ou seja, começar, commitar, ou dar rollback nas ""transações ele mesmo. Um ambiente gerenciado fornece transações gerenciadas ""por contêiner (CMT - container-managed transactions), com um conjunto da ""transações definido declarativamente em descritores de deployment de EJB ""session beans, por exemplo. A demarcação programática é então já não é ""necessário."#. Tag: para#: transactions.xml:370#, no-c-formatmsgid """However, it is often desirable to keep your persistence layer portable ""between non-managed resource-local environments, and systems that can rely ""on JTA but use BMT instead of CMT. In both cases you'd use programmatic ""transaction demaracation. Hibernate offers a wrapper API called ""<literal>Transaction</literal> that translates into the native transaction ""system of your deployment environment. This API is actually optional, but we ""strongly encourage its use unless you are in a CMT session bean."msgstr """Entretanto, é freqüentemente desejável manter sua camada de persistência ""portável entre ambientes de recurso locais não gerenciados e sistemas que ""podem confiar em JTA, mas usar BMT em vez de CMT. Em ambos os casos você ""usaria demarcação de transação programática. O Hibernate oferece uma API ""chamada Transaction que traduz dentro do sistema de transação nativa de seu ""ambiente de deployment. Esta API é realmente opcional, mas nós encorajamos ""fortemente seu uso a menos que você estiver em um CMT session bean."#. Tag: para#: transactions.xml:379#, no-c-formatmsgid """Usually, ending a <literal>Session</literal> involves four distinct phases:"msgstr """Geralmente, finalizar um <literal>Session</literal>envolve quatro fases ""distintas:"#. Tag: para#: transactions.xml:385#, no-c-formatmsgid "flush the session"msgstr "flush da sessão"#. Tag: para#: transactions.xml:390#, no-c-formatmsgid "commit the transaction"msgstr "commitar a transação"#. Tag: para#: transactions.xml:395#, no-c-formatmsgid "close the session"msgstr "fechar a sessão"#. Tag: para#: transactions.xml:400#, no-c-formatmsgid "handle exceptions"msgstr "tratar as exceções"#. Tag: para#: transactions.xml:406#, no-c-formatmsgid """Flushing the session has been discussed earlier, we'll now have a closer ""look at transaction demarcation and exception handling in both managed- and ""non-managed environments."msgstr """A limpeza da sessão já foi bem discutida, agora nós daremos uma olhada na ""demarcação da transação e na manipulação de exceção em ambientes controlados ""e não controlados."#. Tag: title#: transactions.xml:413#, no-c-formatmsgid "Non-managed environment"msgstr "Ambiente não gerenciado"#. Tag: para#: transactions.xml:415#, no-c-formatmsgid """If a Hibernate persistence layer runs in a non-managed environment, database ""connections are usually handled by simple (i.e. non-DataSource) connection ""pools from which Hibernate obtains connections as needed. The session/""transaction handling idiom looks like this:"msgstr """Se uma camada de persistência do Hibernate roda em um ambiente não ""gerenciado, as conexões do banco de dados são geralmente tratadas pelos ""pools de conexões simples (isto é, não baseados em DataSource) dos quais o ""Hibernate obtém as conexões assim que necessita. A maneira de se manipular ""uma sessão/transação é mais ou menos assim:"#. Tag: programlisting#: transactions.xml:422
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -