Hibernate.orgCommunity Documentation
O diagrama abaixo fornece uma visão de altíssimo nível da arquitetura do Hibernate:
Nós não temos o escopo neste documento para mostrar uma visão mais detalhada da arquitetura em execução. O Hibernate é muito flexível e suporta várias abordagens. Mostraremos os dois extremos. No entanto, nós apresentaremos os dois extremos: arquitetura "mínima" e arquitetura "compreensiva".
Este diagrama mostra o Hibernate usando o banco de dados e a configuração de dados para prover persistência de serviços e persistência de objetos para o aplicativo.
Na arquitetura "mínima", o aplicativo fornece suas próprias conexões JDBC e gerencia suas transações. Esta abordagem usa o mínimo de subconjuntos das APIs do Hibernate:
A arquitetura "compreensiva" abstrai a aplicação do JDBC/JTA e APIs adjacentes e deixa o Hibernate tomar conta dos detalhes.
Algumas definições dos objetos descritos nos diagramas:
org.hibernate.SessionFactory
)O threadsafe, cachê imutável composto de mapeamentos compilados para um único banco de dados. Uma fábrica para Session
e um cliente de ConnectionProvider
, SessionFactory
pode conter um cachê opcional de dados (segundo nível) reutilizáveis entre transações, no nível de processo ou cluster.
org.hibernate.Session
)Objeto single-threaded, de vida curta, representa uma conversação entre o aplicativo e o armazenamento persistente. Cria uma camada sobre uma conexão JDBC. É uma fabrica de Transaction
. A Session
possui um cachê obrigatório (primeiro nível) de objetos persistentes, usado para navegação nos gráficos de objetos e pesquisa de objetos pelo identificador.
Objetos, de vida curta, single threaded contendo estado persistente e função de negócios. Esses podem ser JavaBeans/POJOs, onde a única coisa especial sobre eles é que são associados a (exatamente uma) Session
. Quando a Session
é fechada, eles são separados e liberados para serem usados dentro de qualquer camada da aplicação (Ex. diretamente como objetos de transferência de dados de e para a camada de apresentação).
Instâncias de classes persistentes que ainda não estão associadas a uma Session
. Eles podem ter sido instanciados pela aplicação e não persistidos (ainda) ou eles foram instanciados por uma Session
encerrada.
org.hibernate.Transaction
)(Opcional) Objeto de vida curta, single threaded, usado pela aplicação para especificar unidades atômicas de trabalho. Abstrai o aplicativo das transações JDBC, JTA ou CORBA adjacentes. Uma Session
pode, em alguns casos, iniciar várias Transaction
s. Entretanto, a demarcação da transação, mesmo utilizando API ou Transaction
subjacentes, nunca é opcional.
org.hibernate.connection.ConnectionProvider
)(Opcional) Uma fábrica de, e pool de, conexões JDBC. Abstrai a aplicação dos Datasource
ou DriverManager
adjacentes. Não exposto para a aplicação, mas pode ser implementado ou estendido pelo programador.
org.hibernate.TransactionFactory
)(Opcional) Uma fábrica para instâncias de Transaction
. Não exposta a aplicação, mas pode ser estendida/implementada pelo programador.
O Hibernate oferece várias opções de interfaces estendidas que você pode implementar para customizar sua camada persistente. Veja a documentação da API para maiores detalhes.
Dada uma arquitetura "mínima", o aplicativo passa pelas APIs Transaction
/TransactionFactory
e/ou ConnectionProvider
para se comunicar diretamente com a transação JTA ou JDBC.
Uma instância de classes persistentes pode estar em um dos três diferentes estados, que são definidos respeitando um contexto persistente. O objeto Session
do Hibernate é o contexto persistente. Os três diferentes estados são os seguintes:
A instância não é associada a nenhum contexto persistente. Não possui uma identidade persistente ou valor de chave primária.
A instância está atualmente associada a um contexto persistente. Possui uma identidade persistente (valor de chave primária) e, talvez, correspondente a uma fila no banco de dados. Para um contexto persistente em particular, o Hibernate garante que a identidade persistente é equivalente à identidade Java (na localização em memória do objeto).
A instância foi associada com um contexto persistente, porém este contexto foi fechado, ou a instância foi serializada por outro processo. Possui uma identidade persistente, e, talvez, corresponda a uma fila no banco de dados. Para instâncias desanexadas, o Hibernate não garante o relacionamento entre identidade persistente e identidade Java.
JMX é o padrão do J2EE para manipulação de componentes Java. O Hibernate pode ser manipulado por um serviço JMX padrão. Nós fornecemos uma implementação do MBean na distribuição: org.hibernate.jmx.HibernateService
.
Para um exemplo de como implementar o Hibernate como um serviço JMX em um Servidor de Aplicativo JBoss, por favor, consulte o Guia do Usuário do JBoss. No JBoss As, você poderá ver os benefícios de se fazer a implementação usando JMX:
Session Management: O ciclo de vida de uma Session
do Hibernate pode ser automaticamente conectada a um escopo de transação JTA. Isso significa que você não precisará mais abrir e fechar manualmente uma Session
, isso se torna uma tarefa para um interceptor EJB do JBoss. Você também não precisará mais se preocupar com demarcação de transação em seu código (caso você prefira escrever uma camada persistente portável, use a API opcional do Hibernate Transaction
). Você deve chamar HibernateContext
para acessar uma Session
.
HAR deployment:: Normalmente você implementa o serviço JMX do Hibernate usando um serviço descritor de implementação do JBoss em um EAR e/ou arquivo SAR, que suporta todas as configurações comuns de uma SessionFactory
do Hibernate. Entretanto, você ainda precisa nomear todos os seus arquivos de mapeamento no descritor de implementação. Se você decidir usar a implementaçao opcional HAR, o JBoss irá automaticamente detectar todos os seus arquivos de mapeamento no seu arquivo HAR.
Consulte o manual do usuário do JBoss AS, para obter maiores informações sobre essas opções.
Another feature available as a JMX service is runtime Hibernate statistics. See Seção 3.4.6, “Estatísticas do Hibernate” for more information.
O Hibernate pode também ser configurado como um conector JCA. Por favor, visite o website para maiores detalhes. Observe também, que o suporte do JCA do Hibernate ainda é considerado experimental.
A maioria das aplicações que usa o Hibernate necessita de algum tipo de sessão "contextual", onde uma sessão dada é na verdade um escopo de um contexto. Entretanto, através de aplicações, a definição sobre um contexto é geralmente diferente; e contextos diferentes definem escopos diferentes. Aplicações usando versões anteriores ao Hibernate 3.0 tendem a utilizar tanto sessões contextuais baseadas em ThreadLocal
, classes utilitárias como HibernateUtil
, ou utilizar frameworks de terceiros (como Spring ou Pico) que provê sessões contextuais baseadas em proxy.
A partir da versão 3.0.1, o Hibernate adicionou o método SessionFactory.getCurrentSession()
. Inicialmente, este considerou o uso de transações JTA
, onde a transação JTA
definia tanto o escopo quanto o contexto de uma sessão atual. Dada a maturidade de diversas implementações autônomas disponíveis do JTA TransactionManager
, a maioria (se não todos) dos aplicativos deveria utilizar o gerenciador de transações JTA
sendo ou não instalados dentro de um recipiente J2EE
. Baseado neste recurso, você deve sempre utilizar sessões contextuais baseadas em JTA
.
Entretanto, a partir da versão 3.1, o processo por trás do método SessionFactory.getCurrentSession()
é agora plugável. Com isso, uma nova interface (org.hibernate.context.CurrentSessionContext
) e um novo parâmetro de configuração (hibernate.current_session_context_class
) foram adicionados para possibilitar a compatibilidade do contexto e do escopo na definição de sessões correntes.
Consulte no Javadocs sobre a interface org.hibernate.context.CurrentSessionContext
para uma discussão detalhada. Ela define um método único, currentSession()
, pelo qual a implementação é responsável por rastrear a sessão contextual atual. Fora da caixa, o Hibernate surge com três implementações dessa interface:
org.hibernate.context.JTASessionContext
: As sessões correntes são rastreadas e recebem um escopo por uma transação JTA
. O processamento aqui é exatamente igual à abordagem anterior do JTA somente. Consulte em Javadocs para maiores detalhes.
org.hibernate.context.ThreadLocalSessionContext
- As sessões correntes são rastreadas por uma thread de execução. Novamente, consulte em Javadocs para maiores detalhes.
org.hibernate.context.ManagedSessionContext
. As sessões atuais são rastreadas por uma thread de execução. Entretanto, você é responsável por vincular e desvincular uma instância Session
com métodos estáticos nesta classe, que nunca abre, libera ou fecha uma Session
.
The first two implementations provide a "one session - one database transaction" programming model. This is also known and used as session-per-request. The beginning and end of a Hibernate session is defined by the duration of a database transaction. If you use programmatic transaction demarcation in plain JSE without JTA, you are advised to use the Hibernate Transaction
API to hide the underlying transaction system from your code. If you use JTA, you can utilize the JTA interfaces to demarcate transactions. If you execute in an EJB container that supports CMT, transaction boundaries are defined declaratively and you do not need any transaction or session demarcation operations in your code. Refer to Capítulo 12, Transações e Concorrência for more information and code examples.
O parâmetro de configuração hibernate.current_session_context_class
define qual implementação org.hibernate.context.CurrentSessionContext
deve ser usada. Note que para compatibilidade anterior, se este parâmetro de configuração não for determinado mas um org.hibernate.transaction.TransactionManagerLookup
for configurado, Hibernate usará o org.hibernate.context.JTASessionContext
. Tipicamente, o valor deste parâmetro nomearia apenas a classe de implementação para usar; para as três implementações fora da caixa, entretanto, há dois pequenos nomes correspondentes, "jta", "thread", e "managed".
Copyright © 2004 Red Hat, Inc.